ÎncepețiÎncepe gratuit

Optimizarea producției: Score & Rank

Vom folosi același model cu evenimente discrete al fabricii de ceasuri de perete și vom configura o rutină de optimizare „Score & Rank". Pentru referință, procesul de producție este rezumat din nou în tabelul de mai jos. Informațiile sunt stocate într-o listă de dicționare numită processes, câte un dicționar per proces. Cheile acestui dicționar corespund antetelor coloanelor din tabel.

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

Metoda plot_results() folosită pentru a genera graficele din acest exercițiu a fost preîncărcată și este prezentată mai jos.

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

Bucla de eșantionare Monte Carlo va genera o serie de traiectorii posibile pentru procese și le va scora, după cum este ilustrat în figură. Monte Carlo trajectories for different process scenario.

Acest exercițiu face parte din cursul

Simulare de evenimente discrete în Python

Vezi cursul

Instrucțiuni pentru exercițiu

  • Adaugă contribuția la scor a fiecărui proces, știind că durata proceselor este stocată în process_duration_all[s, p], iar ponderile corespunzătoare în proc_p["score_weight_0_10"].
  • Configurează bucla for pentru a rula NUM_SIMULATIONS iterații Monte Carlo, folosind s ca variabilă de parcurgere.
  • Rulează motorul Monte Carlo stocat în funcția run_monte_carlo() (aceasta va genera atât graficul „score", cât și graficul „rank").

Exercițiu interactiv practic

Încearcă acest exercițiu completând acest cod de exemplu.

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
____
Editează și rulează codul