ЛР-03: Бюджет логистической готовности#

Student notebook: military 01#

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

Готовых численных ответов и заполненного sensitivity-разбора здесь нет.

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

Ресурсы нужно распределить между четырьмя направлениями логистической готовности.

После выполнения работы студент должен уметь:

  1. переносить duality-анализ в военный ресурсный сценарий;

  2. искать реальные узкие места в системе обеспечения;

  3. проверять сильную двойственность численно;

  4. объяснять, почему одна программа вытесняет другую.

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

Ограничения ресурсов#

Ресурс

Лимит

Бюджет

94

Личный состав

56

Техническая ёмкость

48

Программы#

Программа

Эффект

Бюджет

Трудозатраты

Операционная ёмкость

Резерв мобильных складов

86

34

16

15

Подготовка водителей снабжения

72

22

18

10

Комплекты перегрузочного оборудования

78

28

14

13

Усиление распределительных узлов

93

46

24

21

3. Что нужно сделать#

  1. Запишите прямую модель через переменные масштабов программ.

  2. Подготовьте c, A_ub, b_ub, bounds для linprog.

  3. Определите активные ограничения и запас ресурса.

  4. Кратко запишите двойственную модель.

  5. Проведите минимум два сценария по b и один сценарий по c.

  6. Сравните прогноз по теневой цене с фактическим пересчётом.

import numpy as np
from scipy.optimize import linprog

effects = np.array([86, 72, 78, 93], dtype=float)
A_ub = np.array([[34, 22, 28, 46], [16, 18, 14, 24], [15, 10, 13, 21]], dtype=float)
b_ub = np.array([94, 56, 48], dtype=float)
bounds = [(0, 1)] * len(effects)

print('Число программ =', len(effects))
print('Число ресурсных ограничений =', len(b_ub))

4. Шаблон для самостоятельной сборки решения#

Сначала решите прямую задачу, потом переходите к binding/slack, dual и sensitivity.

# TODO: подготовьте задачу максимизации через минимизацию отрицательной цели.
c = None
result = None
shadow_prices = None
slack = None

# TODO: после своей попытки решите модель и заполните анализ.
# result = linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=bounds, method='highs')
# shadow_prices = -result.ineqlin.marginals
# slack = result.slack

5. Что должно быть в отчёте#

  1. Прямая постановка задачи.

  2. Оптимальный план по программам.

  3. Таблица активных ограничений и запасов.

  4. Таблица теневых цен ресурсов.

  5. Проверка сильной двойственности.

  6. Минимум два сценария по b и один по c.

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

  • [ ] Я показал, какие ограничения стали binding.

  • [ ] Я осмысленно интерпретировал shadow prices.

  • [ ] Я сравнил прогноз и фактический пересчёт.

  • [ ] Я сформулировал управленческий вывод по самому дефицитному ресурсу.