MATSim実践編――自己中なエージェント1万人を「通勤」させてみる:リタイア直前エンジニアの社会人大学漂流記(6-2)(4/7 ページ)
今回のMATSim(マルチエージェントシミュレーション)実践編では、エージェントの価値観や行動パターンを定義して、「通勤(通学)」させてみます。かなり“人間くさい”価値観を持ったエージェント1万人は、どんな行動を取るのでしょうか。
エージェント1万6000人で実行してみる
ですので、ここは前回ご紹介した、エージェント1万6000人のサンプル「Berlin」を使って、iteration(繰り返し)→Scoring(スコアリング)→replanning(再計画)をやってみようと思います。
前回(第5回)で使った/berlinを/berlin2 として、ディレクトリごとコピーをして、そこで改造をしてみようと思います。
まずconfig.xmlを、以下のように改造します。
<?xml version="1.0" ?> <!DOCTYPE config SYSTEM "http://www.matsim.org/files/dtd/config_v2.dtd"> <config> <module name="global"> <param name="randomSeed" value="4711" /> <param name="coordinateSystem" value="GK4" /> </module> <module name="network"> <param name="inputNetworkFile" value="network.xml.gz" /> </module> <module name="plans"> <param name="inputPlansFile" value="plans_hwh_1pct.xml.gz" /> <!-- 1% sample of commuters、 15931 agents --> </module> <module name="controler"> <param name="outputDirectory" value="./output/berlin2" /> <param name="firstIteration" value="0" /> <param name="lastIteration" value="10" /> <param name="createGraphs" value="false" /> </module> <module name="controler"> <param name= "routingAlgorithmType" value="AStarLandmarks" /> </module> <module name="planCalcScore"> <param name="learningRate" value="1.0" /> <param name="BrainExpBeta" value="2.0" /> <parameterset type="scoringParameters"> <param name="lateArrival" value="-18" /> <param name="earlyDeparture" value="-0" /> <param name="performing" value="+6" /> <param name="waiting" value="-0" /> <parameterset type="modeParams"> <param name="mode" value="car"/> <param name="marginalUtilityOfTraveling_util_hr" value="-6.0" /> </parameterset> <parameterset type="modeParams"> <param name="mode" value="pt"/> <param name="marginalUtilityOfTraveling_util_hr" value="-3.0" /> </parameterset> <parameterset type="modeParams"> <param name="mode" value="walk"/> <param name="marginalUtilityOfTraveling_util_hr" value="-1.0" /> </parameterset> <parameterset type="modeParams"> <param name="mode" value="ride"/> <param name="marginalUtilityOfTraveling_util_hr" value="-5.0" /> </parameterset> <parameterset type="activityParams"> <param name="activityType" value="home" /> <param name="priority" value="1" /> <param name="typicalDuration" value="12:00:00" /> <param name="minimalDuration" value="08:00:00" /> </parameterset> <parameterset type="activityParams"> <param name="activityType" value="work" /> <param name="priority" value="1" /> <param name="typicalDuration" value="08:00:00" /> <param name="minimalDuration" value="06:00:00" /> <param name="openingTime" value="07:00:00" /> <param name="latestStartTime" value="09:00:00" /> <param name="earliestEndTime" value="" /> <param name="closingTime" value="18:00:00" /> </parameterset> <parameterset type="activityParams"> <param name="activityType" value="edu" /> <param name="priority" value="1" /> <param name="typicalDuration" value="08:00:00" /> </parameterset> </parameterset> </module> <module name="strategy"> <param name="maxAgentPlanMemorySize" value="5" /> <!-- 0 means unlimited --> <parameterset type="strategysettings"> <param name="strategyName" value="BestScore"/> <param name="weight" value="0.8"/> </parameterset> <parameterset type="strategysettings"> <param name="strategyName" value="ReRoute"/> <param name="weight" value="0.1"/> </parameterset> <parameterset type="strategysettings"> <param name="strategyName" value="TimeAllocationMutator"/> <param name="weight" value="0.1"/> </parameterset> </module> </config>
エージェントの「価値観/感覚」を定義する
まずは、
<module name="planCalcScore"> (中略) </module>
の部分を説明します。ここは「エージェントが、何を快適/不快と感じるか」を定義しているところになります。
つまり、
- 交通コスト
- 活動満足度
- 遅刻ペナルティ
- 移動苦痛
などを数値化している、“エージェントの(共通)価値観定義ファイル”です。
(1) learningRate
<param name="learningRate" value="1.0" />
これは「新しいscoreを、どれくらい強く反映するか」です。
大きいほど、
- 新しい結果を強く信じる
- 行動変化が激しい
になります。
逆に小さいと、
- 保守的
- 昔のplanを維持
しやすい。
(2) BrainExpBeta
<param name="BrainExpBeta" value="2.0" />
これは「scoreの高いplanを、どれくらい優先するか」を決めています。
大きいほど、
- 高score plan に集中
- 行動固定化
- 収束しやすい
小さいほど、
- ランダム探索
- いろいろ試す
- 振動しやすい
になります。
つまり、「冒険好きか、保守的か」を決めるパラメータです。
(3)lateArrival
<param name="lateArrival" value="-18" />
これは「遅刻ペナルティ」で、かなり大きい負値です。
つまり、
- 遅刻は強烈に嫌
という意味。
(4)performing
<param name="performing" value="+6" />
これは「活動できていることによる満足度」です。
つまり、
- 家にいる
- 働く
- 学校に行く
などを実施できると加点される。
重要なのは、MATSimは「移動そのもの」ではなく、「活動を成立させること」を目的にしている点です。
(5)modeParams
ここが交通コスト。
例えば、
mode="car" marginalUtilityOfTraveling = -6
は、「車移動は1時間あたり -6 util の苦痛」という意味。
PT(public transport)
pt = -3
は、「公共交通の方がラク」という設定。
walk
walk = -1
は、「歩行はさらに苦痛が小さい(歩行の不効用が比較的小さい)」という意味です。
つまりこの世界では、
- 歩くのが嫌じゃない
- 車の方が疲れる
という価値観になっています。
(6)activityParams
ここが「活動の価値」。
home
home: typicalDuration = 12h minimalDuration = 8h
は、
- 家に12時間いたい
- 8時間未満だとかなり不満
という意味。
work
openingTime = 07:00 latestStartTime = 09:00 closingTime = 18:00
つまり、
- 7時前に行っても意味ない
- 9時以降は遅刻扱い
- 18時で終了
みたいな概念です。
つまりMATSimは、「店や職場が開いている/閉まっている」も考慮しています。
(7) この部分のまとめ
これは単なる設定ファイルではありません。MATSimにおける「人間観」そのものです。
つまり、
- 何が快適か
- 何が苦痛か
- 何時間働きたいか
- 遅刻はどれだけ嫌か
- 車は嫌か
- 歩くのは苦痛か
を定義している。
だからMATSimは、「道路を計算している」のではなく、「人間の価値観を数値化している」システムなのです。
Copyright © ITmedia, Inc. All Rights Reserved.