ЛР-03: Модернизация ремонтной базы#

Student notebook: military 02#

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

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

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

Нужно выбрать масштабы модернизации при ограниченном бюджете, персонале и мощностях.

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

  1. читать чувствительность через нехватку ресурсов, а не только через числа;

  2. аккуратно формулировать двойственную задачу;

  3. проводить минимум два сценария по b и один по c;

  4. делать вывод о самой дефицитной мощности.

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

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

Ресурс

Лимит

Бюджет

90

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

54

Производственная ёмкость

44

Программы#

Программа

Эффект

Бюджет

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

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

Диагностические посты

80

28

14

12

Склад критических узлов

74

24

11

10

Мобильные ремонтные бригады

88

36

21

16

Испытательный участок

92

44

24

18

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([80, 74, 88, 92], dtype=float)
A_ub = np.array([[28, 24, 36, 44], [14, 11, 21, 24], [12, 10, 16, 18]], dtype=float)
b_ub = np.array([90, 54, 44], 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.

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

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