IniziaInizia gratis

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.

Table with process names and their duration statistics, namely mean and standard deviation.

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. Monte Carlo trajectories for different process scenario.

Questo esercizio fa parte del corso

Simulazione a eventi discreti in Python

Visualizza il corso

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 in proc_p["score_weight_0_10"].
  • Imposta il ciclo for per eseguire NUM_SIMULATIONS run Monte Carlo usando s come 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
____
Modifica ed esegui il codice