このnetwork.xmlの内容を解説して下さい ーー とChatGPTに頼んでみた件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE network SYSTEM "http://www.matsim.org/files/dtd/network_v1.dtd">
<network name="equil test network">
<nodes>
<node id="1" x="774558.033" y="1108851.844"/>
<node id="2" x="779558.033" y="1108851.844"/>
<node id="3" x="793693.033" y="1114776.844"/>
<node id="4" x="792060.033" y="1113182.844"/>
<node id="5" x="790729.033" y="1112066.844"/>
<node id="6" x="789860.033" y="1110562.844"/>
<node id="7" x="789558.033" y="1108851.844"/>
<node id="8" x="789860.033" y="1107140.844"/>
<node id="9" x="790729.033" y="1105636.844"/>
<node id="10" x="792060.033" y="1104520.844"/>
<node id="11" x="793693.033" y="1102926.844"/>
<node id="12" x="794558.033" y="1108851.844"/>
<node id="13" x="799558.033" y="1108851.844"/>
<node id="14" x="799558.033" y="1098851.844"/>
<node id="15" x="774558.033" y="1098851.844"/>
</nodes>
<links capperiod="01:00:00">
<link id="1" from="1" to="2" length="10000.00" capacity="36000" freespeed="27.78" permlanes="1" />
<link id="2" from="2" to="3" length="10000.00" capacity="3600" freespeed="27.78" permlanes="1" />
<link id="3" from="2" to="4" length="10000.00" capacity="3600" freespeed="27.78" permlanes="1" />
<link id="4" from="2" to="5" length="10000.00" capacity="3600" freespeed="27.78" permlanes="1" />
<link id="5" from="2" to="6" length="10000.00" capacity="3600" freespeed="27.78" permlanes="1" />
<link id="6" from="2" to="7" length="10000.00" capacity="3600" freespeed="27.78" permlanes="1" />
<link id="7" from="2" to="8" length="10000.00" capacity="3600" freespeed="27.78" permlanes="1" />
<link id="8" from="2" to="9" length="10000.00" capacity="3600" freespeed="27.78" permlanes="1" />
<link id="9" from="2" to="10" length="10000.00" capacity="3600" freespeed="27.78" permlanes="1" />
<link id="10" from="2" to="11" length="10000.00" capacity="3600" freespeed="27.78" permlanes="1" />
<link id="11" from="3" to="12" length="5000.00" capacity="1000" freespeed="27.78" permlanes="1" />
<link id="12" from="4" to="12" length="5000.00" capacity="1000" freespeed="27.78" permlanes="1" />
<link id="13" from="5" to="12" length="5000.00" capacity="1000" freespeed="27.78" permlanes="1" />
<link id="14" from="6" to="12" length="5000.00" capacity="1000" freespeed="27.78" permlanes="1" />
<link id="15" from="7" to="12" length="5000.00" capacity="1000" freespeed="27.78" permlanes="1" />
<link id="16" from="8" to="12" length="5000.00" capacity="1000" freespeed="27.78" permlanes="1" />
<link id="17" from="9" to="12" length="5000.00" capacity="1000" freespeed="27.78" permlanes="1" />
<link id="18" from="10" to="12" length="5000.00" capacity="1000" freespeed="27.78" permlanes="1" />
<link id="19" from="11" to="12" length="5000.00" capacity="1000" freespeed="27.78" permlanes="1" />
<link id="20" from="12" to="13" length="10000.00" capacity="36000" freespeed="27.78" permlanes="1" />
<link id="21" from="13" to="14" length="10000.00" capacity="36000" freespeed="27.78" permlanes="1" />
<link id="22" from="14" to="15" length="35000.00" capacity="36000" freespeed="27.78" permlanes="1" />
<link id="23" from="15" to="1" length="10000.00" capacity="36000" freespeed="27.78" permlanes="1" />
</links>
</network>
この network.xml は、MATSim の「道路ネットワーク」を定義しているファイルです。順に分解して説明します。
1. ファイル全体の構造
-
network:ネットワーク全体。nameは単なるラベル。 -
中に
-
交通ネットワーク上の 点(交差点・分岐点) を表す
<nodes> -
点と点を結ぶ 線(道路リンク) を表す
<links>
が入っています。
-
2. <nodes>:ノード(交差点・分岐点)
例:
-
id:ノードの識別子(後で link から参照される) -
x,y:座標(config のcoordinateSystem、ここでは EPSG:6685 に対応)
イメージ
-
node1〜2〜12〜13 などは、x 方向に真っすぐ並んでいるような配置
-
node2 を中心に、3〜11 へ枝分かれしているような「花火 / 星型」の構造
-
node1–2–13–14–15–1 で、大きな四角形の周回路を作っている
この座標は可視化や距離計算に使われますが、ユーザは通常「id」で扱うことが多いです。
3. <links>:リンク(道路・一方通行)
ヘッダ:
-
capperiod="01:00:00"
→capacityが「1時間あたりの台数」を表すことを意味します。
各リンクの形:
属性の意味
-
id:リンクの識別子(plans.xml の<route>や<act link="…">から参照) -
from,to:始点ノード・終点ノード
→ 有向リンク(片方向) であることに注意 -
length:リンク長 [m] -
capacity:capperiod(ここでは 1h)あたりの交通容量 [veh/capperiod] -
freespeed:自由走行速度 [m/s]-
27.78 m/s ≒ 100 km/h(100 ÷ 3.6 ≒ 27.78)
-
-
permlanes:車線数
4. ネットワークの形(構造)
4.1 大きな「四角形の周回路」
-
node1 → node2 → node12 → node13 → node14 → node15 → node1
という一周する大きなループ -
capacity="36000"で かなり太い幹線道路 的な扱い
4.2 node2 から放射状に伸びる枝
-
node2 から 3〜11 に向かう 9 本のリンク
-
capacity="3600"と細め → 支線道路 のイメージ
4.3 各枝の先から node12 への収束
-
3〜11 の各ノードから、中央の node12 に向かうリンク群
-
capacity="1000"とさらに細い → ボトルネックになるリンク
5. 交通流の「ストーリー」
このネットワークは、典型的な 「ボトルネック付きテストネットワーク」 になっています。
-
左側の node1 と右側の node13/14 などを結ぶメインルート(幹線)は capacity が非常に大きい
-
途中の node2 周りで、たくさんの選択肢(3〜11 経由)と
-
node3〜11 → node12 間に 細いキャパシティのリンク が配置されている
これにより:
-
エージェントがどのルートを選ぶか
-
通行量の集中による混雑・遅延がどう出るか
-
replanning による経路変更の効果
などを検証しやすい「教材用ネットワーク」になっています。
6. plans.xml との関係
たとえば、先ほどの plans.xml で
-
出発地の活動は link 1(1→2)上
-
仕事場所は link 3(2→4)上 や link 11(3→12)上
として扱われます。
座標 x,y は network の座標とあまり整合していなくても、
実際の接続は link で決まる、というのがポイントです。
7. 一言まとめ
-
<nodes>:地図上の「点」(交差点) -
<links>:点と点を結ぶ「一方通行の道路」 -
capacityやfreespeedで、道路の太さ・速度を設定 -
このファイルは、MATSim がルーティングと交通流シミュレーションを行うための「道路網の定義」になっています。
もし「このネットワークの図を頭に描きにくい」と感じたら、
簡単なスケッチを手書き(node 間の線をそのまま結ぶだけ)すると、
ボトルネック構造がかなりスッキリ見えると思います。<link id="1" from="1" to="2" length="10000.00" capacity="36000" freespeed="27.78" permlanes="1" /> とはnode1からnode2へのリンクを現わしていると思います。
しかし、node1とnode2は座標が決まっているので、それをつなぐ長さは確定的に決まるはずです。
length="10000.00"は何を意味しますか?
とても重要なポイントです。
結論から言うと、
MATSim では「link の length は node 座標から自動計算されるものではない」
という設計思想になっています。
結論(要点)
の
length="10000.00" は、
node1–node2 を結ぶ「このリンクを通過する移動距離(m)」を
ユーザが明示的に与えている 値です。
👉 node 座標と一致している必要はありません。
なぜ座標から自動計算しないのか?
MATSim では、次のように役割が分離されています。
| 要素 | 役割 |
|---|---|
| node の x,y | 可視化・近接探索・空間参照 |
| link.length | 移動距離・移動時間・コスト計算 |
つまり、
-
座標:幾何(geometry)
-
length:交通量モデル上の距離(topology / cost)
です。
具体的に意味するもの
length="10000.00" は:
-
この link を 1 回通過すると 10,000 m 移動したと見なす
-
freespeed が 27.78 m/s なら
→ 自由速度走行時間 ≒ 360 秒(6 分) -
congestion があれば,それ以上の所要時間になる
という 「モデル上の距離」 です。
node 座標との乖離が許される理由
① 元データが必ずしも平面座標とは限らない
-
座標は地理座標(lat/lon)
-
縮尺が歪んでいる
-
可視化用に簡略化されている
→ 正確な距離は別途持ちたい
② 1 本の link が「曲がった道路」を表すことがある
MATSim の link は:
-
曲線
-
蛇行
-
高速道路 IC 含む長区間
を 1 本でまとめて表現することがあります。
→ 座標距離 ≠ 実走行距離
③ 意図的に「距離」を調整するケース
研究用途では特に重要です。
-
混雑を強調したい
-
特定リンクのコストを高くしたい
-
抽象ネットワーク(equil のような教材用)
👉 equil ネットワークは 完全に抽象モデル です
(座標は「絵を描く」ためだけ)
MATSim は node 間の距離を使っていない?
ほぼ以下だけです:
-
可視化(OTFVis など)
-
最近傍探索(施設→リンクへの割当)
-
座標ベースの分析
交通シミュレーションの本体では:
✅ 移動距離・時間・コストは
100% link.length と freespeed / capacity に依存
です。
では座標と length が食い違うとどうなる?
何も問題になりません。
-
ルーティング:OK
-
mobsim:OK
-
scoring:OK
ただし:
❗ 可視化で「距離感がおかしい絵」になる
❗ GIS と突合すると違和感が出る
という 見た目・後処理の問題 は起きます。
equil ネットワークの場合
今回の例:
は、
-
各リンクの走行時間を均一にし
-
混雑の発生位置と再配分を分かりやすくする
ための 意図的設計 です。
→ 座標は概念図、length が本体
まとめ(核心)
-
✅ link.length は「モデル上の走行距離」
-
✅ node 座標から自動計算されない
-
✅ 座標と一致する必要もない
-
✅ equil では特に意図的に抽象化されている
この設計を理解すると、
-
freespeed
-
capacity
-
congestion
-
travel time
が すべて link 中心に構成されている ことが見えてきます。
ではシミュレーション結果によって出力される座標は、どのようになるのですか?
良い問いです。
結論を先に言うと、MATSim のシミュレーション結果として出力される「座標」は、基本的に network.xml に書かれている node / link の座標をそのまま使ったものです。
つまり、
計算は link.length で行われ、
出力される座標は node / link の x,y に基づく
という 二重構造 になっています。
出力される「座標」の正体(整理)
MATSim の出力で座標が現れる場面は主に以下です。
1. events.xml に出る座標
代表例:
-
actstart / actend -
personEntersVehicle -
linkEnter / linkLeave
原則
-
activity の座標
→ plans.xml に書かれたx,y
(無ければ link の座標から補完) -
link イベントの座標
→ link の from / to node の座標
(補間された線上)
👉 length とは無関係
2. OTFVis(可視化)で見える動き
OTFVis では:
-
node の座標に基づいてネットワークが描画され
-
agent は link の形状(直線)上を移動しているように見える
このとき:
-
表示距離:座標系の距離
-
移動時間:
length / freespeed+ 混雑
になります。
👉 「ゆっくり短い線を進む」「速く長い線を進む」などは普通に起きる
3. output_plans.xml の activity 座標
再計画後の output では:
のように、
-
座標は activity の
x,y -
行先の link が付く
✅ 座標自体は network と一致していなくてもよい
では座標と length がズレていると何が起きるか?
✅ 起きないこと(重要)
-
ルーティングが壊れる → ❌ 起きない
-
混雑が壊れる → ❌ 起きない
-
travel time が狂う → ❌ 起きない
→ すべて length / freespeed / capacity で計算されるため
⚠ 起きうること
① 可視化が「物理的に不自然」
-
短い線なのに 10 分かかる
-
ほぼ止まって見えるのに渋滞する
👉 equil では 仕様通り
② 座標ベースの後処理で違和感
-
GIS に重ねる
-
移動距離を座標から再計算する
-
空間クラスタ分析
👉 この場合は 座標と length を揃える必要あり
MATSim は「空間モデル」ではない
ここが一番重要です。
MATSim は:
-
❌ 幾何学的シミュレーション
-
✅ ネットワーク・コストベースの離散イベントシミュレーション
です。
そのため、
| 要素 | 使われ方 |
|---|---|
| 座標 | 表示・割当・分析 |
| length | 移動の実体 |
| freespeed / capacity | 時間と混雑 |
という役割分担が厳密にされています。
equil の場合(今回の文脈)
-
座標:
→ ネットワーク構造を「星形に見せる」ための配置 -
length:
→ 均一な travel time を与えるための操作量
結果として:
-
出力される座標:network.xml の x,y
-
出力される時間・混雑:完全に length 主導
になります。
一文でまとめると
MATSim の出力座標は「見た目用」、
シミュレーションの本質は link.length にある。
この二層構造を理解しているかどうかが、
MATSim を「使っている」か「振り回されている」かの分かれ目です。
freespeed="27.78"は、そのリンクを使う全てのエージェントが時速100kmで移動する、ということですか?