この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)で説明されている「最小限+α」の設定になっています。ざっくり言うと、

  • どのネットワークを使うか(network)

  • どの人口・プランを使うか(plans)

  • 何イテレーション回して、どこに結果を出すか(controller)

  • どうスコアリングするか(scoring)

  • どうリプランニングするか(replanning)

  • 乱数と座標系(global)

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


<module name="global">

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

    • MATSim で使う乱数の種です。MATSim は「同じバージョン+同じ config なら、毎回まったく同じ結果が出る」ように、乱数の初期値を固定しています。ここを変えると、同じシナリオでも別の「世界線」の結果が出ます。

      partOne-latest

  • coordinateSystem = EPSG:6685

    • ネットワークや施設などの座標が、「どの座標系で書かれているか」を指定します。ユーザーガイドの 2.3.4 節で説明されているように、MATSim 内部ではこの座標系で全てを解釈し、可視化や他ツールとの連携で重要になります。

      partOne-latest


<module name="network">

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

    • シミュレーションで使う道路ネットワーク(リンク・ノード)のファイルを指定します。

    • ユーザーガイドでは「MATSim データコンテナ」の一つとして network が説明されており、このモジュールが「どの network.xml を読むか」を決めると書かれています。

      partOne-latest


<module name="plans">

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

    • 100 人分の「一日の活動チェーン+移動プラン」が入った人口ファイルを指定しています。

    • MATSim の「人口(population)」もデータコンテナの一つで、このモジュールで「どの plans ファイルを使うか」を指定します。ユーザーガイドの equil 例でも、同様に plans100.xml を使っています。

      partOne-latest


<module name="controller">

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

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

    • 全ての結果(出力 config、出力ネットワーク、イベント、スコアなど)が、このディレクトリ以下に書き出されます。

  • lastIteration = 10

    • 0 から 10 まで、合計 11 イテレーション回す設定です。

    • MATSim のループ(mobsim→scoring→replanning→…)を何回回すかをここで決めます。

      partOne-latest

  • writeEventsInterval = 1

    • events.xml.gz を何イテレーションごとに出力するかを決めます。

    • 1 なので、全イテレーションの events が保存されます(0 なら出さない、10 なら 10 イテレーションごと、というイメージ)。


<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

グローバルなパラメータ

  • lateArrival = -18

    • 予定より遅れて活動を開始した時のペナルティ係数(「遅れの 1 時間あたり -18 ユーティリティ」など)です。

    • 通勤先に遅刻するとスコアが大きく下がるイメージです。

  • performing = +6

    • 活動を行っている時間から得られる効用の係数です(「活動 1 時間あたり +6 ユーティリティ」など)。

    • 「家にいる」「仕事をしている」時間が、ある典型長さまではプラスに効いていきます。

(実際の単位や正規化の詳細は 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 設定は、

  • 家:12h くらい

  • 仕事:8h くらい(7〜18 時の間に収まるのが望ましい)

  • 遅刻には強いペナルティ

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


<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

  • strategysettingsweight は、「その戦略が選ばれる確率」です(全体で 1 に正規化される)。

戦略 1: BestScore (weight 0.9)

  • strategyName = BestScore, weight = 0.9

    • 90% の確率で、「そのエージェントが持っている複数のプランのうち、現在スコアが最高のものを選ぶ」戦略が適用されます。

    • これは「選択 (plan selection)」の戦略で、新しいプランを作らず、既存のプランの中からベストを選びます。

      partOne-latest

戦略 2: ReRoute (weight 0.1)

  • strategyName = ReRoute, weight = 0.1

    • 10% の確率で、「現在選んでいるプランをコピーして、その中の経路(route)だけを再計算し、新しいプランとして追加・選択する」戦略が適用されます。

      partOne-latest

    • これは「イノベーション戦略(choice set generation)」であり、新しい経路案を少しずつ探索していきます。

    • 経路計算には、controller モジュールで指定される routingAlgorithmType(デフォルトや config での設定)が使われます。

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

  • 毎イテレーション、大半のエージェント (90%) は「今までで一番良かったプラン」をそのまま再利用

  • 少数 (10%) だけが、経路を変えて新しいプランを試す

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

partOne-latest


この config 全体のイメージ

  • 入力は network.xmlplans100.xml のみ(典型的な「equil」レベルの最小構成)。

  • 乱数シードと座標系を明示。

  • 11 回(0〜10 イテレーション)回し、そのたびに events を出力。

  • スコアリングは「自宅 12h/仕事 8h+営業時間」「遅刻ペナルティ」「活動効用」を設定。

  • リプランニングは「BestScore 0.9 + ReRoute 0.1」のみで、時間変更・モード変更などは入れていない。

つまり、**「単純な 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>

この設定でどう動くか

  • replanning は一切行われない

    • 計画の追加・変更・削除は起こらない

    • 毎イテレーション同じルート・同じ出発時刻で走る

  • ただし scoring は内部で計算される(が、あなたの目的上は「無視してよい」ものとして扱える)

  • lastIteration=10 なので、同じ需要を 0〜10 イテレーション分回して、
    events.xml.gzlinkStats, legHistogram などが出力される


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

  • lastIteration0 にすると、イテレーション 0 の 1 回だけ mobsim を実行します。

<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>

未分類

Posted by ebata