ЛР-03: Социальная защита в зимний период#

Student notebook: civil 02#

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

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

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

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

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

  1. отделять активные ограничения от тех, где остаётся запас;

  2. интерпретировать тени цен без длинного ручного симплекс-анализа;

  3. сравнивать прогноз по shadow price с фактом;

  4. делать управленческий вывод по дефицитности ресурсов.

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

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

Ресурс

Лимит

Бюджет

96

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

60

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

50

Программы#

Программа

Эффект

Бюджет

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

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

Пункты обогрева

97

46

24

18

Продуктовые сертификаты

76

24

16

9

Социальные патрули

70

18

14

12

Срочный ремонт жилья

92

44

28

22

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([97, 76, 70, 92], dtype=float)
A_ub = np.array([[46, 24, 18, 44], [24, 16, 14, 28], [18, 9, 12, 22]], dtype=float)
b_ub = np.array([96, 60, 50], 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.

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

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