サグの影響を受ける渋滞シミュレーション

10EC030 加川 拓也
指導教員 坂本 直志

目次

1 はじめに
2 準備
2.1 渋滞とは
2.2 StarLogo
3 モデル化
4 シミュレーション結果
5 考察
6 まとめ
7 参考文献
    
付録
A1 サグを設置した場合の自動車交通流シミュレーションのソースコード
A2 サグを設置しない場合の自動車交通流シミュレーションのソースコード
        
B 測定データ

1 はじめに

高速道路ではしばしば渋滞が起こる。事故や渋滞が原因で起こる渋滞もあるが、同じ場所で何回も渋滞が起きるケースもある。例として中央自動車道の笹子トンネル前で起こる渋滞がある。 これは経験をした人も多いではないだろうか。これはトンネルに入るときに人が無意識に行う減速と、勾配により自然と減速をしてしまうことが原因で渋滞が起きるとされている。

本研究では、StarLogoを用いて単車線の高速道路にサグ部を設けシミュレーションし、サグが渋滞を引き起こすことを再現する。

StarLogoとはLogoシステムが元となっているシステムであり、Logo言語の多くの機能が利用でき、図形処理、数値処理、リスト処理等を行うことができる。Logo言語とは教育用言語として発展してきた。人工知能言語のLISPをベースに、その設計思想を保持しながら、子供でも扱いやすいように改良されたmini-LISPとも呼ばれる高級言語である。 このLogo言語に対して以下のような拡張をしたものがStarLogoである。

  1. タートルの行動範囲をます目に区切ったものをパッチと呼び、それぞれはセルオートマトンとして機能する。
  2. タートルを無数に持つことができる。ただし、全てのタートルは同一プログラムで並列的に動作する。

2 準備

2.1 渋滞とは

渋滞とは車が集中して交通が滞る現象であるが、コンピュータで取り扱うため、本研究では「先行車によって速度を制限された状態」として扱うとこととする。  渋滞は発生原因から、自然渋滞と突発渋滞とに分けられる。 自然渋滞とは、道路構造条件のために、ある道路がどれだけの車を通すことができるかという、その道路が構造上有している能力である「交通容量」が相対的に小さくなっているような地点を先頭として発生するものであり、その容量を超過する交通需要が生起するたびに、同じ箇所で繰り返し発生する。 一方、突発渋滞とは、交通事故・天災などの突発事象によって、一時的に 交通容量が低下するために起きる渋滞である。

交通の妨げになっている箇所のことを「ボトルネック」というが、高速道路における典型的なボトルネックは、合流部、トンネル部、カーブ区間、幹線道路どうしの交差点、多枝交差点などがあげられる。本研究ではこのボトルネックの1つである、「サグ」を高速道路に設置する。サグとは凹部のことで、図1のような緩やかな下り坂から上り坂に変化するところである。高速道路を走行していてこのサグ部にさしかかると、運手者は意識せずともこの緩やかな上り坂によって減速をしてしまう。この減速に後続車は車間距離をとるためさらなる減速を行い、この車の後続車もまた車間距離をとるためにさらなる減速を行う。この現象が続くことで最終的には一旦停止してしまうほどの渋滞が発生する。例としてあげた中央自動車道の笹子トンネル手前では、トンネル手前にあるサグとトンネルに入る際の無意識な減速による渋滞がしばしば発生している。

図 1: サグのイメージ図

本研究において自動車交通流の特性を把握するために、次の巨視的状態量が用いられる。

(1)交通量および交通流率

交通量(volume: Q)とは、ある時間内に道 路の一点を通過する車両の数をいう。また、特に 1 時間あたりの交通量を交通流率(rate of flow:q, 台/時)という。

(2)密度

密度は、道路の距離軸上での状態量であり、単位延長の道路上に存在する車両の数をいい、通常 1 kmあたり存在台数(台/km)で表される。時間的に変動するので、交通流率等、他の状態量との関係で交通状態を表現する場合は、通常、他の状態量の測定に用いられた集計時間内でサンプリングした密度の平均値が用いられる。密度と関係する個々の車両に着目した微視的な状態量として、車頭距離( si )がある 。これは、各車両の前部バンパ間の距離感覚で、密度は平均車頭距離の逆数として表現される。なお、個々の車の挙動を前後の車両との関係で記述する場合(追従現象など) 、車間距離(intervehicle spacing: D)。

図 2: 交通密度の図

2.2 StarLogo

本研究で使用した StarLogo システムについて説明する。グラフィック画面上にタートルを表示でき、また、タートルの移動範囲のバックグラウンドにパッチと呼ばれるセルオートマトンがある。さらに、これらから情報を得て情報処理を行うため、全権的にタートルやパッチをコントロールする、オブザーバと呼ばれる操作がある。

StarLogo ではこの「タートル」「パッチ」「オブザーバ」についてプログラ ムを行う。 オブザーバが主プログラムになるが、オブザーバで発生させた全てのタートル はタートル用のプログラムに従う。また、画面上の全てのパッチはパッチ用のプログラムに従う。

図 3: StarLogoウィンドウ

初期画面でStar logoウィンドウの右領域にある、黒く四角い画面がグラフィックキャンバスとなっている。この黒色の画面はpatchと呼ばれるものが敷き詰められている。このグラフィックキャンバスのpatch上にturtleが乗っている。初期化された直後はturtleが中央に折り重なった状態になる。プロジェクトを実行すると、実行結果はこのグラフィックキャンバス上に現れる。

モデルの作成者は、モデル化しようとする世界をこのグラフィックキャンバスのなかに構築することになる。StarLogoが提供するものは、モデル化に必要なオブジェクトとモデルの動きを指示するプログラム環境、および操作環境である。StarLogoが提供する基本的なオブジェクトは3種類ある。

1つ目はpatchである。グラフィックキャンバスの中に碁盤の目のように区切られた領域があり、ここでシミュレーションは行われる。この正方形の細かいタイル一枚一枚がpatchと呼ばれるものである。

2つ目はturtleと呼ばれる人口の生き物ある。この生き物は本物の生き物のように生まれたり、動いたり、死んだりと本物の生き物と変わらない振舞いができる。そして、この人口の生き物には本物の生き物にはない能力をもつことができる。そして現実には存在しない仮想の生き物を次々と作り出すことができる。このようにして人口の生き物は単なる生き物としてだけではなく、あらゆるものに見立てることが可能である。今回の研究ではこのturtleを「車」として見立てシミュレーションを行った。turtleは原則としてpatchの敷き詰められたグラフィックキャンバス上に閉じ込められており、止まるのは一枚一枚のpatchの上である。

3つ目はobserverと呼ばれる人物である。このobserverはpatchが敷き詰められたグラフィックキャンバス上には存在しない。patchやturtleとは違う世界に存在しこれらを離れた位置から観察したり、制御したり、生み出したり、消したりするものである。つまりobserverとはStarLogoを操作するわれわれである。

図 4: Control Center ウィンドウ

Control Center ウィンドウには、turtleとobserverを切り替えることができるタブが用意されている。それぞれのタブにCommand CenterペインとProceduresペインがあるため、Control Centerウィンドウは合計で四つの領域から構成されることになる。

StarLogoの命令をCommand Centerペインに入力してEnterキーを押すと命令が実行される。Turtle Command Centerペインはturtleに対して、Observer Command Centerペインはobserverに対して命令を直接入力して実行させることができる画面である。

Proceduresペインにも同様に二つの画面があり、それぞれturtleとobserverのプログラムを記述するための専用の画面である。

3 モデル化

今回のシミュレーションは、前研究として既に行われている「StarLogoによる交通渋滞現象の解析」にて使用されたプログラムを使用している。

ここで使用されたプログラムにサグ部を追加することで高速道路におけるサグによる渋滞を再現する。また、車の設置にランダム性を導入することにより、より本物に近い高速道路をシミュレーションする。

これらを実現するプログラムを作成しStarLogoによりシミュレーションを行う。 実際でのシミュレーション実行画面は図5の通りになる。

図 5: シミュレーション実行画面

プログラム中の各変数の意味を次に示す。 なお、StarLogo における 1 パッチ分の長さを 1[pl]とする。

グローバル変数

タートル変数

パッチ変数

スライダ変数

各変数の意味は次の通りである。

グローバル変数

タートル変数

前研究である「StarLogoによる交通渋滞現象の解析」で使用したプログラムとの変更点はサグ部の導入した点と、車の初期位置にランダム性を取り入れた点である。

 まず、付録A1‘observer’の29行目から33行目までにかけて以下の通りに変更した。


ask-patches
[ifelse (200 > xcor) and (ycor >= 0) and( xcor > 198 )
[setsag 0]
[setsag 1]
]

 本研究では969個のパッチを横に並べて高速道路と見立て、そのうちの1つをサグとする。上のプログラムより1つのパッチを「sag」として関連付けた。

これで特定のパッチをサグとする。次に、付録A2‘turtle’の12行目にて以下の通りに変更した。


if sag = 0[set vtmp vtmp * 0.9]

これで「sag」としたパッチ上を通るタートルの速度に0.9をかける。これで高速道路におけるサグ部を実現する。

次に、付録A1、A2の‘observer’の21行目にて以下の通りに変更した。


set Xcor random 10

これで、等間隔に設置されたタートルを1から10の間からランダムな数で移動する。このようにしてタートルの設置にランダム性を取り入れた。

各パラメータの値は、S= 969、l= 0.4、P l=15 、a=0.005 、b=0.0145 、Vlim =0.22、mt =3000 とする。 車をランダムに配置し、速度0の状態から加速させて、速度が安定したところで測定を開始する。 結果を付録 B に示した。

4 シミュレーション

network
図 6: シミュレーション起動画面

 測定はサグを設置した場合とサグを設置してない場合の2通りをプログラムを変えて行う。

図 7: シミュレーション結果

5 考察

このシミュレーション結果より、一定の交通密度までは交通密度が上がるにつれて交通流率も比例して上がることがわかる。しかし、サグを追加した場合では交通密度が30付近から、またサグがない時では35付近から比例して上がらなくなる。図は東名高速道路の実測値であるが、同じく途中までは交通密度が上がると比例したように交通流率が上がり、一定の交通密度で下がっていくようなq-k相関となる。

今回シミュレーションの交通密度は50までの計測である。サグを設置しない場合のq-k相関は東名高速道路の実測値に近いものとなった。また、サグを設置した場合は渋滞が発生する交通密度が小さくなったため、ピークになる交通密度が小さくなったと考える。

図 8: 東名高速道路のq-k相関

6 まとめ

本研究はStarLogoという無数にタートルを持てる処理系において、各タートルに車の運転ルールを与え、シミュレーションを行った。このシミュレーションよりできた渋滞がタートルの進行方向とは逆に進んでいくことが確認できた。図6のシミュレーション結果より、サグを追加した場合は交通流率のピークが低くなり、ピークになるときの密度も小さくなることが言える。

これらのことからサグが渋滞を引き起こすことが再現できた。

今回の研究では、密度の値を大きくすると前方の自動車を飛び越してしまうバグが発生したため、今後は密度の値を大きくしても正しい実験結果が得られるようにしたい。

7 参考文献

  1. 非集中システム、Mitchel Resnick、Turtles, Termites, and Traffic Jams、山本順人 西岡知之 共訳、コロナ社、2001
  2. StarLogoプログラミング、本郷健 編著、斉藤実 須藤崇夫 堀口真史 著、東京電機大学出版局、2009
  3. 平石隆平 StarLogoによる交通渋滞現象の解析 東京電機大学 ネットワークシステム研究室
  4. 付録

    A1 サグを設置した場合の自動車交通流シミュレーションのソースコード

    StarLogo ファイル
    sagtrafficjam.slogo

    
    ‘turtle’
     
    to drive
    	if ms = true[
    		set xcs Xcor
    		sync
    		if who = 0[
    			set ms false
    		]
    	]
    	set D ( distance xcor-of ahcar ycor-of ahcar ) - l
    	set Db ( v * ( v + b ) ) / ( 2 * b )
    	set Da v + (( a * Pl * ( Pl + 1 )) / 2 ) + (( v + a * Pl ) * (  v + a * Pl  + b ) / ( 2 * b ))
                     if sag = 0[set vtmp vtmp * 0.9]
    		ifelse D < Db[
    			set color red
    			set vtmp vtmp - b
    		][
    			ifelse D > Da[
    				set color yellow
    				set vtmp vtmp + a
    			][
    				set color white
    			]
    		]
    		if vtmp > vlim[ set vtmp vlim ]
    		if vtmp < 0[ set vtmp 0 ]
    		set v vtmp
    		forward v
    	if who = 0[ set stepc stepc + 1 ]
    	sync
    	if me = true[
    		set xce Xcor
    		if who = 0[ set me false ]
    	]
    end
    
    to sync
    	set g g - 1
    	wait-until[ g < 1 ]
    	set g g + 1
    end
    
    to calcflow
    	let [ :xcsz xcs-of 0 ]
    	set q 0
    	if who = 0[ set q q + 1 ]
    	if xcs < :xcsz and :xcsz < xce[ set q q + 1 ]
    	if :xcsz < xce and xce < xcs[ set q q + 1 ]
    	if xce < xcs and xcs < :xcsz[ set q q + 1 ]
    end
     
    
    ‘observer’
     
    globals[ a b S l k q stepc Pl vlim g mt ms me ]
    turtles-own[ v vtmp ahcar D Db Da xcs xce ]
    patches-own[ sag ]
    
    to setup
    	clear-all
    	set S screen-width
    	set l 0.4
    	set a as / 10000
    	set b bs / 10000
    	set Pl 15
    	set vlim 0.22
    	set ms false
    	set me false
    	set mt 3000
    	set stepc 0
    	create-turtles-and-do N[
    		ifelse who = 0[ set ahcar N - 1 ][ set ahcar who - 1 ]
    		set Heading 90
    		set color blue
    		set Xcor random 10
    		set Ycor 0
    		set v 0
    		set vtmp 0
    		forward -1 * who * S / N
    	]
    	set g count-turtles
    	set k count-turtles-with [ (distance l / 2 0) < 100 ]
    ask-patches
    [ifelse (200 > xcor) and (ycor >= 0) and( xcor > 198 )
    [setsag 0]
    [setsag 1]
    ]
    end
    
    to measure
    	set ms true
    	set stepc 0
    	wait-until[ stepc > mt ]
    	set me true
    end
    
    

    A2 サグを設置しない場合の自動車交通流シミュレーションのソースコード

    StarLogo ファイル
    nosagtrafficjam.slogo

    
    ‘turtle’
     
    to drive
    	if ms = true[
    		set xcs Xcor
    		sync
    		if who = 0[
    			set ms false
    		]
    	]
    	set D ( distance xcor-of ahcar ycor-of ahcar ) - l
    	set Db ( v * ( v + b ) ) / ( 2 * b )
    	set Da v + (( a * Pl * ( Pl + 1 )) / 2 ) + (( v + a * Pl ) * (  v + a * Pl  + b ) / ( 2 * b ))
    
    		ifelse D < Db[
    			set color red
    			set vtmp vtmp - b
    		][
    			ifelse D > Da[
    				set color yellow
    				set vtmp vtmp + a
    			][
    				set color white
    			]
    		]
    		if vtmp > vlim[ set vtmp vlim ]
    		if vtmp < 0[ set vtmp 0 ]
    		set v vtmp
    		forward v
    	if who = 0[ set stepc stepc + 1 ]
    	sync
    	if me = true[
    		set xce Xcor
    		if who = 0[ set me false ]
    	]
    end
    
    to sync
    	set g g - 1
    	wait-until[ g < 1 ]
    	set g g + 1
    end
    
    to calcflow
    	let [ :xcsz xcs-of 0 ]
    	set q 0
    	if who = 0[ set q q + 1 ]
    	if xcs < :xcsz and :xcsz < xce[ set q q + 1 ]
    	if :xcsz < xce and xce < xcs[ set q q + 1 ]
    	if xce < xcs and xcs < :xcsz[ set q q + 1 ]
    end
     
    
    ‘observer’
     
    globals[ a b S l k q stepc Pl vlim g mt ms me ]
    turtles-own[ v vtmp ahcar D Db Da xcs xce ]
    
    to setup
    	clear-all
    	set S screen-width
    	set l 0.4
    	set a as / 10000
    	set b bs / 10000
    	set Pl 15
    	set vlim 0.22
    	set ms false
    	set me false
    	set mt 3000
    	set stepc 0
    	create-turtles-and-do N[
    		ifelse who = 0[ set ahcar N - 1 ][ set ahcar who - 1 ]
    		set Heading 90
    		set color blue
    
    		set Xcor random 10
    
    		set Ycor 0
    		set v 0
    		set vtmp 0
    		forward -1 * who * S / N
    	]
    	set g count-turtles
    	set k count-turtles-with [ (distance l / 2 0) < 100 ]
    
    end
    
    to measure
    	set ms true
    	set stepc 0
    	wait-until[ stepc > mt ]
    	set me true
    end
    

    B 測定データ

    交通密度 [k] サグを設置した場合 交通流率[q] サグを設置してない場合 交通流率 [q]
    111
    103333
    206768
    30101100
    40111134
    45111143
    5082150