ЛР-02: Школьное питание#

Student notebook: civil 02#

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

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

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

Три комбината развозят питание по школам, но общий запас больше общего спроса.

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

  1. видеть небаланс сразу по суммам запасов и спроса;

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

  3. аккуратно расширять матрицу затрат;

  4. отделять реальные маршруты от фиктивного остатка.

2. Исходные данные#

Тип задачи: открытая, запасов больше, чем спроса.

Запасы#

Поставщик

Объём

Комбинат A

40

Комбинат B

35

Комбинат C

30

Спрос#

Потребитель

Объём

Школа 1

20

Школа 2

25

Школа 3

30

Школа 4

15

Матрица затрат#

Откуда / Куда

Школа 1

Школа 2

Школа 3

Школа 4

Комбинат A

4

6

8

7

Комбинат B

5

4

7

6

Комбинат C

6

5

4

8

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([40, 35, 30], dtype=float)
demands = np.array([20, 25, 30, 15], dtype=float)
costs = np.array([[4, 6, 8, 7], [5, 4, 7, 6], [6, 5, 4, 8]], 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.

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

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