제조 최적화: Score & Rank
같은 벽시계 공장의 이산 사건(Discrete-Event) 모델을 사용해 "Score & Rank" 최적화 루틴을 설정해 보세요. 편의를 위해 제조 공정은 아래 표에 다시 정리했습니다. 이 정보는 각 공정을 하나의 딕셔너리로 담은 딕셔너리 리스트 processes에 저장되어 있으며, 딕셔너리의 키는 표의 열 머리글에 대응합니다.

이 연습에서 플롯을 생성하는 데 사용하는 plot_results() 메서드는 미리 로드되어 있으며 아래에 나와 있어요.
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()
Monte-Carlo 샘플링 루프는 가능한 공정 궤적을 여러 개 생성하고 점수를 매깁니다. 아래 그림과 같습니다.

이 연습은 강의의 일부입니다
Python으로 배우는 이산 사건 시뮬레이션
연습 안내
- 각 공정의 점수 기여도를 더하세요. 공정의 소요 시간은
process_duration_all[s, p]에, 해당 가중치는proc_p["score_weight_0_10"]에 저장되어 있어요. - 더미 변수
s를 사용해 for 루프가NUM_SIMULATIONS번의 Monte-Carlo 실행을 수행하도록 설정하세요. - 함수
run_monte_carlo()에 저장된 Monte Carlo 엔진을 실행하세요(그러면 "score"와 "rank" 플롯이 모두 생성됩니다).
실습형 인터랙티브 연습
이 예제를 이 샘플 코드를 완성하여 풀어보세요.
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
____