検索
連載

MATSim実践編――自己中なエージェント1万人を「通勤」させてみるリタイア直前エンジニアの社会人大学漂流記(6-2)(3/7 ページ)

今回のMATSim(マルチエージェントシミュレーション)実践編では、エージェントの価値観や行動パターンを定義して、「通勤(通学)」させてみます。かなり“人間くさい”価値観を持ったエージェント1万人は、どんな行動を取るのでしょうか。

Share
Tweet
LINE
Hatena

「自己中のエージェント」作りをやってみよう

 さて、自己中のエージェント作り、早速やってみましょう。

 まず、エージェント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.

ページトップに戻る