Aan de slagGa gratis aan de slag

Productieoptimalisatie: Score & Rank

Laten we hetzelfde discrete-eventmodel van de wandklokkenfabriek gebruiken en een "Score & Rank"-optimalisatieroutine opzetten. Voor je gemak staat het productieproces hieronder nogmaals samengevat in de tabel. De informatie is opgeslagen in een lijst met woordenboeken met de naam processes, met één woordenboek per proces. De sleutels in dit woordenboek komen overeen met de kolomkoppen in de tabel.

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

De methode plot_results() die wordt gebruikt om de grafieken in deze oefening te genereren is alvast ingeladen en staat hieronder.

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

De Monte Carlo-samplinglus produceert een reeks mogelijke procestrajecten en kent er scores aan toe, zoals te zien is in de figuur. Monte Carlo trajectories for different process scenario.

Deze oefening maakt deel uit van de cursus

Discrete Event Simulation in Python

Cursus bekijken

Oefeninstructies

  • Voeg de score-bijdrage van elk proces toe, met de wetenschap dat de duur van processen is opgeslagen in process_duration_all[s, p] en hun respectieve gewicht in proc_p["score_weight_0_10"].
  • Stel de for-lus in om NUM_SIMULATIONS Monte Carlo-runs uit te voeren met s als dummyvariabele.
  • Start de Monte Carlo-engine die is opgeslagen in de functie run_monte_carlo() (dit genereert zowel de "score"- als de "rank"-grafieken)

Praktische interactieve oefening

Probeer deze oefening eens door deze voorbeeldcode in te vullen.

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
____
Code bewerken en uitvoeren