ЛР-03: Муниципальное здравоохранение#

Student notebook: civil 01#

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

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

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

Нужно распределить ограниченные ресурсы между четырьмя социальными программами.

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

  1. собирать прямую модель через c, A_ub, b_ub, bounds;

  2. находить активные ограничения и запас ресурса;

  3. кратко записывать двойственную модель;

  4. проверять прогноз по теневой цене повторным решением.

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

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

Ресурс

Лимит

Бюджет

92

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

58

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

46

Программы#

Программа

Эффект

Бюджет

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

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

Выездные терапевтические бригады

88

38

18

16

Школьная вакцинация

74

26

22

11

Телемедицинские точки доступа

68

20

10

9

Поддержка районных ФАП

95

50

27

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([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. Что должно быть в отчёте#

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

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

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

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

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

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

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

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

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

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

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