このplans.xmlの内容を解説して下さい ーー とChatGPTに頼んでみた件
<?xml version="1.0" ?>
<!DOCTYPE plans SYSTEM "http://www.matsim.org/files/dtd/plans_v4.dtd">
<plans xml:lang="de-CH">
<person id="1">
<plan>
<act type="h" x="-25000" y="0" link="1" end_time="06:00" />
<leg mode="car">
<route> </route>
</leg>
<act type="w" x="10000" y="0" link="3" dur="00:10" />
<leg mode="car">
<route> </route>
</leg>
<act type="w" x="10000" y="0" link="11" dur="03:30" />
<leg mode="car">
<!-- ここは書かない(MATSim に任せる) -->
</leg>
<act type="h" x="-25000" y="0" link="1" />
</plan>
</person>
</plans>
以下、この plans.xml を「1日の行動ストーリー」として順にほどく形で解説します。
MATSim を理解する上で重要なポイントも併せて整理します。
1. ファイル全体の位置づけ
<!DOCTYPE plans SYSTEM "http://www.matsim.org/files/dtd/plans_v4.dtd">
<plans xml:lang="de-CH">
-
plans_v4.dtd
→ MATSim の 人口(plans)ファイルの仕様 -
xml:lang="de-CH"
→ 言語情報(動作にほぼ影響なし、慣習的指定)
2. person と plan の関係
<person id="1">
<plan>
...
</plan>
</person>
-
このファイルには 1人(id=1)だけが登場
-
<plan>は「その人の1日の行動計画」 -
複数
<plan>を持たせることも可能(choice set)
→ 今回は1つだけ
3. 行動と移動は必ず交互に並ぶ
MATSim の基本構造は:
act → leg → act → leg → act → ...
4. 最初の activity(自宅)
<act type="h" x="-25000" y="0" link="1" end_time="06:00" />
意味
-
自宅(h)で滞在
-
座標:
(-25000, 0) -
所属リンク:
link="1" -
06:00 にこの活動を終了
👉
この人は朝6時に家を出る
ポイント
-
最初の activity は必ず end_time
-
duration (
dur) は使わない
5. 最初の移動(家 → 職場)
<leg mode="car">
<route> </route>
</leg>
移動手段:car-
<route>は空
→ MATSim がシミュレーション中に経路探索する
✅ これは正しい・推奨される書き方です
6. 短時間の仕事(準備・立ち寄りなど)
<act type="w" x="10000" y="0" link="3" dur="00:10" />
意味
-
職場(w)で 10分滞在
-
到着時刻は自動的に計算
-
滞在時間のみ指定
👉
「ちょっと立ち寄る」「準備」「受付」的な活動と解釈できる
7. 移動(職場内・別地点へ)
<leg mode="car">
<route> </route>
</leg>
-
car 移動
-
経路は再び MATSim 任せ
8. 本命の仕事活動
<act type="w" x="10000" y="0" link="11" dur="03:30" />
-
同じ
w(仕事)だが 別リンク -
3時間30分 滞在
👉
同じ activityType を1日に何度使ってもよい
MATSim は activityType の意味ではなく、
時間配分と移動評価に関心があります。
9. 帰宅移動(経路未指定)
<leg mode="car">
<!-- ここは書かない(MATSim に任せる) -->
</leg>
<act type="h" x="-25000" y="0" link="1" />
-
<route>すら書いていない -
✅ これでOK
MATSim は:
-
出発地点:直前の activity
-
到着地点:次の activity
が分かっていれば、経路を生成します。
10. 最後の activity(帰宅)
<act type="h" x="-25000" y="0" link="1" />
ポイント
-
end_time も dur も指定しない
-
= 1日の終点
👉
「家に帰って一日が終わる」という意味
11. この1人の1日を言葉で書くと
この人は
朝6時に自宅を出て車で移動し、
職場に10分立ち寄り、
さらに別の仕事地点で3時間半働き、
車で帰宅して一日を終える。
という 完全に整合した MATSim 的1日です。
12. 実務的に大事な注意点
✅ activityType は意味を持たない
-
hやwはタグ -
scoring に定義されていればOK
✅ 複数 w があっても問題なし
-
滞在時間評価は合算される
✅ route は基本「書かない」
-
書くのは特殊ケースのみ
13. 最小限の「正しい plans.xml」の条件
-
act / legが交互 -
最初の act に end_time
-
すべての activityType が scoring に定義済み
-
最後の act は時間指定なしでOK
一言まとめ
plans.xml は「人ごとの1日の台本」であり、
MATSim はこれを守りつつ、
経路・所要時間・渋滞を現実的に再構成する。
この理解を持っていれば、
今後どんな plans.xml を読んでも迷わなくなります。
<act type="h" x="-25000" y="0" link="1" end_time="06:00" /> の x="-25000" y="0" は座標でしょうか。
network.xmlの座標から大きく乖離しているようですが、問題はないでしょうか?
はい、順に整理して説明します。
1. x="-25000" y="0" は何か
<act
type="h"
x="-25000"
y="0"
link="1"
end_time="06:00" />
この
x="-25000" y="0"
は 活動地点の座標(平面直交座標) です。
EPSG:6685 を使っているので、単位はメートルです。
2. では、この座標は本当に使われているのか?
結論から言うと:
この行では、x,y は実質的に無視されています。
理由は link="1" が同時に指定されているから です。
3. MATSim における「座標」と「link」の優先順位
MATSim では activity の位置指定には2通りあります。
✅ 方法 A:座標指定
<act
x="1234"
y="5678" />
-
座標から 最寄りリンクを MATSim が探索
-
初心者向け・簡易入力向け
✅ 方法 B:リンク指定
<act
link="1" />
-
リンクが最優先
-
座標は使われない(あっても飾り)
✅ 両方書いた場合(今回)
<act
x="-25000"
y="0"
link="1" />
MATSim の動作:
-
link="1"を使う -
x,yは位置決定に使わない -
一貫性チェックも特にしない
👉 network.xml の link=1 に紐づく位置が使われる
4. network.xml と大きく乖離していても問題ないか?
今回の答え
✅ 問題ありません(link を指定している限り)
MATSim は
-
activity → link -
link → node 座標
という関係で内部位置を決めるため、
x,y がネットワーク座標系と合っていなくても
実害は出ません
5. では、なぜ x,y が書いてあるのか?
これは 歴史的/例示的な理由 がほとんどです。
-
古い example
-
座標指定と link 指定の両対応デモ
-
外部ツールとの互換性(可視化など)
実務的には冗長 です。
6. 実務上のおすすめルール
✅ network がある場合(通常)
<act
type="h"
link="1"
end_time="06:00" />
👉 x,y は書かない
✅ network がない/簡易ケース
<act
type="h"
x="-25000"
y="0"
end_time="06:00" />
👉 link は書かない
❌ 混在は避ける(読み手が混乱)
<act
x="..."
y="..."
link="..." />
7. 例外的に座標も意味を持つ場合
次のような場合のみです:
-
output_events を GIS に投げる
-
活動位置を後処理で再利用
-
link を削除して座標ベースに切り替える予定
それ以外では 意味を持ちません。
8. 一言でまとめると
linkを書いた時点で、x,yは無視される。
network と乖離していても問題は起きない。
ただし、設定としては冗長なので消すのが正解。
この理解で正確です。
今回は、 <route> </route> のようにルートがブランクにしています。
これは本来、network.xmlのnodeかlinkの番号をその順番に記載するものであり、ブランクの場合は、適当な最短距離計算アルゴリズムが適用される と考えているのですが、この理解で正しいでしょうか?
はい、その理解は 本質的に正しい です。
ただし、MATSim 内部で起きていることを正確な言葉に直すと、次の説明になります。
結論(短く)
✅
<route> </route>(空、または route 要素自体がない)場合、
MATSim が mobsim 実行前に「初期ルーティング」を自動計算する✅ 計算は network.xml の link を用いた最短経路探索
✅ ノードではなく リンク列(link id の並び) が生成される
✅ 使われるアルゴリズムは config で指定された routingAlgorithmType
1. <route> に本来書くもの
car モードの場合、正式にはこうです:
<leg mode="car">
<route type="links">1 2 3 7 9</route>
</leg>
-
link ID の列
-
node ID ではない(←ここ重要)
-
ETX: 必ず network.xml の
<link id="...">と一致する
2. 今回のように <route> が空の場合
<leg mode="car">
<route> </route>
</leg>
<leg mode="car" />
MATSim の内部動作は次の通りです:
-
population 読み込み時点では
→ ルートは 未定義 -
Controler 起動時
→ 初期ルーティングフェーズが走る -
各 leg について:
-
出発 activity の link
-
到着 activity の link
を取得
-
-
network.xml 上で
出発 link → 到着 link の最短経路を計算 -
計算結果のリンク列を 内部 route として補完
👉 そのあと mobsim が実行されます。
3. 「適当な最短距離計算」なのか?
✅「最短経路」ではある
❌「適当」ではない(設定に厳密に従う)
使われるアルゴリズムは controller モジュールで指定されます:
<module name="controller">
<param name="routingAlgorithmType" value="SpeedyALT" />
</module>
-
SpeedyALT(高速 A* 系) がデフォルト
他に:
-
Dijkstra
-
AStarLandmarks
などがあります(後方互換用)。
4. 距離だけ?時間は?
重要な点です。
初期ルーティングは:
-
free speed
-
距離
-
リンク属性
に基づく 初期最適ルートです。
✅ 混雑はまだ考慮されません
✅ 交通量による遅れは 1 iteration 目の結果
5. iteration が進むとどうなるか?
replanning が有効なら:
-
ReRoute戦略が -
events(実際の混雑)から travel time を再学習
-
ルートを書き換え
今回のケースでは:
<param name="strategyName" value="ReRoute" />
-
iteration 0:初期最短経路
-
iteration 1以降:混雑を考慮した再ルート
という流れになります。
6. 重要な注意点(よくある誤解)
❌ ノード番号を書くと思っていた
→ 間違い(link 番号です)
❌ route が空だと teleport される
→ 間違い(car モードは必ず routing)
✅ route を書かない = MATSim に任せる
→ 正解
7. 実務的な理解(おすすめの言い換え)
<route>を空にする/書かない場合、
MATSim は activity の link 情報を使って
network.xml 上で初期ルート(リンク列)を自動生成する。
使用されるアルゴリズムは config に従う。
8. 最後に一文で
✅ あなたの理解は正しい。
ただし「node ではなく link」「アルゴリズムは設定に依存」
という2点だけ補足すれば完全。
"teleport"とは何でしょうか?
MATSim における **teleport(テレポート)**とは、
✅ ネットワーク上を実際に走らせずに、
出発地点から到着地点へ「瞬間移動させる」移動の扱い
を意味します。
SF 的な意味ではなく、計算上の簡略化手法です。
1. 何が起きているか(直感的説明)
通常(car など):
-
ネットワーク上の link を1本ずつ進む
-
混雑・容量制約・順番待ちを受ける
-
events が大量に発生する
teleport の場合:
-
✅ ネットワークを一切使わない
-
✅ 移動開始 →(計算上の所要時間経過)→ 移動終了
-
✅ 混雑・渋滞・容量制約なし
2. teleport はいつ使われる?
(1) MATSim が その mode を知らないとき
例:
<leg mode="bike" />
→ 自動的に teleport
(2) 明示的に teleport モードとして定義したとき
<module name="planscalcroute">
<param name="teleportedModeSpeed_walk" value="1.34" />
</module>
-
walk / bike / goods など
-
ネットワークを使わず距離と速度だけで計算
(3) 初期段階・簡略分析のため
-
「まず挙動だけ確認したい」
-
「大量モードで mobsim を重くしたくない」
→ teleport は非常に有効
3. teleport で何が計算される?
teleport でも以下は計算されます:
| 項目 | 計算される? |
|---|---|
| 移動時間 | ✅ |
| 到着時刻 | ✅ |
| スコア | ✅ |
| 混雑影響 | ❌ |
| link enter/leave event | ❌ |
移動時間の計算式(概念):
直線距離 ÷ 設定速度
または
距離 × detourFactor ÷ 速度
4. teleport と car の決定的違い
| 項目 | car | teleport |
|---|---|---|
| ネットワーク使用 | ✅ | ❌ |
| 混雑 | ✅ | ❌ |
| 容量制約 | ✅ | ❌ |
| events | 多い | 少ない |
| 計算負荷 | 高い | 非常に低い |
5. 重要:teleport は「逃げ」ではない
よくある誤解ですが、
❌ teleport = 手抜き
✅ teleport = 設計上の正当な近似
MATSim の思想:
重要なモードだけを mobsim に載せ、
それ以外は teleport で扱う
例:
-
car → 厳密
-
bus → 厳密
-
walk → teleport
-
bike → teleport
は 非常に一般的です。
6. 今回の文脈との関係
あなたのケースでは:
<leg mode="car">
<route> </route>
</leg>
理由:
-
car は QSim がサポートするモード
-
route が空でも「初期ルーティング」が走る
teleport になるのは:
<leg mode="unknownMode" />
7. 一文まとめ
teleport とは、ネットワークを使わず、距離と速度だけで移動を表現する MATSim の簡略移動方式である。
必要であれば
「teleport がスコアにどう影響するか」「walk/bike をどう設定すべきか」
も整理できます。
network.xmlを読んでいると、<node>は点、<link>は線のように読めます。
plans.xmlは地点を現わしているように見えるのに、<link>で指定しているのは何故でしょうか?
とても重要で、MATSim の設計思想そのものに関わる点です。
結論から先に述べます。
結論(先出し)
plans.xml で <act> が <link> を指定するのは,
MATSim では「人はノードではなくリンク上に存在する」という設計になっているからです。
1. network.xml の役割のおさらい
network.xml では:
-
<node>:
👉 幾何学的な点(交差点・結節点) -
<link>:
👉 交通が流れる実体(道路・線分)
です。
ここまでは直感通りです。
2. では、plans.xml は何を表しているか?
plans.xml に書かれている <act> は、
❌「単なる地点情報」
✅「交通ネットワーク上で活動が行われる位置」
を表します。
MATSim にとって重要なのは、
-
どこに「点」として存在するか
ではなく、 -
どのリンクに接続されて交通に出入りするか
です。
3. なぜ node ではなく link なのか?
理由①:交通は link 上で流れるから
MATSim の交通シミュレーション(QSim)では、
-
車両は link から link へ移動する
-
node は単なる接続点にすぎない
という扱いです。
もし活動が node にあると、
-
どの link に車両を出すのか?
-
複数 link がある交差点ではどちら?
が曖昧になります。
理由②:実世界の活動は「道路沿い」にある
現実でも:
-
家
-
職場
-
店舗
-
駐車場
は、
「交差点の真ん中」ではなく
道路(リンク)の途中
にあります。
MATSim はこの現実感を重視しています。
理由③:容量・渋滞・滞留を正しく扱うため
活動開始・終了では、
-
車両が link に流入 / 流出
-
link の容量制約を受ける
必要があります。
node に活動を置くと、
-
同時発進
-
ゼロ距離滞留
など、物理的に変な状態が起きやすくなります。
4. では x, y 座標は何のため?
<act type="h" x="-25000" y="0" link="1" />
-
link="1" が本質
-
x, y は 補助的な地理情報
です。
役割は:
-
初期ルーティング
-
可視化
-
facilities を使わない簡易表現
MATSim の内部処理では、
✅ 最終的に link が優先される
と考えて差し支えありません。
5. link が指定されていると何が起こるか?
活動終了 → leg 開始のとき:
-
person は そのリンク上に車両を生成
-
QSim がその link の最後尾に並べる
-
次の link に進む
この一連の処理が自然に成立します。
6. もし node だけで書いたら?
MATSim 的には:
-
❌ node 指定は不可(原則)
-
✔ link が必須
理由はすべて上記の設計に起因します。
7. 図的に言うと
node ●───link────● node
↑
activity
activities は link に「ぶら下がる」 もの
→ node ではなく link
8. 一文まとめ(論文向け)
MATSim では,交通流がリンク上でモデル化されるため,活動地点は幾何学的な点ではなくネットワークリンクに紐づけて定義される。
この理解ができていると、
-
facilities.xml の役割
-
x,y と link の関係
-
teleport と network の境界
が一気に整理できます。
<route> </route>の間にlink番号を入れるとしたら、linkの連続性をユーザが管理しなければならないことになります。
連続性が壊れている場合は、どのような取り扱いになりますか?
結論から述べます。
はい、その理解で正しく、
かつ「連続性が壊れている route は即エラー or 事前検証で弾かれる」
という扱いになります。
以下、段階的に整理します。
1. <route> に link を明示的に書く場合の意味
<leg mode="car">
<route>1 5 9 12</route>
</leg>
「この順番の link を“必ず”通れ」
と指示することを意味します。
この時点で、
-
これは 最短経路探索ではない
-
ルーティング責任は 完全にユーザ側
になります。
2. MATSim は連続性を自動補完しない
非常に重要な点です。
❌ MATSimは
-
欠けている link を補完しない
-
node 連結を推測しない
-
「近そうだから繋ぐ」ことをしない
✅ MATSimが行うのは
-
記述された route が network.xml 上で成立しているかの検証
-
成立しなければ 例外を投げて停止
です。
3. 連続性が壊れている例
network.xml
link 1: node A → B
link 2: node B → C
link 3: node D → E
plans.xml
<route>1 3</route>
-
link 1 の終点 = B
-
link 3 の始点 = D
👉 非連続
4. この場合の挙動
✅ 発生する典型的なエラー
実行時または読み込み時に:
-
java.lang.IllegalStateException -
Route is not valid -
Unknown or disconnected link in route
などの 致命的エラー が発生します。
✅ 正規の route でないものは「修正されず」「黙殺されず」「必ず落ちる」
これは設計的に 非常に健全 です。
5. なぜ自動補完しないのか?
理由は明確です。
(1) 研究再現性
-
route を書いたのが人間か
-
アルゴリズムか
を 区別できなくなる。
(2) 渋滞・容量解析の破壊を防ぐ
途中を勝手に補完すると、
-
意図しない link に車両が流れる
-
交通量計測が破綻する
(3) MATSim は「交通物理」を優先する
曖昧な指定は許さない
正しくなければ止める
という思想です。
6. 逆に、<route> を空にするとどうなるか?
<route> </route>
-
MATSim が
-
現在の scoring
-
travel disutility
-
ネットワーク
-
-
を使って 動的にルートを計算
✅ この場合のみ MATSim が連続性を保証します。
7. 使い分けの指針(重要)
| 目的 | routeの書き方 |
|---|---|
| 普通のシミュレーション | <route/> (空) |
| 経路制御の研究 | 明示的に書く |
| 再現実験 | 明示的に書く |
| 途中経路を部分指定 | ❌ 不可 |
※ 部分指定(「この辺だけ通れ」)は MATSim では非推奨です。
8. まとめ(超短文)
-
<route>に書かれた link 列は 完全責任でユーザが管理 -
連続していなければ 即エラー
-
MATSim は 補完も推測もしない
-
通常用途では
<route>は空にするのが正解
9. 一文で言うなら
<route>は「提案」ではなく「命令」であり、成立しない命令は MATSim によって拒否される。
この理解で完全に正確です。
出発地または到着値がnode上(またはlink上)ではない場合、MATSimはどのように取り扱うのですか?
要点から述べます。
出発地・到着地が node や link の“ちょうど上”に無い場合でも、
MATSim は内部で必ず network 上に写像(スナップ)してから処理します。
ただし「勝手にどこでも良し」ではなく、明確なルールがあります。
以下、体系的に説明します。
1. MATSim における「活動地点」の考え方
plans.xml の <act> は、概念的には
「空間上の地点」+「ネットワークへの接続点」
という二層構造を持ちます。
<act type="h" x="-25000" y="0" link="1" />
2. 優先順位(重要)
優先順位 1:link 属性がある場合 ✅
<act … link="1" />
-
この link が絶対的な接続点
-
x,y は「参考値(主に可視化用)」
-
出発・到着は 必ずその link 上
👉 node・座標とのズレは問題にならない
優先順位 2:link が無く、x,y がある場合
<act type="h" x="1234" y="5678" />
-
ネットワーク上の 最寄り link を探索
-
その link に スナップ
-
以降の routing・simulation はその link 基準
✅ これも正当な使い方です。
優先順位 3:どちらも無い ❌
<act type="h" />
MATSim は network ベースのシミュレータなので、
接続先が無い活動は成立しません。
3. 「node 上ではない」ことは問題か?
結論:
ほとんど問題になりません。
理由は:
-
MATSim の交通流は link 単位で処理される
-
node はあくまで link の接続点
-
出発や到着は「link への出入り」として扱われる
そのため、
-
link の途中
-
link の上に射影された点
は 自然な状態 です。
4. 「link 上でもない」= network から離れた座標の場合
例:
<act x="1000000" y="2000000" />
-
MATSim は最寄り link を探す
-
見つからなければ 初期ロード時にエラー
-
または extremely long access link が作られ警告
-
👉 これは quality error(入力データ異常)扱い
5. Access / Egress の内部処理(概念図)
[Activity Point]
|
(snap)
v
[Access Connector]
|
[Network Link]
-
出発時:Activity → Network(access)
-
到着時:Network → Activity(egress)
※ 最近の MATSim ではAccessEgressNetworkRouter が明示的に導入されています。
6. teleport の場合は?
teleport(非ネットワーク移動)の場合:
-
network link への接続自体を使わない
-
x,y だけで距離や時間を計算
👉 ただし activity 自体の存在位置は必要
7. 実務的な安全ルール
実践では、以下が最も安全です。
✅ 必ず <act> に link を指定する
✅ x,y は network と整合していれば尚良い
✅ link 不整合は MATSim が補正「しない」
8. 一文でまとめると
出発地・到着地が node や link の正確な位置に無くても、
MATSim は必ず network 上の link に写像してから処理する。
ただし、その写像先はユーザ指定または最近接 link に厳密に制限される。
この理解で完全に正確です。
最終的にこのようなplans.xmlとしました。
<?xml version="1.0" ?>
<!DOCTYPE plans SYSTEM "http://www.matsim.org/files/dtd/plans_v4.dtd">
<plans xml:lang="de-CH">
<person id="1">
<plan>
<act type="h" link="1" end_time="06:00" />
<leg mode="car">
<route> </route>
</leg>
<act type="w" link="3" dur="00:10" />
<leg mode="car">
<route> </route>
</leg>
<act type="w" link="11" dur="03:30" />
<leg mode="car">
<!-- ここは書かない(MATSim に任せる) -->
</leg>
<act type="h" link="1" />
</plan>
</person>
</plans>