1. 学ぶ
  2. /
  3. コース
  4. /
  5. Pythonで学ぶ離散事象シミュレーション

Connected

演習

製造最適化: Score & Rank

同じ壁掛け時計工場の離散事象モデルを使い、「Score & Rank」最適化ルーチンを設定しましょう。参考として、製造プロセスを下表に再掲します。情報は processes という辞書のリストに保存されており、各プロセスにつき1つの辞書があります。各辞書のキーは表の列見出しに対応しています。

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.

指示

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」の両方のプロットが生成されます)。