始める無料で始める

SimPy を用いた離散事象モデルのモンテカルロサンプリング

それでは、同じモンテカルロサンプリング分析を、モデルの SimPy 版で構築してみましょう。SimPy モデルには、さまざまなプロセスをシミュレートするジェネレーター manufacturing_process と、モデルを複数回実行して、情報を NumPy 配列 time_record に保存する関数 run_monte_carlo があります。

結果をプロットするコードは前の演習で使ったものと似ていますが、ここでは plot_results() という関数にまとめてあります。以下に示します。

def plot_results():

    df_disc = pd.DataFrame({cNam[0]: process_line_space, cNam[1]: time_record})
    fig = sns.lineplot(data=df_disc, x=cNam[0], y=cNam[1], marker="o")
    fig.set(xlim=(0, len(processes) + 1))
    plt.plot() 

モンテカルロサンプリングのループは、図のように、取り得るプロセスの軌跡を複数本生成します。 Monte Carlo trajectories for different process scenario.

この演習はコースの一部です

Pythonで学ぶ離散事象シミュレーション

コースを見る

演習の手順

  • process_duration を反映して待機し、yield します。
  • 現在時刻を time_record に保存します。
  • ダミー変数 t を用いて n_trajectories 回の for ループを回します。
  • SimPy の環境を作成し、プロセスを追加してモデルを実行します。

実践的なインタラクティブ演習

このサンプルコードを完成させて、この演習に挑戦してみましょう。

def manufacturing_process(env):
    global time_record
    for p in range(len(processes)):
        proc_p = processes[p]
        process_duration = random.gauss(proc_p["Average_Duration"], proc_p["Standard_Deviation"])

        # Clock-in and yield the process_duration
        yield ____

        # Save the current time in time_record
        time_record[p + 1] = ____

def run_monte_carlo(n_trajectories):

    # Run a for-loop for n_trajectories samples with dummy variable t
    ____

        # Create the SimPy environment, add processes and run the model
        env = ____
        env.____(manufacturing_process(env))
        env.____()
        
        plot_results()
    plt.show()

run_monte_carlo(n_trajectories = 100)
コードを編集して実行