ЛР-02: Топливо для частей#

Student notebook: military 01#

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

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

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

Три базы снабжения распределяют топливо между четырьмя частями.

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

  1. читать военный логистический сценарий как обычную транспортную модель;

  2. не путать физический объём топлива и стоимость маршрута;

  3. проверять допустимость плана по каждой базе и каждой части;

  4. интерпретировать, почему 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. Что нужно сделать#

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

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

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

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

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

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

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

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

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

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

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