Анализ чувствительности в PuLP

Введение в оптимизацию на Python

Jasmin Ludolf

Content Developer

Анализ чувствительности в линейном программировании

  • Анализ чувствительности — изменение одного параметра для наблюдения за результатом
  • Линейное программирование: как изменяется целевая функция
  • Три подхода:
    1. Изменить коэффициент в целевой функции
    2. Изменить коэффициент в ограничении
    3. Изменить константу в правой части ограничения
  • Решить исходную и изменённую модель
  • Используем PuLP!

Индикатор-манометр с зелёным сектором слева для обозначения чувствительности

Введение в оптимизацию на Python

Определения

  • Ограничение:
    • Выполняется как равенство: активное, связывающее
    • Выполняется как строгое неравенство: неактивное, несвязывающее, с запасом
  • Запас (слабость ограничения):
    • Величина, которую нужно прибавить к левой части, чтобы ограничение стало связывающим
  • Теневая цена:
    • Предельное увеличение целевой функции при изменении правой части ограничения
Введение в оптимизацию на Python

Задача о диете в PuLP

Продукт Стоимость ($/фунт) Белок (%) Жир (%)
кукуруза 0.11 10 2,5
соя 0.28 40 1

 

  • Требования: не менее 17% белка, 2% жира, 7 фунтов корма
  • Целевая функция: $0.11C + 0.28S$
  • Белок: $10C+40S \geq 17(C+S)$
  • Жир: $2.5C + S \geq 2(C+S)$
  • Вес: $C + S \geq 7$
from pulp import *

model = LpProblem('diet', LpMinimize)

C = LpVariable('C', lowBound=0)
S = LpVariable('S', lowBound=0)

model += 0.11*C + 0.28*S

model += 10*C + 40*S >= 17 * (C+S), 'Protein' 
model += 2.5*C + S >= 2 * (C+S), 'Fat'
model += C + S >= 7, 'Weight' 

model.solve()
Введение в оптимизацию на Python

Запас и теневая цена в PuLP

print(f"Status: {LpStatus[model.status]}\n")
for name, c in model.constraints.items():
    print(f"{name}: slack = {c.slack:.2f}, shadow price = {c.pi:.2f}")
Status: Optimal
Protein: slack = -0.00, shadow price = 0.01

Fat: slack = -1.05, shadow price = 0.00
Weight: slack = -0.00, shadow price = 0.15
Введение в оптимизацию на Python

Давайте потренируемся!

Введение в оптимизацию на Python

Preparing Video For Download...