Ottimizzazione della produzione: Score & Rank
Usiamo lo stesso modello a eventi discreti della fabbrica di orologi da parete e configuriamo una routine di ottimizzazione "Score & Rank". Per tua comodità, il processo produttivo è riassunto di nuovo nella tabella qui sotto. Le informazioni sono state memorizzate in una lista di dizionari chiamata processes, con un dizionario per ciascun processo. Le chiavi di ogni dizionario corrispondono alle intestazioni delle colonne della tabella.

Il metodo plot_results() usato per generare i grafici in questo esercizio è stato caricato in anticipo ed è mostrato qui sotto.
def plot_results(objective_func):
# Score
fig, axes = plt.subplots(1, len(processes), sharey=True, figsize=(10, 8))
for p in range(len(processes)):
sns.scatterplot(ax=axes[p], x=process_duration_all[:, p], y=objective_func, c=objective_func, cmap="turbo_r")
axes[p].set_title(processes[p]["Name"], rotation = 20, horizontalalignment='left')
axes[p].set_xlabel("Duration [min]", rotation = -10)
axes[p].grid()
axes[0].set_ylabel("Objective function score")
plt.show()
# Rank
index_sort = np.argsort(objective_func)
fig, axes = plt.subplots(1, len(processes), sharey=True, figsize=(10, 8))
for p in range(len(processes)):
sns.lineplot(ax=axes[p], x=np.linspace(0, NUM_SIMULATIONS, NUM_SIMULATIONS),
y=process_duration_all[index_sort, p], color="orchid")
axes[p].set_title(processes[p]["Name"], rotation = 20, horizontalalignment='left')
axes[p].set_xlabel("Score-ranked scenarios", rotation = -10)
axes[p].grid()
axes[0].set_ylabel("Duration [min]")
plt.show()
Il loop di campionamento Monte Carlo produrrà una serie di possibili traiettorie dei processi e le valuterà con un punteggio, come mostrato nella figura.

Questo esercizio fa parte del corso
Simulazione a eventi discreti in Python
Istruzioni dell'esercizio
- Aggiungi il contributo al punteggio di ciascun processo, sapendo che la durata dei processi è memorizzata in
process_duration_all[s, p]e il rispettivo peso inproc_p["score_weight_0_10"]. - Imposta il ciclo for per eseguire
NUM_SIMULATIONSrun Monte Carlo usandoscome variabile fittizia. - Esegui il motore Monte Carlo nella funzione
run_monte_carlo()(questo genererà sia i grafici di "score" sia di "rank")
Esercizio pratico interattivo
Prova a risolvere questo esercizio completando il codice di esempio.
def objective_function_calc():
objective_func = np.ones(NUM_SIMULATIONS)
for s in range(NUM_SIMULATIONS):
for p in range(len(processes)):
proc_p = processes[p]
# Add the score contribution of each process
objective_func[s] += ____
plot_results(objective_func)
def run_monte_carlo():
# Set the for-loop to run NUM_SIMULATIONS Monte-Carlo runs
____
env = simpy.Environment()
env.process(manufractoring_process(env, s))
env.run()
objective_function_calc()
# Run the Monte Carlo function
____