# ЛР-03: Двойственность и анализ чувствительности

## 1) Зачем нужна именно эта лабораторная

После ЛР-01 мы уже умеем:

- собирать базовую задачу линейного программирования;
- понимать смысл переменных, ограничений и целевой функции;
- проверять решение через `scipy.optimize.linprog`;
- на базовом уровне читать двойственные оценки и связь с ККТ.

После ЛР-02 мы умеем:

- переводить логистическую ситуацию в специальную транспортную модель;
- работать с балансом спроса и предложения;
- строить `A_eq` для потоковой постановки.

**ЛР-03 не повторяет эти шаги.** Здесь главный вопрос другой:

> какие ресурсы реально ограничивают оптимум и как изменится лучший результат, если немного изменить параметры модели?

Именно поэтому ЛР-03 сделана с фокусом на анализ чувствительности (**sensitivity-first**), а не как ещё один длинный пошаговый разбор ручного вывода двойственной (**dual**) задачи.

---

## 2) Прикладной контекст: публичный бюджет

Предположим, что регион распределяет ресурсы между несколькими программами:

1. мобильные медицинские бригады;
2. школьное питание;
3. цифровые образовательные наборы;
4. зимние центры поддержки населения.

Каждая программа:

- даёт некоторый общественный эффект;
- потребляет бюджет;
- требует трудозатрат персонала;
- использует операционную ёмкость.

Нужно выбрать масштаб запуска программ так, чтобы суммарный общественный эффект был как можно выше.

---

## 3) Прямая задача

Пусть:

- $x_j$ — доля запуска программы $j$;
- $0 \le x_j \le 1$;
- $c_j$ — эффект от полной реализации программы $j$;
- $a_{ij}$ — потребление ресурса $i$ программой $j$;
- $b_i$ — доступный запас ресурса $i$.

Тогда модель имеет вид:

$$
\max E = \sum_{j=1}^{4} c_j x_j
$$

при ограничениях:

$$
\sum_{j=1}^{4} a_{ij} x_j \le b_i, \quad i=1,2,3,
$$

$$
0 \le x_j \le 1, \quad j=1,2,3,4.
$$

В этой лабораторной ресурсы такие:

1. бюджет;
2. трудозатраты персонала;
3. операционная ёмкость.

Содержательно эта модель означает: мы можем запускать каждую программу полностью или частично, но не выше 100 процентов плана.

---

## 4) Что такое активное ограничение (binding) и запас ресурса (slack)

Для ограничения вида

$$
a_i^T x \le b_i
$$

величина

$$
\text{slack}_i = b_i - a_i^T x^*
$$

показывает, сколько ресурса осталось в оптимуме.

По-человечески: мы сначала строим лучший план, а потом просто смотрим, сколько ресурса ещё лежит "на полке" и не было использовано.

### Если запас ресурса (`slack`) равен 0

Ограничение **активно** или **binding**.

Смысл: ресурс исчерпан, и именно он реально сдерживает дальнейший рост целевой функции.

### Если запас ресурса (`slack`) больше 0

Ограничение **неактивно**.

Смысл: часть ресурса остаётся в резерве, поэтому небольшое увеличение этого лимита в текущей точке ничего не меняет.

---

## 5) Краткая двойственная модель

Так как у нас есть не только ресурсные ограничения, но и верхние границы

$$
x_j \le 1,
$$

в полной двойственной (**dual**) модели появляются два типа двойственных переменных:

- $y_i \ge 0$ — теневая цена ресурса $i$;
- $z_j \ge 0$ — теневая цена ограничения на максимальный масштаб программы $j$.

Тогда двойственная задача к полной модели имеет вид:

$$
\min \Phi = \sum_{i=1}^{3} b_i y_i + \sum_{j=1}^{4} z_j
$$

при условиях:

$$
A^T y + z \ge c,
$$

$$
y \ge 0,\quad z \ge 0.
$$

### Как это читать по-человечески

- $y_i$ показывает, насколько вырастет оптимальный общественный эффект при малом увеличении ресурса $i$ на одну условную единицу;
- $z_j$ показывает, насколько ценным было бы ослабить верхний предел для программы $j$.

В этой ЛР основное внимание уделяется именно **ресурсным теневым ценам** $y_i$.

---

## 6) Сильная двойственность

Если прямая и двойственная задачи корректно поставлены и имеют оптимум, то:

$$
E^* = \Phi^*.
$$

Практический смысл:

- можно решить прямую задачу;
- отдельно решить двойственную (dual) модель;
- убедиться, что оптимальные значения совпадают численно.

Это важная проверка того, что постановка собрана правильно.

---

## 7) Анализ чувствительности по правым частям

Пусть ресурсный лимит $b_i$ увеличили на маленькую величину $\Delta b_i$.

Тогда при неизменной структуре оптимума:

$$
\Delta E^* \approx y_i \cdot \Delta b_i.
$$

Это и есть главный операционный смысл теневой цены:

- большая теневая цена означает дефицитный и дорогой ресурс;
- нулевая теневая цена означает, что в текущем оптимуме ресурс не лимитирует результат.

В лабораторной мы не ограничиваемся формулой, а сравниваем:

1. прогноз по теневой цене (shadow price);
2. фактический результат после повторного решения задачи.

---

## 8) Анализ чувствительности по коэффициентам цели

Если меняются коэффициенты $c_j$, то меняется ценность самих программ.

Это важно в двух типичных ситуациях:

1. новая оценка общественного эффекта программы;
2. смена приоритетов заказчика или региона.

Здесь возможны два разных эффекта:

- значение целевой функции меняется, а структура оптимального плана остаётся прежней;
- при достаточно сильном изменении коэффициентов меняется сам состав оптимального плана.

Именно этот переход мы отдельно проверяем в основном ноутбуке.

---

## 9) Что должно быть в отчёте

1. Таблица программ, ресурсов и общественных эффектов.
2. Прямая постановка задачи с пояснением переменных.
3. Матрицы и векторы для `linprog`: `c`, `A_ub`, `b_ub`, `bounds`.
4. Решение прямой задачи и итоговый план масштабов программ.
5. Разделение ограничений на активные (binding) и с запасом ресурса (slack).
6. Краткая запись двойственной (dual) модели.
7. Численная проверка сильной двойственности.
8. Таблица ресурсных теневых цен.
9. Эксперименты по изменениям правых частей `b` с прогнозом и фактом.
10. Один-два эксперимента по изменениям коэффициентов цели `c`.
11. Вывод о том, какой ресурс сейчас самый дефицитный и где дополнительная единица ресурса даёт наибольший эффект.

---

## 10) Типичные ошибки

1. Считать, что любое ограничение автоматически влияет на оптимум. Это не так: сначала нужно посмотреть на запас ресурса (`slack`).
2. Путать dual-переменные ресурсов с dual-переменными верхних границ `x_j \le 1`.
3. Делать вывод по теневой цене, не проверив знак и экономический смысл.
4. Сравнивать разные сценарии по `b` и `c`, но забывать повторно решать модель.
5. Повторять из ЛР-01 длинный ручной вывод dual-задачи вместо анализа чувствительности.
6. Смешивать ЛР-03 с транспортной логикой поставщик-потребитель из ЛР-02.

---

## 11) Граница темы этой лабораторной

ЛР-03 специально разведена с другими материалами курса:

- **не** про геометрические вершины и канонизацию как основную тему;
- **не** про транспортную матрицу и баланс потоков;
- **не** про аудит госзакупок, fair-price ranking и pipeline проверки контрактов;
- **да** про тени ресурсов, устойчивость оптимума и сценарные управленческие выводы.
