<?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">
-
randomSeed = 4711
-
MATSim で使う乱数の種です。MATSim は「同じバージョン+同じ config なら、毎回まったく同じ結果が出る」ように、乱数の初期値を固定しています。ここを変えると、同じシナリオでも別の「世界線」の結果が出ます。
partOne-latest
-
-
coordinateSystem = EPSG:6685
-
ネットワークや施設などの座標が、「どの座標系で書かれているか」を指定します。ユーザーガイドの 2.3.4 節で説明されているように、MATSim 内部ではこの座標系で全てを解釈し、可視化や他ツールとの連携で重要になります。
partOne-latest
-
<module name="network">
-
inputNetworkFile = network.xml
-
シミュレーションで使う道路ネットワーク(リンク・ノード)のファイルを指定します。
-
ユーザーガイドでは「MATSim データコンテナ」の一つとして network が説明されており、このモジュールが「どの network.xml を読むか」を決めると書かれています。
partOne-latest
-
<module name="plans">
-
inputPlansFile = plans100.xml
-
100 人分の「一日の活動チェーン+移動プラン」が入った人口ファイルを指定しています。
-
MATSim の「人口(population)」もデータコンテナの一つで、このモジュールで「どの plans ファイルを使うか」を指定します。ユーザーガイドの equil 例でも、同様に
plans100.xmlを使っています。partOne-latest
-
<module name="controller">
-
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">
ここは「プランの良さ(効用/スコア)」をどう計算するかの設定です。ユーザーガイド第 14 章で、Charypar-Nagel の効用関数として詳しく説明されています。
partOne-latest
グローバルなパラメータ
-
lateArrival = -18
-
予定より遅れて活動を開始した時のペナルティ係数(「遅れの 1 時間あたり -18 ユーティリティ」など)です。
-
通勤先に遅刻するとスコアが大きく下がるイメージです。
-
-
performing = +6
-
活動を行っている時間から得られる効用の係数です(「活動 1 時間あたり +6 ユーティリティ」など)。
-
「家にいる」「仕事をしている」時間が、ある典型長さまではプラスに効いていきます。
-
(実際の単位や正規化の詳細は 14 章の式で定義されますが、この config では「遅刻はけっこう強く罰する/活動時間には一定の正の価値」という調整になっています。)
activityParams(活動ごとのパラメータ)
-
自宅活動
h-
タイプ
h(home)の活動は、典型的な長さが 12 時間になるようにスコアが組まれます。 -
1 日 24 時間のうち「家にいる時間」が長めに設定されている、よくある equil 例と同じ形です。
partOne-latest
-
-
仕事活動
w-
タイプ
w(work)の活動は、典型的な長さが 8 時間。 -
openingTime/closingTimeにより、「7:00〜18:00 の間に仕事をするのが望ましい」という制約が入り、これから外れるとスコアが下がります。 -
これもユーザーガイドで説明されている「スケジュール・ディレイ・コスト」の一部です。
partOne-latest
-
まとめると、この scoring 設定は、
-
家:12h くらい
-
仕事:8h くらい(7〜18 時の間に収まるのが望ましい)
-
遅刻には強いペナルティ
という行動を「良いプラン」とみなすような効用関数になっています。
<module name="replanning">
ここは、MATSim の「反復のたびにプランをどう変えるか(または選ぶか)」を決める設定です。ユーザーガイド第 4 章の Replanning の説明に対応しています。
partOne-latest
-
strategysettingsのweightは、「その戦略が選ばれる確率」です(全体で 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.xmlとplans100.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.gzやlinkStats,legHistogramなどが出力される
もし「本当に 1 回だけ回せればよい」なら
-
lastIterationを0にすると、イテレーション 0 の 1 回だけ mobsim を実行します。
<param name="lastIteration" value="0" />
というわけで、とりあえず、江端の実験用の最小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>