MATSim実践編――自己中なエージェント1万人を「通勤」させてみる:リタイア直前エンジニアの社会人大学漂流記(6-2)(3/7 ページ)
今回のMATSim(マルチエージェントシミュレーション)実践編では、エージェントの価値観や行動パターンを定義して、「通勤(通学)」させてみます。かなり“人間くさい”価値観を持ったエージェント1万人は、どんな行動を取るのでしょうか。
「自己中のエージェント」作りをやってみよう
さて、自己中のエージェント作り、早速やってみましょう。
まず、エージェント2人分をさくっと作成しましょう。こちらはplans-test1.xml(plans.xml)です。
<?xml version="1.0" ?>
<!DOCTYPE plans SYSTEM "http://www.matsim.org/files/dtd/plans_v4.dtd">
<plans xml:lang="ja">
<person id="1">
<plan>
<act type="h" link="1" end_time="08:00:00" />
<leg mode="car" />
<act type="w" link="10" end_time="08:10:00" />
<leg mode="car" />
<act type="shop" link="11" end_time="08:20:00" />
<leg mode="car" />
<act type="w" link="12" end_time="08:30:00" />
<leg mode="car" />
<act type="shop" link="11" end_time="08:40:00" />
<leg mode="car" />
<act type="w" link="10" end_time="08:50:00" />
<leg mode="car" />
<act type="h" link="1" />
</plan>
</person>
<person id="2">
<plan>
<act type="h" link="100" end_time="08:00:00" />
<leg mode="car" />
<act type="w" link="11" end_time="08:10:00" />
<leg mode="car" />
<act type="shop" link="10" end_time="08:20:00" />
<leg mode="car" />
<act type="w" link="9" end_time="08:30:00" />
<leg mode="car" />
<act type="shop" link="12" end_time="08:40:00" />
<leg mode="car" />
<act type="w" link="11" end_time="08:50:00" />
<leg mode="car" />
<act type="h" link="100" />
</plan>
</person>
</plans>
さて、iteration(繰り返し)→Scoring(スコアリング)→replanning(再計画)を本格的に組み込んでみます。config-test1.xml(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="EPSG:6685" />
</module>
<module name="network">
<param name="inputNetworkFile" value="network-test1.xml" />
</module>
<module name="plans">
<param name="inputPlansFile" value="plans-test1.xml" />
</module>
<module name="controller">
<param name="outputDirectory" value="scenarios/equil5/output" />
<param name="lastIteration" value="10" />
<!-- 追記:毎イテレーション events を出す -->
<param name="writeEventsInterval" value="1" />
</module>
<!-- =======================================
QSim (重要: walk を mainModes に入れる)
=============================================-->
<module name="qsim">
<!-- car だけだと walk は qsim 対象外になりやすい -->
<param name="mainMode" value="car" />
<!-- 1人実験なら渋滞等は本質でないので適当でよい -->
<param name="endTime" value="30:00:00" />
</module>
<!?スコアリングの基準値 -->
<module name="scoring">
<parameterset type="activityParams" >
<param name="activityType" value="h" />
<param name="typicalDuration" value="12:00:00" />
</parameterset>
<parameterset type="activityParams" >
<param name="activityType" value="w" />
<param name="typicalDuration" value="08:00:00" />
</parameterset>
<parameterset type="activityParams" >
<param name="activityType" value="shop" />
<param name="typicalDuration" value="00:30:00" />
</parameterset>
</module>
<!? エージェントの戦略 -->
<module name="strategy">
<param name="maxAgentPlanMemorySize" value="5" />
<parameterset type="strategysettings">
<param name="strategyName" value="ReRoute" />
<param name="weight" value="0.8" />
</parameterset>
<parameterset type="strategysettings">
<param name="strategyName" value="ChangeExpBeta" />
<param name="weight" value="0.2" />
</parameterset>
</module>
<module name="routing">
<!-- 既に書いてある他の routing パラメータがあればそのまま残す -->
<!-- ネットワーク整合性チェックを無効化 -->
<param name="networkRouteConsistencyCheck" value="disable" />
</module>
</config>
さて、<!?スコアリングの基準値 -->のところを見てください。
要するに、以下のような行動を取れるエージェントは『幸せ』ということに決めつけるのです。
- 自宅で過ごす時間が12時間
<param name="typicalDuration" value="12:00:00" />
- 職場で過ごす時間が8時間
<param name="typicalDuration" value="08:00:00" />
- 店舗に立ち寄る時間が30分
<param name="typicalDuration" value="00:30:00" />
で、ここが重要なのですが、エージェントは、この値の時間を「幸せ」として目指します―― 長くも短くもなく、ジャストでこの時間が「最高」なのです。全てのエージェントは、この時間を目指します(ちょっと気持ち悪いかもしれませんが)。そして、ここで重要なのは、「他の人(エージェント)や街の交通がどうなろうが、知ったことではない」という、空気を読まない振る舞いにあります。
さて、次に<!? エージェントの戦略 -->です。
<param name="maxAgentPlanMemorySize" value="5" />
これは「各エージェントが、過去のplanを最大5個記憶する」という意味です。
例えば、
- Plan A : 8:00出発
- Plan B : 7:45出発
- Plan C : 別ルート
- Plan D : 電車
- Plan E : バス
みたいに保持できます。つまり、各エージェントは、「前にうまくいった行動」を覚えているわけです。
<param name="strategyName" value="ReRoute" /> <param name="weight" value="0.8" />
これは「経路(route)を変更してみる」戦略です。
つまり、
- 同じ出発時刻
- 同じ目的地
でも、「別の道路を試してみる」を行います。
weight=0.8 は「80%くらいの割合で、この戦略を使う」という意味です。つまり、かなり頻繁に経路変更します。
例えば、
昨日: A道路 → 渋滞
今日: B道路を試す
みたいな感じです。
<param name="strategyName" value="ChangeExpBeta" /> <param name="weight" value="0.2" />
これは「過去planの中から、scoreの高かったものを選びやすくする」戦略です。
例えば、
| Plan | 内容 | Score |
|---|---|---|
| A | 8:00出発 | -120 |
| B | 7:45出発 | -80 |
| C | 別ルート | -90 |
なら、
- B が選ばれやすい
- ただし確率的
- 完全固定ではない
という動きをします。つまり、「以前、比較的マシだった行動を、また試す」です。
この2つを組み合わせると、MATSimのエージェントは、
- 以前マシだったplanを覚えつつ
- たまに別ルートを試し
- 少しずつ改善を探す
ようになります。つまり、「昨日より少しマシな一日(12時間自宅にいて、8時間職場で働き、30分店舗に入る)」を探し続けている。
ところがですね、エージェント2人の場合、ほとんど変更が発生しませんでした。これは仕方がないことです。たった2人しかいないガラガラの街の中で、再計画(replanning)が発生しようがありません。
Copyright © ITmedia, Inc. All Rights Reserved.