ЛР-03: Муниципальное здравоохранение#
Student notebook: civil 01#
Этот notebook предназначен для самостоятельного анализа.
Готовых численных ответов и заполненного sensitivity-разбора здесь нет.
1. Зачем нужен этот кейс#
Нужно распределить ограниченные ресурсы между четырьмя социальными программами.
После выполнения работы студент должен уметь:
собирать прямую модель через
c,A_ub,b_ub,bounds;находить активные ограничения и запас ресурса;
кратко записывать двойственную модель;
проверять прогноз по теневой цене повторным решением.
2. Исходные данные#
Ограничения ресурсов#
Ресурс |
Лимит |
|---|---|
Бюджет |
92 |
Трудозатраты |
58 |
Операционная ёмкость |
46 |
Программы#
Программа |
Эффект |
Бюджет |
Трудозатраты |
Операционная ёмкость |
|---|---|---|---|---|
Выездные терапевтические бригады |
88 |
38 |
18 |
16 |
Школьная вакцинация |
74 |
26 |
22 |
11 |
Телемедицинские точки доступа |
68 |
20 |
10 |
9 |
Поддержка районных ФАП |
95 |
50 |
27 |
21 |
3. Что нужно сделать#
Запишите прямую модель через переменные масштабов программ.
Подготовьте
c,A_ub,b_ub,boundsдляlinprog.Определите активные ограничения и запас ресурса.
Кратко запишите двойственную модель.
Проведите минимум два сценария по
bи один сценарий поc.Сравните прогноз по теневой цене с фактическим пересчётом.
import numpy as np
from scipy.optimize import linprog
effects = np.array([88, 74, 68, 95], dtype=float)
A_ub = np.array([[38, 26, 20, 50], [18, 22, 10, 27], [16, 11, 9, 21]], dtype=float)
b_ub = np.array([92, 58, 46], 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.
[ ] Я сравнил прогноз и фактический пересчёт.
[ ] Я сформулировал управленческий вывод по самому дефицитному ресурсу.