交通流のモデル (ASEPモデル)

一本道を多くの人が一列で歩く場合のシミュレーションをするというものです。
元ネタは、ここです。
「交通流のモデル」
  http://www.cs.kyoto-wu.ac.jp/info-com/numericalModels/RandomProcess/traficmodel.html
一部を抜粋させていただきます。
さて,原理的には,すべての人がこの状態で右に1歩進むことはできるはずだが, 実際には自分の進むべき場所に人がいるとそこが空くまでは進まない。 歩行だけでなく,車の運転でもそういう傾向が見られる。
つまり, 前方に余裕がないと進めないという心理的な傾向があるらしい。 このとき,人々の集団はどのような動きを見せるだろうか。
このようなモデルは ASEP (Asymmetical Simple Exclusion Process, 非対称単純排除)モデルと呼ばれていて, もっとも単純な交通流モデルになっている。

これは車が走る場合によく経験しますよね。特に、信号待ちで並んでいる車が、青信号になっても、すぐには進むことができないというのは、みなさん経験していることと思います。

ここでは、人や車をAgentと呼ぶことにします。
作成したプログラムは、3つの特徴をもったAgentを用意しました。
  1.  前に空きがあると一歩進む。
  2.  前に2つの空きがあると一歩進む。
  3.  前に空きがあるときに、2/3の確率で一歩前に進む。
画面上区別がつくように、グレー、青、赤色分けをしています。 一番右側に進んだAgentは、ぐるっと回って左側に戻るようにしています。 そういう意味では、環状の道路と同じですね。

初期状態は、隙間なくAgentが並んだ状態です。 開始ボタンを押すと、シミュレーションが開始します。
赤信号から青信号になり車が動き出す状態を見ることができます。

また、速度が遅いAgent(赤)がいると、そこで渋滞が発生するのがわかります。 「赤を通常の速度へ」ボタンは、赤のAgentの速度をグレーのAgentと同じ速度にするためのボタンです。 渋滞が徐々に解消されてゆくのがわかります。

僕は、この手の専門家ではないし、ASEPという名前は初めて聞くので、このモデルというか、 僕が作成したプログラムがどれくらい現実的なものなのかはわかりませんが、 まあ、それなりにおもしろい動きになっていると思います。

100個のAgentを動かしていますが、100個のスレッドを立ち上げて、Agentを動かしています。 道を表すRoadクラスは、シングルトンとしました。 Agentを画面上で動かすのは、一定間隔で、道の状態のスナップショットを表示することで実現しています。

このプログラムは、4つのソースから成っています。
  1. MainPage.cs  -  画面の表示部分を受け持っています。ここからは、Simulationだけにアクセスします。
  2. Simulation.cs  -  このシミュレーション全体を管理します。
  3. Road.cs   -  道路を表します。
  4. Agent.cs  -  Agentを表します。

Agentクラスは1台のエージェントを表します。 どのような動きをするのかは、AgentクラスのメンバーであるCharacterクラスとその派生クラスが受け持ちます。
このコードの特徴は、それぞれのAgentにCharacterというプロパティを宣言し、 このCharacterオブジェクトが、どういった性格(色と進むかどうかの判断)なのかを 表している点です。いわゆる「ストラテジーパターン」を使っています。 いろんな性格のAgentクラスを定義してみると面白いかもしれません。

ちょっと長めのコードですが、それぞれのクラスはそれほど複雑なことをしているわけではないので、 読んでいただければご理解いただけると思います。

以下、C#+Silverlightのコードです。

■Agent.cs


■Road.cs


■Simulation.cs


■MainPage.xaml.cs


■MainPage.xaml