はじめに
シミュレーションを用いた検証というのもよく研究で用いるので紹介してみます。
もうすでにシミュレーション使って記事書いているんですけどね。
電車が止まった後に電車が動いた時に、調整で待つときありますよね。今回は、その理由を簡単なシミュレーションで示してみます。
シミュレーション
電車が止まった後に動き出す事を想定して、駅で1200人待っている状態から混雑が避けられるようになるまでの時間をシミュレーションします。
流入人数や流入の上限などを定義して同じ駅にいる人数をシミュレーションしていきます。
非常に簡易化したモデルで、単純に駅の混雑がどの程度避けられるか確認するためのモデルです。
今回は、遅延制御のありなしで比較を行い、混雑を避けられるまでの時間を評価軸とします。
詳しくは、コードを参照ください。
import numpy as np
import matplotlib.pyplot as plt
# -----------------------
# パラメータ
# -----------------------
T = 120 # シミュレーション時間(分)
N0 = 1200 # 初期混雑人数
N_safe = 200 # 安全水準
lambda_in = 5 # 途中流入(人/分)
mu = 50 # 乗車能力(人/分)
C = 800 # 列車定員
headway = 5 # 列車間隔(分)
base_dwell = 1 # 通常停車時間(分)
extra_wait = 2 # 混雑時に追加で待たせる時間(分)
N_th = 400 # 制御発動しきい値
control = True # 意図的遅延あり / なし(ここのみ変更して検証)
# -----------------------
# 状態変数
# -----------------------
N = N0
N_history = []
delay_sum = 0
clear_time = None
# -----------------------
# シミュレーション
# -----------------------
for t in range(T):
# 途中流入
N += lambda_in
# 列車到着
if t % headway == 0:
dwell = base_dwell
if control and N > N_th:
dwell += extra_wait
delay_sum += extra_wait
board = min(mu * dwell, N, C)
N -= board
N_history.append(N)
# 解消判定
if clear_time is None and N <= N_safe:
clear_time = t
# -----------------------
# 結果表示
# -----------------------
time = np.arange(T)
plt.figure()
plt.plot(time, N_history)
plt.axhline(N_safe, linestyle="--")
plt.axhline(N_th, linestyle=":")
plt.xlabel("Time [min]")
plt.ylabel("Number of passengers")
plt.title("Clearing initial congestion")
plt.show()
print(f"混雑解消時間: {clear_time} 分")
print(f"累積追加遅延: {delay_sum} 分")
シミュレーション結果
時間調整なし
混雑解消時間: None 分
累積追加遅延: 0 分
時間調整あり
混雑解消時間: 55 分
累積追加遅延: 14 分
結論
遅延時間は発生するが、混雑は早く避けられる。
できるだけ一度に多く詰めて運ぶという発想ですね。
※遅延制御なしでは、混雑が時間内に解消されておらず値がNoneになっています。
さいごに
結構有名な話かもしれませんが、電車の遅延の例にして、シミュレーションの有効活用の例を紹介しました。
パラメータをいじってみるとどのくらい時はどうすればよいなんてのもつかめてきたりします。
これはかなり簡易化したモデルで世の中にはもっとちゃんとしたモデルもあると思いますが、モデル化やシミュレーションはこんな形で役に立っています。
コードは GitHub に置いてあります:

