CommencezCommencez gratuitement

Optimisation de fabrication : Score & Rank

Utilisons le même modèle à événements discrets de l'usine d'horloges murales et mettons en place une routine d'optimisation « Score & Rank ». Pour vous faciliter la tâche, le procédé de fabrication est de nouveau résumé dans le tableau ci-dessous. L'information a été stockée dans une liste de dictionnaires nommée processes, avec un dictionnaire par procédé. Les clés de ces dictionnaires correspondent aux en-têtes de colonnes du tableau.

Table avec les noms des procédés et leurs statistiques de durée, soit la moyenne et l'écart type.

La méthode plot_results() utilisée pour générer les graphiques dans cet exercice a été préchargée et est présentée ci-dessous.

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

La boucle d'échantillonnage de Monte-Carlo produira une série de trajectoires de procédés possibles et leur attribuera un score, comme illustré dans la figure. Trajectoires Monte Carlo pour différents scénarios de procédé.

Cette activité fait partie du cours

Simulation d'événements discrets en Python

Voir le cours

Instructions de l’exercice

  • Ajoutez la contribution au score de chaque procédé, en sachant que la durée des procédés est stockée dans process_duration_all[s, p] et leur poids respectif dans proc_p["score_weight_0_10"].
  • Paramétrez la boucle for pour exécuter NUM_SIMULATIONS lancements Monte-Carlo avec s comme variable muette.
  • Lancez le moteur Monte Carlo stocké dans la fonction run_monte_carlo() (cela générera les graphiques « score » et « rank »)

Exercice interactif pratique

Essayez cet exercice en complétant ce code d’exemple.

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
____
Modifier et exécuter le code