Soluzione: test di simulazione

Analytics per la supply chain con Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Attenzione

  • Evita LP o IP per problemi che richiedono molto tempo per risolversi

immagine di avviso, uomo che scivola

Analytics per la supply chain con Python

Concetto generale

Concetto generale:

  • Aggiungi rumore casuale agli input chiave che scegli
  • Risolvi il modello più volte
  • Osserva la distribuzione
Analytics per la supply chain con Python

Perché provarla

Perché:

  • Gli input sono spesso stime: rischio di inesattezze.
  • L’analisi di sensibilità vista prima cambiava un input alla volta.
Analytics per la supply chain con Python

Contesto

Contesto - Vetreria - Pianificazione risorse:

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

Vincoli:

  • Vincoli di domanda, capacità produttiva e magazzino

Rischi:

  • Le stime dei profitti possono essere inaccurate
Analytics per la supply chain con 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()
Analytics per la supply chain con Python

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

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

Esempio di codice - passo 5

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

Output: (i risultati possono variare)

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

Visualizza come istogramma

Prodotto A: istogramma di prodotto a, b, c e obiettivo

Prodotto B: istogramma del prodotto b

Prodotto C: istogramma del prodotto c

Valori obiettivo: istogramma dei valori dell'obiettivo

Analytics per la supply chain con Python

Riepilogo

  • Non usarla per problemi che richiedono molto tempo per risolversi
  • Vantaggi

    • Vedi come cambiano gli ottimi al variare degli input
  • Passi

    1. Parti dal codice PuLP standard
    2. Aggiungi rumore agli input chiave con normalvariate di Python
    3. Incapsula il modello PuLP in una funzione che restituisce l'output
    4. Crea un loop che chiama la funzione e salva i risultati in un DataFrame
    5. Visualizza il DataFrame dei risultati
Analytics per la supply chain con Python

Provalo!

Analytics per la supply chain con Python

Preparing Video For Download...