MATSim実践編――自己中なエージェント1万人を「通勤」させてみる:リタイア直前エンジニアの社会人大学漂流記(6-2)(6/7 ページ)
今回のMATSim(マルチエージェントシミュレーション)実践編では、エージェントの価値観や行動パターンを定義して、「通勤(通学)」させてみます。かなり“人間くさい”価値観を持ったエージェント1万人は、どんな行動を取るのでしょうか。
謎の「深夜ラッシュ」が発生した理由
さて、この設定を作って、実際に回してみましょう。
今、作成したディレクトリは、こんな感じになっているはずです。
以下のコマンドを実行します。
$ cd ~/matsim-example-project $ mvn \ -Dexec.mainClass=org.matsim.project.RunMatsim \ -Dexec.args="examples/berlin2/config.xml" exec:java
この出力結果は、ここに格納されます。
ここに10回分の繰り返しを行った結果が入っています。
ただ、このディレクトリに入っているファイルの中で画像ファイルを表示してみたのですが ―― なんか変。
これは、output/berlin2/ITERS/it.0(初期状態)と、it.10の中に入っている0.legHistogram_all.png という図です。all : 全交通モード対象、it.0 : iteration 0(初期状態、まだ学習前)です。it.10は10回目の状態を示しています。
この図は、「人々がいつ移動を開始し、いつ到着し、どれくらいの人数が移動中だったか」を時系列で見たものです。赤(departures):その時間帯に「出発した人数」、青(arrivals):その時間帯に「到着した人数」、緑(en route):その時間帯に「移動中だった人数」を示しています。
「朝ラッシュが存在する」は、いいんですよ。問題は「深夜ラッシュも存在する」ことです(これは、後で説明します)。
イテレーション10回目の方の結果を見ると、Y軸の最大値が4倍くらいになっています。これは、エージェントが「最適時刻」に収束し始めた―― エージェントが自分勝手に動いて、都市交通に渋滞を生み出して、状況を悪化させている ―― の典型例です。
MATSimでは、エージェントは「できるだけギリギリに出発したい」方向へ収束しやすく、その結果として、ネットワーク上(道路上)に大量の車両が滞留する、という現象が発生します。
―― とはいえ、「深夜ラッシュ(24時付近)」って何だ? と思いますよね。
そこで私、berlin2のplans.xml(正確には plans_hwh_1pct.xml.gz)を読んでみました。
すると、
<act type="work" ... start_time="08:00" dur="08:00" end_time="24:00"/>
という記述のエージェントが大量に存在していました。「ベルリンの人、みんな深夜労働するのか……?」と思ったのですが、さらにconfig.xmlを読むと、
<param name="performing" value="+6" />
という設定があり、長時間活動(=職場滞在)が有利になるようなスコア設定になっていました。
最初、私は、「MATSimの時刻最適化が、不自然な方向へ暴走したのではないか」と考えましたが、その後さらに調べてみると、どうもそういう話ではなかったようです。
そもそもBerlinサンプルは、ScoringやReplanningを前提にしたチューニング済みサンプルではなく、私(江端)が強制的にそのモードを持ち込んで実験していたため、時刻設定やactivity定義の前提条件を、私が十分に確認していなかったために発生した問題のようでした。
つまり、今回の「深夜ラッシュ」は、
- Scoring設定
- Replanning
- plans.xmlのactivity時刻
- サンプルデータの前提条件
などが複合して発生したものであり、「MATSimが長時間労働へ最適化した」というわけではありませんでした。このあたりは、次回までに設定を整理し、あらためて解析し直してみようと思っています。
今回は取りあえず、
- Scoring
- Replanning
の仕組みそのものが動作していることまでは確認できました。
それにしても、MATSimは半端な知識では動いてくれない、なかなかに手ごわいツールであることを、あらためて実感しています。
Copyright © ITmedia, Inc. All Rights Reserved.

