ЛР-02: Запчасти на ремонтные базы#

Student notebook: military 02#

Этот notebook предназначен для самостоятельного решения.

Готового оптимального плана и заполненного решателя здесь нет.

1. Зачем нужен этот кейс#

На ремонтные базы нужно доставить больше комплектов, чем сейчас есть на складах.

После этого notebook-а студент должен уметь:

  1. замечать дефицит снабжения до запуска solver-а;

  2. вводить фиктивного поставщика для балансировки;

  3. фиксировать смысл неудовлетворённого спроса в выводе;

  4. аккуратно интерпретировать полученную матрицу перевозок.

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. Что нужно сделать#

  1. Проверьте баланс запасов и спроса.

  2. Если задача открытая, добавьте фиктивный узел и поясните его смысл.

  3. Запишите математическую модель через переменные \(x_{ij}\).

  4. Сформируйте c, A_eq, b_eq, bounds для linprog.

  5. После собственной попытки решите задачу через Python.

  6. Кратко объясните, какие маршруты оказались ключевыми.

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. Что должно быть в отчёте#

  1. Таблица исходных данных и проверка баланса.

  2. Математическая постановка транспортной задачи.

  3. Пояснение, нужен ли фиктивный узел.

  4. Проверка через linprog.

  5. Содержательная интерпретация ненулевых маршрутов.

6. Контрольный чек-лист#

  • [ ] Я сам проверил баланс до запуска solver-а.

  • [ ] Я осмысленно собрал A_eq и b_eq.

  • [ ] Я отличаю реальные маршруты от фиктивного узла.

  • [ ] Я объяснил полученный план простыми словами.