メディア

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

» 2026年08月20日 11時00分 公開
[江端智一EE Times Japan]

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

特別協賛PR

RSSフィード

公式SNS

All material on this site Copyright © ITmedia, Inc. All Rights Reserved.
This site contains articles under license from AspenCore LLC.