模擬測試解法

Python 的供應鏈分析

Aaren Stubberfield

Supply Chain Analytics Mgr.

注意事項

  • 需要很久才能解的問題,不適合用 LP 或 IP

注意圖示,男子滑倒

Python 的供應鏈分析

整體概念

整體概念:

  • 對你選的關鍵輸入加入隨機雜訊
  • 反覆求解模型
  • 觀察分佈
Python 的供應鏈分析

為什麼嘗試

為什麼要做:

  • 輸入多半是估計,可能不準確。
  • 先前的敏感度分析一次只改一個輸入。
Python 的供應鏈分析

情境說明

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

Resource Prod. A Prod. B Prod. C
Profit $US $500 $450 $600

限制:

  • 有需求、生產能力與倉儲容量的限制

風險:

  • 利潤估計可能不準確
Python 的供應鏈分析
# Initialize Class, & Define Variables
model = LpProblem("Max Glass Co. Profits", LpMaximize)
A = LpVariable('A', lowBound=0)
B = LpVariable('B', lowBound=0)
C = LpVariable('C', lowBound=0)

# Define Objective Function
model += 500 * A + 450 * B + 600 * C

# Define Constraints & Solve
model += 6 * A + 5 * B + 8 * C <= 60
model += 10.5 * A + 20 * B + 10 * C <= 150
model += A  <= 8
model.solve()
Python 的供應鏈分析

程式範例-步驟 2

a, b, c = normalvariate(0,25), 
          normalvariate(0,25),
          normalvariate(0,25)
# Define Objective Function
model += (500+a)*A + (450+b)*B + (600+c)*C
# Initialize Class, & Define Variables
model = LpProblem("Max Glass Co. Profits", 
                   LpMaximize)

A = LpVariable('A', lowBound=0)
B = LpVariable('B', lowBound=0)
C = LpVariable('C', lowBound=0)
a, b, c = normalvariate(0,25), 
          normalvariate(0,25), 
          normalvariate(0,25)
# Define Objective Function
model += (500+a)*A + (450+b)*B + (600+c)*C

# Define Constraints & Solve
model += 6 * A + 5 * B + 8 * C <= 60
model += 10.5 * A + 20 * B + 10 * C <= 150
model += A  <= 8
model.solve()
Python 的供應鏈分析
def run_pulp_model():
    # Initialize Class
    model = LpProblem("Max Glass Co. Profits", LpMaximize)
    A = LpVariable('A', lowBound=0)
    B = LpVariable('B', lowBound=0)
    C = LpVariable('C', lowBound=0)
    a, b, c = normalvariate(0,25), normalvariate(0,25), normalvariate(0,25)

    # Define Objective Function
    model += (500+a)*A + (450+b)*B + (600+c)*C

    # Define Constraints & Solve
    model += 6 * A + 5 * B + 8 * C <= 60
    model += 10.5 * A + 20 * B + 10 * C <= 150
    model += A  <= 8
    model.solve()
    o = {'A':A.varValue, 'B':B.varValue, 'C':C.varValue, 'Obj':value(model.objective)}
    return(o)
Python 的供應鏈分析

程式範例-步驟 4

def run_pulp_model():
    # Initialize Class
    model = LpProblem("Max Glass Co. Profits",
                       LpMaximize)
    A = LpVariable('A', lowBound=0)
    B = LpVariable('B', lowBound=0)
    C = LpVariable('C', lowBound=0)
    a, b, c = normalvariate(0,25), 
              normalvariate(0,25),
              normalvariate(0,25)

    # Define Objective Function
    model += (500+a)*A + (450+b)*B + 
             (600+c)*C
    # Define Constraints & Solve
    model += 6 * A + 5 * B + 8 * C <= 60
    model += 10.5 * A + 20 * B + 10 * C <= 150
    model += A  <= 8
    model.solve()
    o = {'A':A.varValue, 'B':B.varValue, 
         'C':C.varValue, 
         'Obj':value(model.objective)}
    return(o)
for i in range(100):
    output.append(run_pulp_model())
df = pd.DataFrame(output)
Python 的供應鏈分析

程式範例-步驟 5

print(df['A'].value_counts())
print(df['B'].value_counts())
print(df['C'].value_counts())

輸出:(結果可能不同)

6.666667    73
0.000000    14
8.000000    13
Name: A, dtype: int64
4.000000    73
5.454546    14
2.400000    13
Name: B, dtype: int64
0.000000    86
4.090909    14
Name: C, dtype: int64
Python 的供應鏈分析

用直方圖視覺化

產品 A: 產品 A、B、C 與目標的直方圖

產品 B: 產品 B 的直方圖

產品 C: 產品 C 的直方圖

目標值: 目標值的直方圖

Python 的供應鏈分析

重點總結

  • 不適合用在需要很久才能解的問題
  • 好處

    • 觀察隨輸入改變,最佳結果如何變化
  • 步驟

    1. 以標準 PuLP 模型程式碼開始
    2. 用 Python 的 normalvariate 對關鍵輸入加雜訊
    3. 將 PuLP 模型程式包成回傳輸出的函式
    4. 建立迴圈呼叫新函式並將結果存成 DataFrame
    5. 視覺化結果的 DataFrame
Python 的供應鏈分析

一起來練習吧!

Python 的供應鏈分析

Preparing Video For Download...