こぼれネット

このconfig.xmlの内容を解説して下さい ーー とChatGPTに頼んでみた件

<?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.xml" />
	</module>

	<module name="plans">
		<param name="inputPlansFile" value="plans100.xml" />
	</module>

	<module name="controller">
		<param name="outputDirectory" value="./output" />
		<param name="lastIteration" value="10" />

		<!-- 追記:毎イテレーション events を出す -->
		<param name="writeEventsInterval" value="1" />

	</module>

	<module name="scoring">
		<param name="lateArrival" value="-18" />
		<param name="performing" value="+6" />
		<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" />
			<param name="openingTime"     value="07:00:00" />
			<param name="closingTime"     value="18:00:00" />
		</parameterset>
	</module>
	
	<module name="replanning">
		<parameterset type="strategysettings" >
			<param name="strategyName" value="BestScore" />
			<param name="weight" value="0.9" />
		</parameterset>
		<parameterset type="strategysettings" >
			<param name="strategyName" value="ReRoute" />
			<param name="weight" value="0.1" />
		</parameterset>
	</module>




</config>

 

この config.xml は、MATSim 本体と、さきほど貼っていただいたユーザーガイド(Horni/Nagel/Axhausen)で説明されている「最小限+α」の設定になっています。ざっくり言うと、

を指定しています。以下、モジュールごとに説明します。


<module name="global">

<module name="global">
  <param name="randomSeed" value="4711" />
  <param name="coordinateSystem" value="EPSG:6685" />
</module>

<module name="network">

<module name="network">
  <param name="inputNetworkFile" value="network.xml" />
</module>

<module name="plans">

<module name="plans">
  <param name="inputPlansFile" value="plans100.xml" />
</module>

<module name="controller">

<module name="controller">
  <param name="outputDirectory" value="./output" />
  <param name="lastIteration" value="10" />

  <!-- 追記:毎イテレーション events を出す -->
  <param name="writeEventsInterval" value="1" />
</module>

<module name="scoring">

<module name="scoring">
  <param name="lateArrival" value="-18" />
  <param name="performing" value="+6" />
  <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" />
    <param name="openingTime" value="07:00:00" />
    <param name="closingTime" value="18:00:00" />
  </parameterset>
</module>

ここは「プランの良さ(効用/スコア)」をどう計算するかの設定です。ユーザーガイド第 14 章で、Charypar-Nagel の効用関数として詳しく説明されています。

partOne-latest

グローバルなパラメータ

(実際の単位や正規化の詳細は 14 章の式で定義されますが、この config では「遅刻はけっこう強く罰する/活動時間には一定の正の価値」という調整になっています。)

activityParams(活動ごとのパラメータ)

  1. 自宅活動 h

    <parameterset type="activityParams" >
      <param name="activityType" value="h" />
      <param name="typicalDuration" value="12:00:00" />
    </parameterset>
    • タイプ h(home)の活動は、典型的な長さが 12 時間になるようにスコアが組まれます。

    • 1 日 24 時間のうち「家にいる時間」が長めに設定されている、よくある equil 例と同じ形です。

      partOne-latest

  2. 仕事活動 w

    <parameterset type="activityParams" >
      <param name="activityType" value="w" />
      <param name="typicalDuration" value="08:00:00" />
      <param name="openingTime" value="07:00:00" />
      <param name="closingTime" value="18:00:00" />
    </parameterset>
    • タイプ w(work)の活動は、典型的な長さが 8 時間。

    • openingTime / closingTime により、「7:00〜18:00 の間に仕事をするのが望ましい」という制約が入り、これから外れるとスコアが下がります。

    • これもユーザーガイドで説明されている「スケジュール・ディレイ・コスト」の一部です。

      partOne-latest

まとめると、この scoring 設定は、

という行動を「良いプラン」とみなすような効用関数になっています。


<module name="replanning">

<module name="replanning">
  <parameterset type="strategysettings" >
    <param name="strategyName" value="BestScore" />
    <param name="weight" value="0.9" />
  </parameterset>
  <parameterset type="strategysettings" >
    <param name="strategyName" value="ReRoute" />
    <param name="weight" value="0.1" />
  </parameterset>
</module>

ここは、MATSim の「反復のたびにプランをどう変えるか(または選ぶか)」を決める設定です。ユーザーガイド第 4 章の Replanning の説明に対応しています。

partOne-latest

戦略 1: BestScore (weight 0.9)

戦略 2: ReRoute (weight 0.1)

この組み合わせの意味は、

という穏やかな探索です。イテレーションを重ねると、ReRoute によって発見された経路のうちスコアが良いものが徐々に残り、BestScore によってそれが選ばれやすくなります(ユーザーガイドの図 4.4 を参照)。

partOne-latest


この config 全体のイメージ

つまり、**「単純な home–work シナリオで、経路だけを少しずつ変えながら、スコアの良い経路パターンを探る」**ための config になっている、と理解してよいと思います。

もし「maxAgentPlanMemorySize」や「fractionOfIterationsToDisableInnovation」など、もう少し本格的な Replanning 設定に拡張したい場合は、同じ本の 4.6 節をベースに追加していく形になります。

scoringやreplanningは不要です。config.xmlはどのようになりますか?

replanning モジュールは完全に削除してよいですが、scoring は元のまま残してください。

<?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.xml" />
    </module>

    <module name="plans">
        <param name="inputPlansFile" value="plans100.xml" />
    </module>

    <module name="controller">
        <param name="outputDirectory" value="./output" />
        <param name="lastIteration" value="10" />
        <!-- 毎イテレーション events を出力 -->
        <param name="writeEventsInterval" value="1" />
    </module>

    <!-- ★ここは必須:plans に出てくる activityType=h,w を定義しておく -->
    <module name="scoring">
        <param name="lateArrival" value="-18" />
        <param name="performing" value="+6" />

        <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" />
            <param name="openingTime"       value="07:00:00" />
            <param name="closingTime"       value="18:00:00" />
        </parameterset>
    </module>

</config>

この設定でどう動くか


もし「本当に 1 回だけ回せればよい」なら

<param name="lastIteration" value="0" />

まとめると、

  • ❌ scoring モジュールを完全に削る → 「acttype "w" が知らない」と言ってクラッシュ

    • replanning は削ってよい

    • scoring は最小限でもいいので、plans の activityType を全部書く必要あり

この修正版 config を置き換えて実行すれば、エラーは出ずに最後まで走るはずです。

config.xmlは必ずscoringが必要になる、という理解で良いですか

 

だいたい「はい」で良いのですが、少しだけ補足させて下さい。


結論(いまの江端さんの使い方前提)

いまの RunMatsim(example-project の標準コントローラ)で普通に回す限りは、config.xmlscoring モジュールは必須 と考えて下さい。

  • scoring モジュールが

    • config.xml に書かれているか

    • もしくは Java コード側で上書き・追加されているか
      のどちらかが必ず必要です。

そして

  • plans に出てくる すべての activityType(今回は hw)を scoring に定義しておくことが必須

  • 「replanning をしない」「スコア値は気にしない」という場合でも、
    スコアリング自体は内部で動く前提になっているので、設定だけは要る

という仕様になっています。


もう少しだけ厳密に言うと

  • MATSim コアとしては、「config に書かれていない scoring を Java コードで差し替える」というような高度な使い方もできます。

  • しかし、example-project の RunMatsim をそのまま使う今回のようなケースでは、

<module name="scoring"> を config.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.xml" />
	</module>

	<module name="plans">
		<param name="inputPlansFile" value="plans100.xml" />
	</module>

	<module name="controller">
		<param name="outputDirectory" value="./output" />
		<param name="lastIteration" value="0" />

		<!-- 追記:毎イテレーション events を出す -->
		<param name="writeEventsInterval" value="1" />

	</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>
	</module>
	
</config>

モバイルバージョンを終了