PuLP 的敏感度分析

Python 最佳化入門

Jasmin Ludolf

Content Developer

線性規劃中的敏感度分析

  • 敏感度分析:改變單一參數,觀察輸出/結果的變化
  • 線性規劃:目標值會改變多少
  • 三種作法:
    1. 更改目標函數的係數
    2. 更改限制式的係數
    3. 更改限制式的常數項
  • 解原始與變更後的模型
  • 使用 PuLP!

以左側綠色區塊的儀表圖示表示敏感度

Python 最佳化入門

名詞定義

  • 限制式
    • 等號成立:active、binding(有效、緊束)
    • 嚴格不等式成立:non-active、non-binding、slack(非有效、非緊束、有鬆弛)
  • Slack(鬆弛)(名詞):
    • 使限制式變為緊束時,需加到左側的量
  • Shadow price(影子價格)
    • 目標值對限制式右側的邊際增加量
Python 最佳化入門

PuLP 的飲食問題

食材 成本 ($/lb) 蛋白質 (%) 脂肪 (%)
corn 0.11 10 2.5
soybean 0.28 40 1

 

  • 建議:至少 17% 蛋白質、2% 脂肪、7 lb 食物
  • 目標:$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...