ЛР-03: Модернизация ремонтной базы#
Student notebook: military 02#
Этот notebook предназначен для самостоятельного анализа.
Готовых численных ответов и заполненного sensitivity-разбора здесь нет.
1. Зачем нужен этот кейс#
Нужно выбрать масштабы модернизации при ограниченном бюджете, персонале и мощностях.
После выполнения работы студент должен уметь:
читать чувствительность через нехватку ресурсов, а не только через числа;
аккуратно формулировать двойственную задачу;
проводить минимум два сценария по
bи один поc;делать вывод о самой дефицитной мощности.
2. Исходные данные#
Ограничения ресурсов#
Ресурс |
Лимит |
|---|---|
Бюджет |
90 |
Трудозатраты |
54 |
Производственная ёмкость |
44 |
Программы#
Программа |
Эффект |
Бюджет |
Трудозатраты |
Операционная ёмкость |
|---|---|---|---|---|
Диагностические посты |
80 |
28 |
14 |
12 |
Склад критических узлов |
74 |
24 |
11 |
10 |
Мобильные ремонтные бригады |
88 |
36 |
21 |
16 |
Испытательный участок |
92 |
44 |
24 |
18 |
3. Что нужно сделать#
Запишите прямую модель через переменные масштабов программ.
Подготовьте
c,A_ub,b_ub,boundsдляlinprog.Определите активные ограничения и запас ресурса.
Кратко запишите двойственную модель.
Проведите минимум два сценария по
bи один сценарий поc.Сравните прогноз по теневой цене с фактическим пересчётом.
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. Что должно быть в отчёте#
Прямая постановка задачи.
Оптимальный план по программам.
Таблица активных ограничений и запасов.
Таблица теневых цен ресурсов.
Проверка сильной двойственности.
Минимум два сценария по
bи один поc.
6. Контрольный чек-лист#
[ ] Я показал, какие ограничения стали binding.
[ ] Я осмысленно интерпретировал shadow prices.
[ ] Я сравнил прогноз и фактический пересчёт.
[ ] Я сформулировал управленческий вывод по самому дефицитному ресурсу.