Định vị nhà máy có ràng buộc - nghiên cứu tình huống P4

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

Aaren Stubberfield

Supply Chain Analytics Mgr., Ingredion

Mô phỏng vs. phân tích độ nhạy

Với phân tích độ nhạy:

  • Quan sát thay đổi nhu cầu và chi phí ảnh hưởng đến sản xuất:
    • Nên tăng sản xuất ở đâu?
    • Sản xuất có chuyển sang vùng khác không.
    • Vùng nào có sản lượng ổn định?
  • So sánh thay đổi đồng thời với thay đổi từng yếu tố bằng phân tích độ nhạy
Phân tích Chuỗi Cung Ứng với Python

Mô hình mô phỏng

Ta có thể áp dụng kiểm thử mô phỏng cho Mô hình Định vị Nhà máy có Ràng buộc

 

Đầu vào có thể thêm nhiễu

  • Nhu cầu
  • Chi phí biến đổi
  • Chi phí cố định
  • Công suất
Phân tích Chuỗi Cung Ứng với Python
# Initialize Class
model = LpProblem(
            "Capacitated Plant Location Model",
             LpMinimize)

# Define Decision Variables
loc = ['A', 'B', 'C', 'D', 'E']
size = ['Low_Cap','High_Cap']
x = LpVariable.dicts(
       "production_", 
       [(i,j) for i in loc for j in loc],
       lowBound=0, upBound=None, cat='Continuous')
y = LpVariable.dicts(
      "plant_", [(i,s)for s in size for i in loc], 
       cat='Binary')
# Define Objective Function
model +=(lpSum([fix_cost.loc[i,s]*y[(i,s)]
               for s in size for i in loc])
       + lpSum([var_cost.loc[i,j]*x[(i,j)]
                for i in loc for j in loc]))

# Define the Constraints
for j in loc: model += 
  lpSum([x[(i, j)] for i in loc]) == demand.loc[
                                          j,'Dmd']
for i in loc: model += 
  lpSum([x[(i, j)] for j in loc]) <= lpSum(
                            [cap.loc[i,s]*y[(i,s)]
                             for s in size])
# Solve
model.solve()
print(LpStatus[model.status])
Phân tích Chuỗi Cung Ứng với Python

Mục tiêu:

model += (lpSum([fix_cost.loc[i,s]*y[(i,s)] for s in size for i in loc])
          + lpSum([(var_cost.loc[i,j] + normalvariate(0.5, 0.5))*x[(i,j)] 
                   for i in loc for j in loc]))

 

Tổng nhu cầu:

for j in loc:
    rd = normalvariate(0, demand.loc[j,'Dmd']*.05)
    model += lpSum([x[(i,j)] for i in loc]) == (demand.loc[j,'Dmd']+rd)
Phân tích Chuỗi Cung Ứng với Python

Ví dụ mã - bước 3

def run_pulp_model(fix_cost, var_cost, demand,
                   cap):
    # Initialize Class
    model = LpProblem(
              "Capacitated Plant Location Model", 
               LpMinimize)

    # Define Decision Variables
    loc = ['A', 'B', 'C', 'D', 'E']
    size = ['Low_Cap','High_Cap']
    x = LpVariable.dicts(
                "production_", 
                [(i,j) for i in loc for j in loc],
                lowBound=0, upBound=None,
                cat='Continuous')

    y = LpVariable.dicts(
               "plant_", 
               [(i,s) for s in size for i in loc], 
                cat='Binary')
    # Define the Constraints
    for j in loc: rd = normalvariate(
                       0, demand.loc[j,'Dmd']*.05)
        model += lpSum(
         [x[(i,j)] for i in loc]) == (
                           demand.loc[j,'Dmd']+rd)
    for i in loc: model += 
      lpSum([x[(i,j)] for j in loc]) \
        <= lpSum([cap.loc[i,s]*y[(i,s)] 
            for s in size])
Phân tích Chuỗi Cung Ứng với Python
    # Solve
    model.solve()
    o = {}
    for i in loc:
        o[i] = value(lpSum([x[(i, j)] for j in loc]))
    o['Obj'] = value(model.objective)
    return(o)
for i in range(100):
    output.append(run_pulp_model(fix_cost, var_cost, demand, cap))
df = pd.DataFrame(output)
Phân tích Chuỗi Cung Ứng với Python

Kết quả

import matplotlib.pyplot as plt
plt.title('Histogram of Prod. At Region E')
plt.hist(df['E'])
plt.show()

kết quả biểu đồ tần suất của vùng E và hàm mục tiêu

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

Tóm tắt

Mô hình nhà máy có ràng buộc

  • Mô phỏng so với phân tích độ nhạy
  • Đi qua ví dụ mã
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...