Analýza citlivosti v PuLP

Introduction to Optimization in Python

Jasmin Ludolf

Content Developer

Analýza citlivosti v lineárním programování

  • Analýza citlivosti mění jeden parametr a sleduje změny výstupu/výsledku
  • Lineární programování: jak moc se změní účelová funkce
  • Tři přístupy:
    1. Změna koeficientu v účelové funkci
    2. Změna koeficientu v omezení
    3. Změna konstanty v omezení
  • Řešení původního a upraveného modelu
  • Použijeme PuLP!

Ukazatel měřidla s levým zeleným sektorem jako ikona citlivosti

Introduction to Optimization in Python

Definice

  • Omezení:
    • Splněno s rovností: aktivní, závazné
    • Splněno s ostrou nerovností: neaktivní, nezávazné, volné (přídavné jméno)
  • Slack (podstatné jméno):
    • Hodnota, kterou je třeba přičíst k levé straně omezení, aby bylo závazné
  • Stínová cena:
    • Mezní nárůst účelové funkce vůči pravé straně omezení
Introduction to Optimization in Python

Dietní úloha v PuLP

Potravina Cena ($/lb) Bílkoviny (%) Tuky (%)
kukuřice 0,11 10 2,5
sója 0,28 40 1

 

  • Doporučení: min. 17 % bílkovin, 2 % tuků, 7 lb potravy
  • Účelová funkce: $0.11C + 0.28S$
  • Bílkoviny: $10C+40S \geq 17(C+S)$
  • Tuky: $2.5C + S \geq 2(C+S)$
  • Hmotnost: $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()
Introduction to Optimization in Python

Slack a stínová cena v 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
Introduction to Optimization in Python

Pojďme si procvičit!

Introduction to Optimization in Python

Preparing Video For Download...