シャドープライスの感度分析

Pythonで学ぶサプライチェーン分析

Aaren Stubberfield

Supply Chain Analytics Mgr.

シャドープライスの定義

モデル化上の課題:

  • 制約の入力は推定値が多い
  • 入力が変わると解は変わるか?

シャドープライス:

  • 制約の右辺を1単位増やしたとき、他は不変として、目的関数の最適値がどれだけ変化するか。
Pythonで学ぶサプライチェーン分析

コンテキスト - ガラス会社の資源計画:

資源 製品A 製品B 製品C
生産時間 6 5 8
倉庫容量(平方フィート) 10.5 20 10
利益 $US $500 $450 $600

制約:

  • 生産時間 ≤ 60
  • 倉庫容量 ≤ 150 平方フィート
  • 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で学ぶサプライチェーン分析

例の解

解:

製品 製品A 製品B 製品C
生産ケース数 6.667 4 0

目的関数値: $5133.33

Pythonで学ぶサプライチェーン分析

制約の確認

意思決定変数:

  • A~C = 各製品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:

  • 未使用の資源量。

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

バインディングについて

  • slack = 0 なら「バインディング」
  • バインディング制約を変えると解が変わる

制約を再確認:

  1. 生産能力の制限
  2. 倉庫容量の制限
  3. Aの最大生産
Pythonで学ぶサプライチェーン分析

まとめ

  • 計算方法:
    • shadow prices
    • 制約のslack
  • バインディングの判定
    • slack = 0 → バインディング
    • slack > 0 → 非バインディング
Pythonで学ぶサプライチェーン分析

試してみよう!

Pythonで学ぶサプライチェーン分析

Preparing Video For Download...