検索
連載

MATSim実践編――「深夜ラッシュ」の謎を解くリタイア直前エンジニアの社会人大学漂流記(7-2)(1/3 ページ)

今回のMATSim(マルチエージェントシミュレーション)実践編では、1万人のエージェントを通勤させた際に発生した「深夜のラッシュ」の要因を探ってみます。

Share
Tweet
LINE
Hatena
リタイア直前エンジニアの社会人大学漂流記

3年間の休載を経て戻ってきました。休載していた理由は、私はリタイア(定年退職)間際だったにもかかわらず、「MAS(マルチエージェントシミュレーション)」を研究すべく、社会人のまま大学院博士課程に突っ込んでいったからです。なぜ“そんなこと”になったのか――。そして私をそこまでさせた「MAS」とは何なのか。社会人大学院生の実態を赤裸々に語りつつ、MASを技術的に深掘りしていきます。
⇒連載バックナンバーはこちらから

「不完全な道具」でも組み合わせて動かし続けるしかない

 前半の「コモンズの悲劇とカタコト英語から考える「世界を少しだけマシにするもの」」では、日本人の英語コンプレックスと、『コモンズのガバナンス』についてお話ししました。

 要するに、完璧な英語も、完璧な制度も、永遠にやってこない。ならば、手元にある不完全な道具を組み合わせ、動かし、監視し、壊れたら直すしかない――という話です。

 後半では、この考え方を、そのままMAS(MATSim)に持ち込みます。

 今回は、前回の「MATSim実践編――自己中なエージェント1万人を「通勤」させてみる」から続いている問題――「勤勉なドイツ国民」の続編である、

――「深夜ラッシュ(24時付近)」って何だ?

の話を続けたいと思います。

 ただ、その前に、ちょっとした小ネタを一つお話しします。

 以下のコマンドを実行すると、

$ cd ~/matsim-example-project
$ mvn \
-Dexec.mainClass=org.matsim.project.RunMatsim \
-Dexec.args="examples/berlin2/config.xml" exec:java

 その途中で、こんなふうに出ます。


[クリックで拡大]

 これは、MATSimがQSimで1日の交通流シミュレーションを進めている途中経過ログです。NEW QSimとは、MATSimの中で実際に1日の交通流を動かしている交通流シミュレータ本体であるQueue Simulationです

 道路リンクを「キュー」、つまり待ち行列として扱い、各エージェントや車両をネットワーク上で時間進行させるMATSim標準のmobsim(mobility simulation)です。

2026-07-09T00:42:20,560 INFO QSim:552 SIMULATION (NEW QSim) AT 09:00:00 : #Veh=15931 lost=0 simT=3600.0s realT=5s; (s/r): 720.0

上記のログの意味は以下の通りです。

表示 意味
2026-07-09T00:42:20,560 実際にPC上でこのログが出た時刻
INFO 通常情報ログ。エラーではない
QSim:552 QSimクラスの552行目付近から出ているログ
SIMULATION (NEW QSim) MATSim標準の交通流シミュレータ QSim が動いている
AT 09:00:00 シミュレーション内の時刻が9:00に到達した
#Veh=15931 QSimが扱っている車両数が15931台
lost=0 迷子・処理不能・ネットワーク上で消失した車両が0
simT=3600.0s シミュレーション開始から3600秒進んだ
realT=5s 実PC上では5秒かかった
(s/r): 720.0 シミュレーション速度。実時間1秒でシミュレーション720秒分進んでいる

つまり、この1行は、

  • MATSim内の時刻が9:00になりました。
  • 1万5931台の車両を処理中です。
  • 迷子車両はありません。
  • シミュレーション時間3600秒分を、実時間5秒で処理しました(これはこれで、すごいな(江端))。

という意味になります。

 以前、「道路というのは、突き詰めれば『点(Node)』と『線(Way)』の集まりである」という話をしました。これを、もう少し乱暴に言い換えれば、「道路は『土管』を組み合わせたもの」と言えます。

 太い土管であれば、たくさんの車や人を流すことができます。しかし、細い土管になれば、当然、流せる量は少なくなり、詰まりやすくなります。つまり、渋滞しやすくなる、ということです。

 QSimとは、この「道路=容量つきの土管」という考え方に基づき、その中に車や人を流し込んで、どこで流れ、どこで詰まるのかをシミュレーションする仕組みなのです。


[クリックで拡大]

 つまるところ、このQSimこそが、MATSimにおける「交通のリアル」を実現している仕組みなのです

 ―― で、まあ私は今、自作のシミュレータ(EBASim)の方に、このQSimの仕組みを組み込もうと考えています。というのも、現在の私のシミュレータには、渋滞を発生させる仕組みが組み込まれていないからです。


[クリックで拡大]

 MATSimでは、この「土管ごとの流入・流出・滞留」の計算を、network.xml に定義された道路リンクの集合に対して行っています。

 つまり、都市全体を、無数の「容量つき土管」のネットワークとして扱い、そこにエージェントや車両を流し込み、「どこで流れ、どこで詰まるのか」を、時間を進めながら計算しているわけです。

 これが、MATSimのすごさの一つです。

深夜ラッシュの正体

 では、ここからは、「深夜ラッシュ(24時付近)」って何だ?の話をやっつけていきたいと思います。

 plans_hwh_1pct.xml.gzを解凍して、plans_hwh_2pct.xmlというファイル名にして(恐ろしく巨大なファイルになりましたが)、それを読み込んで、ようやく原因が分かりました。

 原因は、こいつです。

<act type="work" link="13816" x="4562224.935893458" y="5831830.1171124475" start_time="08:00" dur="08:00" end_time="24:00" ref_id="917" />

 出発開始時刻が08:00、滞在時間が8時間、そして活動終了時間が24:00 ―― そんなバカなことが発生する訳がありません。

 出発時刻が08:00、滞在時間が8時間であるなら、退社時刻は16:00になるはずです。つまり、これは、活動終了時刻が二重定義されていたのです。

 で、取りあえず、

	<module name="plans">
		<param name="inputPlansFile" value="plans_hwh_1pct.xml.gz" /> 
	</module>

	<module name="plans">
		<param name="inputPlansFile" value="plans_hwh_1pct.xml.gz" /> 
		<param name="activityDurationInterpretation" value="minOfDurationAndEndTime" />
	</module>

と変更してみました。これで、plans.xml内でdurとend_timeが併記されている場合に、end_time="24:00"へ固定される問題を避けることができます。

 これにより、start_time + durとend_timeを比較し、早い方の時刻が活動終了時刻として採用されます

 その結果、「深夜ラッシュ(24時付近)」が、以下のようになりました。

(変更前)


[クリックで拡大]

(変更後)


[クリックで拡大]

 うん、24時に帰宅というケースは、ほぼなくなったようです(0.legHistogram_all.pngと、10.legHistogram_all.png)。ただ、他のグラフを調べてみると、まだ変なところがあるようなのです。

Copyright © ITmedia, Inc. All Rights Reserved.

       | 次のページへ
ページトップに戻る