今回のMATSim(マルチエージェントシミュレーション)実践編では、1万人のエージェントを通勤させた際に発生した「深夜のラッシュ」の要因を探ってみます。
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行は、
という意味になります。
以前、「道路というのは、突き詰めれば『点(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.