複数の脳内小人(コロポックル)で構成された運転手を用いた交通渋滞シミュレーション(頁2) 〜JAVA プログラム
ネスト構造を持つマルチエージェントモデル 前頁へ<< >>次頁へ (Up)
(前頁からの続き)
<シミュレーション:Step2>
〜
コロポックルの階層化 〜
Step2
では、「信号機の有る交差点」/「信号機の無い交差点」での、右折、左折、横断、を行わせるために、 新たに「交差点コロポックル」を追加します。
ところで、交差点での「運転手」は、両側道路からの車注意、信号機注意、一時停止、徐行、歩行者注意 等、色々な判断を同時に行う必要があります。
そこで、「交差点コロポックル」は、さらに内部にコロポックルを持つ構造としました。 この様に、内部に複数のコロポックルを持つコロポックルを「Chunk_Korpokkur」と呼ぶこととし、Javaプログラム上では、インターフェースとして定義しました。 こうして、コロポックルはネスト構造を持つ事となり、運転手は最上位に位置するコロポックルとなります。 別な言葉で言い換えると、「ネスト構造を持つマルチエージェントシステム」となると思います。
最上位のコロポックル(=運転手)は、下位のコロポックルに判断を任せますが、複雑な処理をを行わねばならないコロポックルは、さらに下位のコロポックルに判断を委ねます。ネスト構造を持つ事で、判断の基礎となる「要素単位」が明確となり、それらを組み合わせる事で、複雑な判断を行えます。
コロポックルのネスト構造
下図に、Javaプログラムの、前頁からの修正箇所を示します。
「運転手(Driver)」クラスは既に、「前方車追従コロポックル:OVモデル」、「信号機コロポックル」、「追突防止コロポックル」を持っていましたが、これに「交差点コロポックル」クラスを追加します。 「運転手」も「交差点コロポックル」もインターフェース(ChunkKorpokkur)の実装クラスになります。
「交差点コロポックル」は、内部に、「一時停止コロポックル」、「徐行コロポックル」、「信号コロポックル」、「別道路の横断コロポックル」、「右左折時の別道路への合流コロポックル」等を持ちます。 ここで、「信号機コロポックル」は、「運転手」直下にも存在していました。 交差点と信号機は関連性が高いですが、歩行者横断用の押しボタン信号機など、交差点以外の場所にも信号機が設置されることもあるので、「信号機コロポックル」は「交差点コロポックル」下だけではなく、「運転手」直下にも配置します。 同様に、踏切等では「一時停止」を行いますし、狭い路地等では「徐行」するので、「一時停止コロポックル」、「徐行コロポックル」も運転手直下にも配置しています。 尚、今回は、プログラムを試行錯誤で制作しているため、交差点内の「信号機コロポックル」と、「運転手」直下の「信号機コロポックル」等は別インスタンスとしてありますが、もう少し検討を加えれば、同じインスタンスとしても良いかもしれません。
コロポックルクラスの構造
一時停車した車両が道路を横切る場合の論理は以下のようにしました。
図に於いて、一時停止した車両が道路を渡る時間:Tは T = Sqrt( W/A
)
時間:T内に横断道路に右から近づく車両が進む距離:Dは D = Vnext ×
T
そこで、
右側車両: Dnext > D
且つ、
左側車両: Dprev > ゼロ(交差点内に存在しない)
ならば 発車します。
また、一時停止した車両が、合流する(上図では左折して合流)場合には、以下のようにしました。
左折し、速度:ゼロから加速して一定距離:D0を走行するに要する時間:Tは T=Sqrt(D0/A)
時間:T後の道路の左車両(これから自分が後に付く車両)の交差点からの距離は、D1=Dprev+Vprev
× T
道路右側の車両の距離の条件と、道路左側の車両の距離の条件が、
右側車両: Dnext > Vnext ×
T
且つ、
左側車両: D1 >
D0
ならば 発車します。
横断、合流 何れの場合にも、上記条件が揃わない時には 速度:はゼロのままにします。
シミュレーション「頁3」では、追加した最下位に位置するコロポックルと、交差点コロポックルの動作を確認するため、道路上に 「徐行」、「一時停止」、「信号機」、「信号のない交差点」を配置しました。
縦に走る道路が優先道路なので、横方向の道路を走る車は、優先道路との交差点では、一時停止を行います。 その後、優先道路側の車の走行に「空き」が出来たところで、交差点に侵入します。
「左折」の場合には、優先道路右側からの車の「空き」を待つだけで良いですが、「直進」の場合には、右/左からの車の「空き」を待つ必要があります。 「右折」はもっと複雑で、優先道路側の右/左の車の他にも、対向車線側の車にも注意を払う必要があります。
また、本シミュレーションでは、優先道路(縦方向)側を走行している車両は、交差点で殆どの場合直進しますが、20台に1台の割合で左折、100台に1台の割合で右折します。
また、非優先道路(横方向)側を走行している車両は、4台に1台の割合で左折、5台に1台の割合で右折します。
(.mp4形式動画)
シミュレーション用の通行路(交差点では、非優先道路の車両は一時停止が必要)
シミュレーション内の交差点での車の動きを見ると、以下の様な動作を行っています。
・優先道路(縦方向)の車両は、直進の時には普通の場所と同じような速度で通り過ぎます。 左折車は減速して左折し、交差点を通り過ぎた後加速していきます。 右折車は、減速し、接近した対向車がいる場合にはそれが通りすぎるのを待ってから右折します。
・非優先道路(横方向)から来た車両は、交差点侵入前に一時停止しします。 直進車は左右からの接近車がいない時を見計らって道路を横断します。 左折の際は、右側からの接近車両がいない時に優先道路に侵入します。 右折車は 左右からの車両と同様に対向車にも気を配りながら右折します。
この様に、通常の人間の行為がシミュレーション上に再現されています。
<補足:1>
車両が交差点で右折/左折を行う場合、その決断は交差点でランダムに行われるのでは無く、運転者には目的地が存在し、その目的地へ到達するために交差点で右左折を行い、走行する道路を変更します。
そこで、複数の出発点から到着点の道順を「Route」クラスとして複数個準備し、各出発点から発車した車の「運転手」には必ず「道順(Route)」を持たせます。
運転手は交差点に達したならば、その手順に従い右折/左折/直進を選択します。 出発地や時刻等により運転手に持たせる「道順」を変更すれば、朝夕の通勤や、休日・イベント等による車の流れを創り出す事が可能です。
<補足:2> セルオートマトンモデルとの比較
本モデルでは、道路の車線を有向線分(本モデルでは「トラック」と呼ぶ)として扱い、各車両は必ず線分(折れ線でも可)上を移動するとしてモデルを制作しています。 こうすると、田舎道の様に長い間隔を置いて交通に関連するオブジェクトが存在する場合には、道路をセルに分割して計算するよりも(1セル内には車が1台しか入れない)計算上有利と思われます。右左折専用レーン等が存在しても、その場所に短いトラックを追加し、そのトラックとの接続点や交点(車両が別のトラックに乗り換える場所)を設定すると、比較的簡単に道路変更が可能です。
一方、大型店舗や行楽地の駐車場等、車の動きを「線」ではなく「面」として考えなければならない時には、本モデルでは対応不能で、セルオートマトンモデルを使用しなければ計算が困難と思われます。
<参考文献>
1) 杉山雄規著 交通流の物理(<特集>交通流)
Physics of Traffic Flow(<Special Reviews>Traffic Flow)
(2003)
2) 小松輝久著
交通渋滞と粉体の渋滞(<特集>交通流) Traffic Congestion and
Granular Jamming(<Special Reviews>Traffic Flow) (2003)
3) M.A.アービブ著 『脳』 ューラルネットと脳理論 (株)サイエンス社(1992)
4) Norman D.
Cook著 ブレインコード 紀伊國屋書店(1988)
5) 本間三郎著 人間の脳−その未知なるもの− 朝倉書店(1989)
キーワード: 交通渋滞、マルチエージェント、ネスト構造、シミュレーション、Javaプログラム
初版:2014/2/24 |