Localizzazione di impianti con capacità - caso di studio P4

Analytics per la supply chain con Python

Aaren Stubberfield

Supply Chain Analytics Mgr., Ingredion

Simulazione vs analisi di sensibilità

Con analisi di sensibilità:

  • Osserva come variazioni di domanda e costi influenzano la produzione:
    • Dove aggiungere produzione?
    • La produzione si sposta in un'altra regione?
    • Quali regioni hanno volumi stabili?
  • Confronta più variazioni insieme vs una alla volta con l'analisi di sensibilità
Analytics per la supply chain con Python

Modellazione di simulazione

Possiamo applicare test di simulazione al nostro modello di localizzazione di impianti con capacità

 

Possibili input per aggiungere rumore

  • Domanda
  • Costi variabili
  • Costi fissi
  • Capacità
Analytics per la supply chain con 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])
Analytics per la supply chain con Python

Obiettivo:

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

 

Domanda totale:

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)
Analytics per la supply chain con Python

Esempio di codice - passo 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])
Analytics per la supply chain con 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)
Analytics per la supply chain con Python

Risultati

import matplotlib.pyplot as plt
plt.title('Istogramma della prod. nella regione E')
plt.hist(df['E'])
plt.show()

risultati dell'istogramma della regione E e obiettivo

Analytics per la supply chain con Python

Riepilogo

Modello di impianto con capacità

  • Simulazione vs analisi di sensibilità
  • Esempio di codice passo-passo
Analytics per la supply chain con Python

Provalo tu!

Analytics per la supply chain con Python

Preparing Video For Download...