ЛР-03: Социальная защита в зимний период#
Student notebook: civil 02#
Этот notebook предназначен для самостоятельного анализа.
Готовых численных ответов и заполненного sensitivity-разбора здесь нет.
1. Зачем нужен этот кейс#
Здесь важно понять, какой ресурс становится главным узким местом зимой.
После выполнения работы студент должен уметь:
отделять активные ограничения от тех, где остаётся запас;
интерпретировать тени цен без длинного ручного симплекс-анализа;
сравнивать прогноз по
shadow priceс фактом;делать управленческий вывод по дефицитности ресурсов.
2. Исходные данные#
Ограничения ресурсов#
Ресурс |
Лимит |
|---|---|
Бюджет |
96 |
Трудозатраты |
60 |
Операционная ёмкость |
50 |
Программы#
Программа |
Эффект |
Бюджет |
Трудозатраты |
Операционная ёмкость |
|---|---|---|---|---|
Пункты обогрева |
97 |
46 |
24 |
18 |
Продуктовые сертификаты |
76 |
24 |
16 |
9 |
Социальные патрули |
70 |
18 |
14 |
12 |
Срочный ремонт жилья |
92 |
44 |
28 |
22 |
3. Что нужно сделать#
Запишите прямую модель через переменные масштабов программ.
Подготовьте
c,A_ub,b_ub,boundsдляlinprog.Определите активные ограничения и запас ресурса.
Кратко запишите двойственную модель.
Проведите минимум два сценария по
bи один сценарий поc.Сравните прогноз по теневой цене с фактическим пересчётом.
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. Что должно быть в отчёте#
Прямая постановка задачи.
Оптимальный план по программам.
Таблица активных ограничений и запасов.
Таблица теневых цен ресурсов.
Проверка сильной двойственности.
Минимум два сценария по
bи один поc.
6. Контрольный чек-лист#
[ ] Я показал, какие ограничения стали binding.
[ ] Я осмысленно интерпретировал shadow prices.
[ ] Я сравнил прогноз и фактический пересчёт.
[ ] Я сформулировал управленческий вывод по самому дефицитному ресурсу.