影子價格敏感度分析

Python 的供應鏈分析

Aaren Stubberfield

Supply Chain Analytics Mgr.

影子價格定義

建模常見問題:

  • 約束條件的輸入多半是估計值
  • 輸入改變會不會改變解?

影子價格:

  • 在其他條件不變下,某約束右側值每增加 1 單位,目標函式最佳值的變化量。
Python 的供應鏈分析

情境-玻璃公司資源規劃:

Resource Prod. A Prod. B Prod. C
Production hours 6 5 8
WH Capacity sq. ft. 10.5 20 10
Profit $US $500 $450 $600

約束條件:

  • 生產時數 ≤ 60
  • 倉儲容量 ≤ 150 sq. ft.
  • A 的最大產量 ≤ 8
Python 的供應鏈分析

程式碼範例

# Initialize Class, Define Vars., and Objective
model = LpProblem("Max Glass Co. Profits", 
                   LpMaximize)
A = LpVariable('A', lowBound=0)
B = LpVariable('B', lowBound=0)
C = LpVariable('C', lowBound=0)
model += 500 * A + 450 * B + 600 * C

# Constraint 1
model += 6 * A + 5 * B + 8 * C <= 60

# Constraint 2
model += 10.5 * A + 20 * B + 10 * C <= 150
# Constraint 3
model += A  <= 8

# Solve Model
model.solve()
print("Model Status: 
        {}".format(LpStatus[model.status]))
print("Objective = ", value(model.objective))
for v in model.variables():
    print(v.name, "=", v.varValue)
Python 的供應鏈分析

範例解

解答:

Products Prod. A Prod. B Prod. C
Production Cases 6.667 4 0

目標值為 $5133.33

Python 的供應鏈分析

複習約束條件

決策變數:

  • A 至 C=各產品的生產箱數

約束條件:

  • 6A + 5B + 8C ≤ 60(生產能力有限
  • 10A + 20B + 10C ≤ 150(倉儲容量有限
  • A ≤ 8(A 的最大產量
Python 的供應鏈分析

列印影子價格

Python 程式碼:

o = [{'name':name, 'shadow price':c.pi} 
     for name, c in model.constraints.items()]
print(pd.DataFrame(o))
Python 的供應鏈分析

影子價格說明

輸出:

  name  shadow price
   _C1     78.148148
   _C2      2.962963
   _C3     -0.000000

記得這些約束:

  1. 生產能力有限
  2. 倉儲容量有限
  3. A 的最大產量
Python 的供應鏈分析

約束鬆弛量(slack)

slack

  • 未使用的資源量。

Python:

o = [{'name':name, 'shadow price':c.pi, 'slack': c.slack} 
     for name, c in model.constraints.items()]
print(pd.DataFrame(o))
Python 的供應鏈分析

約束鬆弛量說明

輸出:

  name  shadow price     slack
   _C1     78.148148 -0.000000
   _C2      2.962963 -0.000000
   _C3     -0.000000  1.333333

更多關於 Binding:

  • slack = 0,則為 binding
  • 變動 binding 約束,會_改變_

記得這些約束:

  1. 生產能力有限
  2. 倉儲容量有限
  3. A 的最大產量
Python 的供應鏈分析

重點整理

  • 如何計算:
    • shadow prices
    • 約束的 slack
  • 辨識 Binding 約束
    • slack = 0,則為 binding
    • slack > 0,則為 not-binding
Python 的供應鏈分析

一起來練習吧!

Python 的供應鏈分析

Preparing Video For Download...