Gecapaciteerde locatiemodel fabriek - casus P4

Supply Chain Analytics in Python

Aaren Stubberfield

Supply Chain Analytics Mgr., Ingredion

Simulatie vs. gevoeligheidsanalyse

Met gevoeligheidsanalyse:

  • Bekijk hoe veranderingen in vraag en kosten de productie beïnvloeden:
    • Waar moet je productie toevoegen?
    • Verplaatst productie naar een andere regio?
    • Welke regio’s hebben stabiele productiehoeveelheden?
  • Bekijk meerdere wijzigingen tegelijk vs. één per keer met gevoeligheidsanalyse
Supply Chain Analytics in Python

Simulatiemodellering

We kunnen simulatie toepassen op ons Gecapaciteerde Locatiemodel voor fabrieken

 

Mogelijke inputs voor ruis toevoegen

  • Vraag
  • Variabele kosten
  • Vaste kosten
  • Capaciteit
Supply Chain Analytics in 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])
Supply Chain Analytics in Python

Doel:

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

 

Totale vraag:

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)
Supply Chain Analytics in Python

Codevoorbeeld - stap 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])
Supply Chain Analytics in 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)
Supply Chain Analytics in Python

Resultaten

import matplotlib.pyplot as plt
plt.title('Histogram van prod. in regio E')
plt.hist(df['E'])
plt.show()

histogramresultaten van regio E en doelwaarde

Supply Chain Analytics in Python

Samenvatting

Gecapaciteerd fabriekmodel

  • Simulatie vs. gevoeligheidsanalyse
  • Codevoorbeeld doorgenomen
Supply Chain Analytics in Python

Laten we oefenen!

Supply Chain Analytics in Python

Preparing Video For Download...