PuLP’te duyarlılık analizi

Python ile Optimizasyona Giriş

Jasmin Ludolf

Content Developer

Doğrusal programlamada duyarlılık analizi

  • Duyarlılık analizi: bir parametreyi değiştirip çıktının nasıl değiştiğini görmek
  • Doğrusal programlama: amaç değeri ne kadar değişir
  • Üç yaklaşım:
    1. Amaç fonksiyonundaki bir katsayıyı değiştirin
    2. Bir kısıttaki katsayıyı değiştirin
    3. Bir kısıttaki sabit terimi değiştirin
  • Orijinal ve değiştirilmiş modeli çözün
  • PuLP kullanın!

Duyarlılığı temsil eden solda yeşil dilimli gösterge simgesi

Python ile Optimizasyona Giriş

Tanımlar

  • Kısıt:
    • Eşitlikle sağlanırsa: aktif, bağlayıcı
    • Sıkı eşitsizlikle sağlanırsa: aktif değil, bağlayıcı değil, boşluk (sıfırdan büyük)
  • Slack (boşluk) (isim):
    • Bağlayıcı yapmak için kısıdın soluna eklenecek miktar
  • Gölge fiyatı:
    • Kısıdın sağ tarafına göre amaçtaki marjinal artış
Python ile Optimizasyona Giriş

PuLP’te diyet problemi

Gıda Maliyet ($/lb) Protein (%) Yağ (%)
mısır 0.11 10 2.5
soya fasulyesi 0.28 40 1

 

  • Öneri: en az %17 protein, %2 yağ, 7 lb gıda
  • Amaç: $0.11C + 0.28S$
  • Protein: $10C+40S \geq 17(C+S)$
  • Yağ: $2.5C + S \geq 2(C+S)$
  • Ağırlık: $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 ile Optimizasyona Giriş

PuLP’te slack ve gölge fiyatı

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 ile Optimizasyona Giriş

Hadi pratik yapalım!

Python ile Optimizasyona Giriş

Preparing Video For Download...