ЛР-03: Двойственность и анализ чувствительности#
1) Зачем нужна именно эта лабораторная#
После ЛР-01 мы уже умеем:
собирать базовую задачу линейного программирования;
понимать смысл переменных, ограничений и целевой функции;
проверять решение через
scipy.optimize.linprog;на базовом уровне читать двойственные оценки и связь с ККТ.
После ЛР-02 мы умеем:
переводить логистическую ситуацию в специальную транспортную модель;
работать с балансом спроса и предложения;
строить
A_eqдля потоковой постановки.
ЛР-03 не повторяет эти шаги. Здесь главный вопрос другой:
какие ресурсы реально ограничивают оптимум и как изменится лучший результат, если немного изменить параметры модели?
Именно поэтому ЛР-03 сделана с фокусом на анализ чувствительности (sensitivity-first), а не как ещё один длинный пошаговый разбор ручного вывода двойственной (dual) задачи.
2) Прикладной контекст: публичный бюджет#
Предположим, что регион распределяет ресурсы между несколькими программами:
мобильные медицинские бригады;
школьное питание;
цифровые образовательные наборы;
зимние центры поддержки населения.
Каждая программа:
даёт некоторый общественный эффект;
потребляет бюджет;
требует трудозатрат персонала;
использует операционную ёмкость.
Нужно выбрать масштаб запуска программ так, чтобы суммарный общественный эффект был как можно выше.
3) Прямая задача#
Пусть:
\(x_j\) — доля запуска программы \(j\);
\(0 \le x_j \le 1\);
\(c_j\) — эффект от полной реализации программы \(j\);
\(a_{ij}\) — потребление ресурса \(i\) программой \(j\);
\(b_i\) — доступный запас ресурса \(i\).
Тогда модель имеет вид:
при ограничениях:
В этой лабораторной ресурсы такие:
бюджет;
трудозатраты персонала;
операционная ёмкость.
Содержательно эта модель означает: мы можем запускать каждую программу полностью или частично, но не выше 100 процентов плана.
4) Что такое активное ограничение (binding) и запас ресурса (slack)#
Для ограничения вида
величина
показывает, сколько ресурса осталось в оптимуме.
По-человечески: мы сначала строим лучший план, а потом просто смотрим, сколько ресурса ещё лежит «на полке» и не было использовано.
Если запас ресурса (slack) равен 0#
Ограничение активно или binding.
Смысл: ресурс исчерпан, и именно он реально сдерживает дальнейший рост целевой функции.
Если запас ресурса (slack) больше 0#
Ограничение неактивно.
Смысл: часть ресурса остаётся в резерве, поэтому небольшое увеличение этого лимита в текущей точке ничего не меняет.
5) Краткая двойственная модель#
Так как у нас есть не только ресурсные ограничения, но и верхние границы
в полной двойственной (dual) модели появляются два типа двойственных переменных:
\(y_i \ge 0\) — теневая цена ресурса \(i\);
\(z_j \ge 0\) — теневая цена ограничения на максимальный масштаб программы \(j\).
Тогда двойственная задача к полной модели имеет вид:
при условиях:
Как это читать по-человечески#
\(y_i\) показывает, насколько вырастет оптимальный общественный эффект при малом увеличении ресурса \(i\) на одну условную единицу;
\(z_j\) показывает, насколько ценным было бы ослабить верхний предел для программы \(j\).
В этой ЛР основное внимание уделяется именно ресурсным теневым ценам \(y_i\).
6) Сильная двойственность#
Если прямая и двойственная задачи корректно поставлены и имеют оптимум, то:
Практический смысл:
можно решить прямую задачу;
отдельно решить двойственную (dual) модель;
убедиться, что оптимальные значения совпадают численно.
Это важная проверка того, что постановка собрана правильно.
7) Анализ чувствительности по правым частям#
Пусть ресурсный лимит \(b_i\) увеличили на маленькую величину \(\Delta b_i\).
Тогда при неизменной структуре оптимума:
Это и есть главный операционный смысл теневой цены:
большая теневая цена означает дефицитный и дорогой ресурс;
нулевая теневая цена означает, что в текущем оптимуме ресурс не лимитирует результат.
В лабораторной мы не ограничиваемся формулой, а сравниваем:
прогноз по теневой цене (shadow price);
фактический результат после повторного решения задачи.
8) Анализ чувствительности по коэффициентам цели#
Если меняются коэффициенты \(c_j\), то меняется ценность самих программ.
Это важно в двух типичных ситуациях:
новая оценка общественного эффекта программы;
смена приоритетов заказчика или региона.
Здесь возможны два разных эффекта:
значение целевой функции меняется, а структура оптимального плана остаётся прежней;
при достаточно сильном изменении коэффициентов меняется сам состав оптимального плана.
Именно этот переход мы отдельно проверяем в основном ноутбуке.
9) Что должно быть в отчёте#
Таблица программ, ресурсов и общественных эффектов.
Прямая постановка задачи с пояснением переменных.
Матрицы и векторы для
linprog:c,A_ub,b_ub,bounds.Решение прямой задачи и итоговый план масштабов программ.
Разделение ограничений на активные (binding) и с запасом ресурса (slack).
Краткая запись двойственной (dual) модели.
Численная проверка сильной двойственности.
Таблица ресурсных теневых цен.
Эксперименты по изменениям правых частей
bс прогнозом и фактом.Один-два эксперимента по изменениям коэффициентов цели
c.Вывод о том, какой ресурс сейчас самый дефицитный и где дополнительная единица ресурса даёт наибольший эффект.
10) Типичные ошибки#
Считать, что любое ограничение автоматически влияет на оптимум. Это не так: сначала нужно посмотреть на запас ресурса (
slack).Путать dual-переменные ресурсов с dual-переменными верхних границ
x_j \le 1.Делать вывод по теневой цене, не проверив знак и экономический смысл.
Сравнивать разные сценарии по
bиc, но забывать повторно решать модель.Повторять из ЛР-01 длинный ручной вывод dual-задачи вместо анализа чувствительности.
Смешивать ЛР-03 с транспортной логикой поставщик-потребитель из ЛР-02.
11) Граница темы этой лабораторной#
ЛР-03 специально разведена с другими материалами курса:
не про геометрические вершины и канонизацию как основную тему;
не про транспортную матрицу и баланс потоков;
не про аудит госзакупок, fair-price ranking и pipeline проверки контрактов;
да про тени ресурсов, устойчивость оптимума и сценарные управленческие выводы.