PuLPでの感度分析

Pythonで学ぶOptimization入門

Jasmin Ludolf

Content Developer

線形計画における感度分析

  • 感度分析: 1つのパラメータを変えて出力の変化を確認
  • 線形計画: 目的関数がどれだけ変わるか
  • 3つの方法:
    1. 目的関数の係数を変更
    2. 制約の係数を変更
    3. 制約の定数項を変更
  • 元のモデルと変更後モデルを解く
  • PuLPを使う

感度を表す左側が緑のゲージアイコン

Pythonで学ぶOptimization入門

用語定義

  • 制約:
    • 等号で成り立つ: アクティブ、結合的(binding)
    • 狭義不等号で成り立つ: 非アクティブ、非結合、スラックあり
  • スラック(名詞):
    • 結合的にするため左辺に加える必要量
  • シャドープライス:
    • 制約の右辺に対する目的関数の限界増加量
Pythonで学ぶOptimization入門

PuLPでのダイエット問題

食品 コスト ($/lb) タンパク質 (%) 脂肪 (%)
トウモロコシ 0.11 10 2.5
大豆 0.28 40 1

 

  • 推奨: タンパク質17%以上、脂肪2%以上、7lb以上
  • 目的: $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で学ぶOptimization入門

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で学ぶOptimization入門

実践しましょう!

Pythonで学ぶOptimization入門

Preparing Video For Download...