Lokasi pabrik berkapasitas - studi kasus P4

Analitik Rantai Pasok dengan Python

Aaren Stubberfield

Supply Chain Analytics Mgr., Ingredion

Simulasi vs. analisis sensitivitas

Dengan analisis sensitivitas:

  • Amati dampak perubahan permintaan dan biaya pada produksi:
    • Di mana produksi perlu ditambah?
    • Apakah produksi berpindah ke wilayah lain?
    • Wilayah mana dengan jumlah produksi stabil?
  • Bandingkan banyak perubahan sekaligus vs. satu per satu dengan analisis sensitivitas
Analitik Rantai Pasok dengan Python

Pemodelan simulasi

Kita dapat menerapkan pengujian simulasi pada Model Lokasi Pabrik Berkapasitas

 

Masukan yang dapat diberi noise

  • Permintaan
  • Biaya variabel
  • Biaya tetap
  • Kapasitas
Analitik Rantai Pasok dengan 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])
Analitik Rantai Pasok dengan Python

Objektif:

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]))

 

Total permintaan:

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)
Analitik Rantai Pasok dengan Python

Contoh kode - langkah 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])
Analitik Rantai Pasok dengan 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)
Analitik Rantai Pasok dengan Python

Hasil

import matplotlib.pyplot as plt
plt.title('Histogram Produksi Wilayah E')
plt.hist(df['E'])
plt.show()

hasil histogram wilayah E dan objektif

Analitik Rantai Pasok dengan Python

Ringkasan

Model Pabrik Berkapasitas

  • Simulasi vs. analisis sensitivitas
  • Menelusuri contoh kode
Analitik Rantai Pasok dengan Python

Ayo berlatih!

Analitik Rantai Pasok dengan Python

Preparing Video For Download...