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()
モンテカルロサンプリングのループは、図のように、取り得るプロセスの軌跡を複数本生成します。

この演習はコースの一部です
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)