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

Вступ до оптимізації в Python

Jasmin Ludolf

Content Developer

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

  • Аналіз чутливості змінює один параметр, щоб побачити вплив на результат
  • Лінійне програмування: наскільки змінюється ціль
  • Три підходи:
    1. Змінити коефіцієнт у цільовій функції
    2. Змінити коефіцієнт в обмеженні
    3. Змінити вільний член в обмеженні
  • Розв'яжіть початкову і змінену модель
  • Використовуйте PuLP!

Індикатор-шкала з лівим зеленим сектором для позначення чутливості

Вступ до оптимізації в Python

Визначення

  • Обмеження:
    • Виконується на рівності: активне, зв'язувальне
    • Виконується на строгій нерівності: неактивне, незв'язувальне, зі «запасом» (adj.)
  • Запас (slack, іменн.):
    • Скільки додати в ліву частину, щоб обмеження стало зв'язувальним
  • Тіньова ціна:
    • Граничне зростання цільової функції відносно правої частини обмеження
Вступ до оптимізації в 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...