ЛР-02: Топливо для частей#
Student notebook: military 01#
Этот notebook предназначен для самостоятельного решения.
Готового оптимального плана и заполненного решателя здесь нет.
1. Зачем нужен этот кейс#
Три базы снабжения распределяют топливо между четырьмя частями.
После этого notebook-а студент должен уметь:
читать военный логистический сценарий как обычную транспортную модель;
не путать физический объём топлива и стоимость маршрута;
проверять допустимость плана по каждой базе и каждой части;
интерпретировать, почему solver выбирает именно эти направления.
2. Исходные данные#
Тип задачи: закрытая.
Запасы#
Поставщик |
Объём |
|---|---|
База A |
50 |
База B |
40 |
База C |
35 |
Спрос#
Потребитель |
Объём |
|---|---|
Часть 1 |
30 |
Часть 2 |
25 |
Часть 3 |
35 |
Часть 4 |
35 |
Матрица затрат#
Откуда / Куда |
Часть 1 |
Часть 2 |
Часть 3 |
Часть 4 |
|---|---|---|---|---|
База A |
6 |
7 |
9 |
12 |
База B |
5 |
4 |
8 |
10 |
База C |
8 |
6 |
5 |
7 |
3. Что нужно сделать#
Проверьте баланс запасов и спроса.
Если задача открытая, добавьте фиктивный узел и поясните его смысл.
Запишите математическую модель через переменные \(x_{ij}\).
Сформируйте
c,A_eq,b_eq,boundsдляlinprog.После собственной попытки решите задачу через Python.
Кратко объясните, какие маршруты оказались ключевыми.
import numpy as np
from scipy.optimize import linprog
supplies = np.array([50, 40, 35], dtype=float)
demands = np.array([30, 25, 35, 35], dtype=float)
costs = np.array([[6, 7, 9, 12], [5, 4, 8, 10], [8, 6, 5, 7]], dtype=float)
print('sum supply =', supplies.sum())
print('sum demand =', demands.sum())
4. Шаблон для самостоятельной сборки модели#
Сначала аккуратно сбалансируйте задачу, а потом переходите к linprog.
Не подставляйте готовый ответ до своей попытки.
# TODO: при необходимости добавьте фиктивного поставщика или потребителя.
balanced_supplies = supplies.copy()
balanced_demands = demands.copy()
balanced_costs = costs.copy()
# TODO: заполните элементы транспортной модели.
c = None
A_eq = None
b_eq = None
bounds = None
# TODO: только после заполнения модели запускайте solver.
# result = linprog(c, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method='highs')
# plan = result.x.reshape(len(balanced_supplies), len(balanced_demands))
5. Что должно быть в отчёте#
Таблица исходных данных и проверка баланса.
Математическая постановка транспортной задачи.
Пояснение, нужен ли фиктивный узел.
Проверка через
linprog.Содержательная интерпретация ненулевых маршрутов.
6. Контрольный чек-лист#
[ ] Я сам проверил баланс до запуска solver-а.
[ ] Я осмысленно собрал
A_eqиb_eq.[ ] Я отличаю реальные маршруты от фиктивного узла.
[ ] Я объяснил полученный план простыми словами.