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.

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ă.

Acest exercițiu face parte din cursul
Simulare de evenimente discrete în Python
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 înproc_p["score_weight_0_10"]. - Configurează bucla for pentru a rula
NUM_SIMULATIONSiterații Monte Carlo, folosindsca 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
____