Эта программа решает транспортные задачи - класс задач линейного программирования, связанных с оптимальным распределением грузов между поставщиками и потребителями при минимизации транспортных расходов.
Программа реализует полный цикл решения: получение начального плана тремя различными методами, выбор лучшего из них и оптимизацию методом потенциалов (MODI).
- Северо-западный угол - простой и быстрый метод
- Минимальный элемент - выбирает клетки с наименьшими тарифами
- Фогеля - более сложный, но часто дающий лучшее начальное решение
- Метод потенциалов (MODI) - итеративное улучшение плана до оптимального
- Автоматическая балансировка - добавление фиктивных поставщиков/потребителей
- Обнаружение альтернативных оптимумов
- «Тетрадный» формат таблиц - наглядное представление как на листе бумаги
- Пошаговые вычисления - показ всех промежуточных шагов оптимизации
- Потенциалы и оценки - отображение u_i, v_j и матрицы ΔC
- Подробная формула стоимости - разложение целевой функции
- Откройте файл
transport.py - Измените блок
INPUT_DATAпод свою задачу:SUPPLY = [200, 450, 250] # объемы поставок (фабрики) DEMAND = [100, 125, 325, 250, 100] # потребности (магазины) COSTS = [ # матрица тарифов перевозки [5, 8, 7, 10, 3], [4, 2, 2, 5, 6], [7, 3, 5, 9, 2], ]
- Запустите программу:
python3 transport.py
Программа поддерживает выбор начального плана для метода потенциалов (MODI), что влияет на количество шагов оптимизации и на промежуточные таблицы:
--start BEST— использовать лучшее из трёх начальных решений (по умолчанию)--start NW— стартовать с метода северо‑западного угла--start MIN— стартовать с метода минимального элемента--start VOGEL— стартовать с метода Фогеля
Примеры запуска:
# Лучший из трёх (по умолчанию)
python3 transport.py
# Явно задать старт NW, чтобы совпасть со стилем конспекта с большим числом шагов
python3 transport.py --start NW
# Старт с минимального элемента
python3 transport.py --start MINТакже можно зафиксировать старт через константу в начале transport.py:
POTENTIALS_START = 'BEST' # или 'NW' | 'MIN' | 'VOGEL'- Под каждой таблицей выводятся равенства базисных клеток вида
u₁ + V₁ = 5. - Затем печатаются матрицы:
Cₖ = u ⊕ V— сумма потенциалов по всем клеткам;ΔCₖ = C − (u ⊕ V)— приведённые затраты.
- Нумерация шагов:
k = 1, 2, ….
Программа решает задачу вида:
min F = Σᵢⱼ cᵢⱼ × xᵢⱼ
при ограничениях:
Σⱼ xᵢⱼ = aᵢ (поставки от i-го поставщика)
Σᵢ xᵢⱼ = bⱼ (потребности j-го потребителя)
xᵢⱼ ≥ 0 (неотрицательность перевозок)
где:
aᵢ- объем поставки i-го поставщикаbⱼ- потребность j-го потребителяcᵢⱼ- стоимость перевозки единицы груза от i к jxᵢⱼ- количество груза для перевозки от i к j
Условие: 3 фабрики производят кондитерские изделия, 5 магазинов нуждаются в продукции. Найти план перевозок с минимальными транспортными расходами.
Данные:
- Производство: a₁=200, a₂=450, a₃=250
- Потребности: b₁=100, b₂=125, b₃=325, b₄=250, b₅=100
- Тарифы указаны в матрице C
Программа выводит:
- Проверку сбалансированности задачи
- Начальные планы всеми тремя методами с расчетом стоимости
- Выбор лучшего начального плана
- Пошаговую оптимизацию методом потенциалов:
- Таблицы с потенциалами u_i, v_j
- Матрицы приведенных затрат ΔC
- Циклы пересчета при улучшении плана
- Итоговый оптимальный план и минимальную стоимость
- Альтернативные оптимумы (если есть)
- Автоматическая балансировка: если сумма поставок ≠ сумме потребностей, добавляется фиктивный поставщик/потребитель с нулевыми тарифами
- Обеспечение базисности: автоматическое добавление нулевых базисных клеток для получения остовного дерева
- Точность вычислений: работа с целыми числами для избежания ошибок округления
- Универсальность: код работает для любых размеров m×n
- Python 3.6+
- Стандартная библиотека (dataclasses, typing, itertools, collections)
Программа предназначена для изучения транспортных задач и демонстрации различных подходов к их решению. Подробный вывод всех промежуточных вычислений делает процесс решения наглядным и понятным для образовательных целей.