Kiểm thử mô phỏng – lời giải

Phân tích Chuỗi Cung Ứng với Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Cảnh báo

  • Không dùng cho bài toán mất nhiều thời gian giải với LP hoặc IP

ảnh cảnh báo, người trượt chân

Phân tích Chuỗi Cung Ứng với Python

Ý tưởng tổng quát

Khái niệm chung:

  • Thêm nhiễu ngẫu nhiên vào đầu vào chính do bạn chọn
  • Giải mô hình lặp lại nhiều lần
  • Quan sát phân phối
Phân tích Chuỗi Cung Ứng với Python

Vì sao nên thử

Lý do:

  • Đầu vào thường là ước lượng, có rủi ro sai lệch.
  • Phân tích nhạy trước đó chỉ thay đổi một đầu vào mỗi lần.
Phân tích Chuỗi Cung Ứng với Python

Bối cảnh

Bối cảnh – Công ty kính – Hoạch định nguồn lực:

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

Ràng buộc:

  • Có ràng buộc về nhu cầu, công suất sản xuất và kho

Rủi ro:

  • Ước lượng lợi nhuận có thể không chính xác
Phân tích Chuỗi Cung Ứng với 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()
Phân tích Chuỗi Cung Ứng với Python

Ví dụ mã – bước 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()
Phân tích Chuỗi Cung Ứng với 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)
Phân tích Chuỗi Cung Ứng với Python

Ví dụ mã – bước 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)
Phân tích Chuỗi Cung Ứng với Python

Ví dụ mã – bước 5

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

Kết quả: (có thể khác)

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
Phân tích Chuỗi Cung Ứng với Python

Trực quan bằng biểu đồ tần suất

Sản phẩm A: biểu đồ tần suất của sản phẩm a, b, c và hàm mục tiêu

Sản phẩm B: biểu đồ tần suất của sản phẩm b

Sản phẩm C: biểu đồ tần suất của sản phẩm c

Giá trị mục tiêu: biểu đồ tần suất của giá trị mục tiêu

Phân tích Chuỗi Cung Ứng với Python

Tóm tắt

  • Không dùng cho bài toán mất nhiều thời gian giải
  • Lợi ích

    • Xem cách kết quả tối ưu đổi khi đầu vào thay đổi
  • Các bước

    1. Bắt đầu với mã PuLP chuẩn
    2. Thêm nhiễu vào đầu vào chính bằng normalvariate của Python
    3. Gói mã PuLP trong hàm trả về đầu ra mô hình
    4. Tạo vòng lặp gọi hàm và lưu kết quả vào DataFrame
    5. Trực quan hóa DataFrame kết quả
Phân tích Chuỗi Cung Ứng với Python

Hãy thử ngay!

Phân tích Chuỗi Cung Ứng với Python

Preparing Video For Download...