ЛР-02: Запчасти на ремонтные базы#
Student notebook: military 02#
Этот notebook предназначен для самостоятельного решения.
Готового оптимального плана и заполненного решателя здесь нет.
1. Зачем нужен этот кейс#
На ремонтные базы нужно доставить больше комплектов, чем сейчас есть на складах.
После этого notebook-а студент должен уметь:
замечать дефицит снабжения до запуска solver-а;
вводить фиктивного поставщика для балансировки;
фиксировать смысл неудовлетворённого спроса в выводе;
аккуратно интерпретировать полученную матрицу перевозок.
2. Исходные данные#
Тип задачи: открытая, спрос больше, чем запасов.
Запасы#
Поставщик |
Объём |
|---|---|
Склад A |
25 |
Склад B |
30 |
Склад C |
20 |
Спрос#
Потребитель |
Объём |
|---|---|
Рембаза 1 |
15 |
Рембаза 2 |
20 |
Рембаза 3 |
18 |
Рембаза 4 |
30 |
Матрица затрат#
Откуда / Куда |
Рембаза 1 |
Рембаза 2 |
Рембаза 3 |
Рембаза 4 |
|---|---|---|---|---|
Склад A |
7 |
5 |
9 |
11 |
Склад B |
6 |
4 |
7 |
8 |
Склад 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([25, 30, 20], dtype=float)
demands = np.array([15, 20, 18, 30], dtype=float)
costs = np.array([[7, 5, 9, 11], [6, 4, 7, 8], [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.[ ] Я отличаю реальные маршруты от фиктивного узла.
[ ] Я объяснил полученный план простыми словами.