1. Lära sig
  2. /
  3. Courses
  4. /
  5. Python으로 배우는 이산 사건 시뮬레이션

Connected

exercise

제조 최적화: Score & Rank

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

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

이 연습에서 플롯을 생성하는 데 사용하는 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 샘플링 루프는 가능한 공정 궤적을 여러 개 생성하고 점수를 매깁니다. 아래 그림과 같습니다. Monte Carlo trajectories for different process scenario.

Instruktioner

100 XP
  • 각 공정의 점수 기여도를 더하세요. 공정의 소요 시간은 process_duration_all[s, p]에, 해당 가중치는 proc_p["score_weight_0_10"]에 저장되어 있어요.
  • 더미 변수 s를 사용해 for 루프가 NUM_SIMULATIONS번의 Monte-Carlo 실행을 수행하도록 설정하세요.
  • 함수 run_monte_carlo()에 저장된 Monte Carlo 엔진을 실행하세요(그러면 "score"와 "rank" 플롯이 모두 생성됩니다).