読者です 読者をやめる 読者になる 読者になる

理科系の備忘録

Linux/Ubuntu/Mac/Emacs/Computer vision/Robotics

セルオートマトンによる渋滞シミュレーション

プログラミング

はじめに

年末年始に渋滞学という本を読んだ。
車の渋滞だけではなく、緊急時の避難や蟻の行列、通信についても書かれていて勉強になった。

渋滞学 (新潮選書)

渋滞学 (新潮選書)

渋滞とセルオートマトン

交通をモデル化して解析することを交通流解析と呼ぶ。交通流モデルは連続モデルと離散モデルに分けられ、連続モデルでは最適速度過程がよく用いられる。離散モデルでは、セルオートマトンがよく用いられており、「渋滞学」でもこれについて説明されていた。


セルオートマトンによるモデルとして有名なものとして次のようなものがある。

  • Rule 184

前方に空きがあれば車を進める

  • ASEP

前方に空きがあればある確率で車を進める

  • Fukui-Ishibashi(FI)

高速度に対応

  • Nagel-Schreckenberg(NS)

高速度に対応
ランダムブレーキ効果に対応

  • Quick Start

前方(2台先)の車の動きを見通して車を進める

  • Slow to Start

車の慣性を考慮し、一度止まるとゆっくり進める

実装してみた

本当は上に書いたモデルを全部織り込みたかったが、なにしろセルオートマトンも交通流解析も素人なので、高速度対応は諦めた。
f:id:kenbell1988:20170212163136g:plain

黄 < 青 < 緑の順で車格が大きく発進が遅い(Slow)。また、1台先の動きを見通して発進し始める(Quick)。ブレーキを踏んでいる間は赤色の枠が出る。

f:id:kenbell1988:20170212162026g:plain
こちらは標準出力で、SMLが黄青緑に対応しており、下の数字が発進までのカウントになっている。先の車が動くとカウントを減らすことで、SlowとQuickを実装した。

ASEPモデルでは動ける車が前進するかどうかを確率できめるが、今回は動いている車をランダムに停車(発車までのカウントが初期化)or減速(カウント1加算)させるようにアレンジしてみた。

渋滞の基本図

交通流の密度と流量に注目しこれらの関係をq-k相関、プロットしたものを交通流の基本図と呼ぶ。基本図を見ると、渋滞前後で相が転移していることがわかる。高速道路での実測値はググればでてくるが、「人型」(英語ではλ型)のグラフとなる。今回自作したモデルでシミュレーションを行い、基本図をプロットしてみた。

f:id:kenbell1988:20170212164201p:plain

基本図を見ると、密度0.15あたりを境にして状態が変化しており、ここを境に渋滞が発生している。また、相が転移する直前にはある密度にたいして二つの流量が同時に存在していおり、「人型」となっていることがわかる。

実際に相が変わるあたりの密度に設定して様子を確認してみる。

密度0.10
f:id:kenbell1988:20170212164202g:plain
密度0.15
f:id:kenbell1988:20170212164204g:plain
密度0.30
f:id:kenbell1988:20170212164203g:plain

相転移付近では「このままうまくいけばスムーズに流れるが、何かの拍子で渋滞が発生してしまうような緊張状態」が発生していると考えられる。例えば、急な割り込みで誰かがブレーキを踏めばそこから一気に渋滞が発生してしまうような状態だと言える。

まとめ

今回、1次元のセルオートマトンを使って、1車線の交通流のシミュレーションを行った。ASEPモデルにスロースタートとクイックスタートを加えることで、実際の渋滞と同様の基本図が書けることを確認した。

モデルを良くすること以外には、2車線に対応させる、分岐をつくる、など暇な時間にやってみたい。