เฉลยการทดสอบด้วยการจำลอง

Supply Chain Analytics ด้วย Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

ข้อควรระวัง

  • ปัญหาที่ใช้เวลานานในการแก้ไขไม่ควรใช้กับ LP หรือ IP

ภาพเตือน ชายลื่นล้ม

Supply Chain Analytics ด้วย Python

ภาพรวมแนวคิด

แนวคิดทั่วไป:

  • เพิ่ม noise แบบสุ่มให้กับ input ที่เลือก
  • รันโมเดลซ้ำหลายครั้ง
  • สังเกตการกระจายของผลลัพธ์
Supply Chain Analytics ด้วย Python

เหตุผลที่ควรลองใช้

เหตุผล:

  • Input มักเป็นค่าประมาณ จึงมีความเสี่ยงที่จะไม่แม่นยำ
  • Sensitivity Analysis ก่อนหน้านี้ดูการเปลี่ยนแปลงทีละ input เท่านั้น
Supply Chain Analytics ด้วย Python

บริบท

บริบท - บริษัทแก้ว - การวางแผนทรัพยากร:

ทรัพยากร สินค้า A สินค้า B สินค้า C
กำไร $US $500 $450 $600

ข้อจำกัด:

  • มีข้อจำกัดด้านความต้องการ กำลังการผลิต และความจุของคลังสินค้า

ความเสี่ยง:

  • ค่าประมาณกำไรอาจไม่แม่นยำ
Supply Chain Analytics ด้วย 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()
Supply Chain Analytics ด้วย 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()
Supply Chain Analytics ด้วย 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)
Supply Chain Analytics ด้วย 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)
Supply Chain Analytics ด้วย 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
Supply Chain Analytics ด้วย Python

แสดงผลด้วยฮิสโตแกรม

สินค้า A: ฮิสโตแกรมของสินค้า a, b, c และค่าวัตถุประสงค์

สินค้า B: ฮิสโตแกรมของสินค้า b

สินค้า C: ฮิสโตแกรมของสินค้า c

ค่าวัตถุประสงค์: ฮิสโตแกรมของค่าวัตถุประสงค์

Supply Chain Analytics ด้วย Python

สรุป

  • ไม่ควรใช้กับปัญหาที่ใช้เวลานานในการแก้ไข
  • ประโยชน์

    • ดูว่าผลลัพธ์ที่เหมาะสมที่สุดเปลี่ยนแปลงอย่างไรเมื่อ input ของโมเดลเปลี่ยนไป
  • ขั้นตอน

    1. เริ่มต้นด้วยโค้ด PuLP มาตรฐาน
    2. เพิ่ม noise ให้กับ input หลักโดยใช้ normalvariate ของ Python
    3. นำโค้ด PuLP มาใส่ในฟังก์ชันที่คืนค่าผลลัพธ์ของโมเดล
    4. สร้าง loop เพื่อเรียกฟังก์ชันและเก็บผลลัพธ์ใน DataFrame
    5. แสดงภาพ DataFrame ของผลลัพธ์
Supply Chain Analytics ด้วย Python

มาฝึกกันเถอะ!

Supply Chain Analytics ด้วย Python

Preparing Video For Download...