MATSim 連載準備用
まず失敗から。
MATSim Docker image(https://github.com/maptic/matsim-docker)で動かせない。3日間くらいの時間を費やした結果、断念
-----
(1)WSLのUbuntuを起動
(2)matsim-example-project(https://github.com/matsim-org/matsim-example-project)にあるコンテンツをダウンロード
cd ~
git clone https://github.com/matsim-org/matsim-example-project.git
(3)ビルド
cd ~/matsim-example-project$
./mvnw clean package
(3-1) どの java が呼ばれているか確認
which -a java
readlink -f "$(which java)"
echo "$JAVA_HOME"
which -a で複数出たら、一番上が今使われている java です。
JAVA_HOME が 17 を指していれば、PATH 先頭に $JAVA_HOME/bin が来て 17 が優先されます。
~/.bashrc や ~/.profile に JAVA_HOME=/usr/lib/jvm/java-17... の行が残っていると、それが勝ちます。
(3-2) 一時的に 21 へ切り替え(すぐ試せます)
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
export PATH="$JAVA_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
hash -r # シェルのコマンドキャッシュをクリア
java -version
→ ここで openjdk version "21..." になれば OK。
(3-3) 恒久設定(ログイン時に毎回 21 になるように)
~/.bashrc または ~/.profile の中の 古い JAVA_HOME/PATH 行をコメントアウトし、下を追記:
# Java 21 を既定にする
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
export PATH="$JAVA_HOME/bin:$PATH"
保存後、反映:
exec $SHELL -l
java -version
(4)MATSim起動
cd ~/matsim-example-project$
java -jar matsim-example-project-0.0.1-SNAPSHOT.jar
(4)テスト起動
「Choose」を押す → リポジトリ内の
scenarios/equil/config.xml を選択。
ちなみに、Output Directoryのは、自動的に、
/home/ebata/matsim-example-project/scenarios/equil/output
が入っていた。
「Start MATSim」のボタンを押下
2~3分後に、こんな感じになった
コンソール画面も、こんな感じになって、入力できない状況
ただ、この段階で、データはできているので、コンソールをCtrl-Cで落しても良い。
で、ここから図示したかったのですが、すったもんだしたあげく失敗したので、via-appを使うようにしました。
で、WSLのUbuntuで、以下からダンロードします。
https://simunto.com/via/download
で、
$CPU=$(dpkg --print-architecture)
$wget https://www.simunto.com/data/via/release/debian/simunto-via-app_25.1.0_${CPU}.deb
$sudo apt install ./simunto-via-app_25.1.0_${CPU}.deb
を実施すると、
$via-app
で、viaが起動します。
ebata@DESKTOP-1QS7OI7:~/matsim-example-project$ export DISPLAY=:0
ebata@DESKTOP-1QS7OI7:~/matsim-example-project$ export LIBGL_ALWAYS_INDIRECT=1ebata@DESKTOP-1QS7OI7:~/via-app
も必要かもしれない。
"output_network.xml.gz"を選択
同じ様に、
"output_events.xml.gz"
を選択する。
上図のように、"Load Data"ボタンを押して下さい。
上図のようにタイムラインが表示され、08:00から数分間のみ、自動車が表示されます。右側のインジケータを若干右に移動させると、移動の様子(といっても表われて消えているだけの様子)が見えます。
java -jar matsim-example-project-0.0.1-SNAPSHOT.jar
は、Windowsでも動きました。
======
もっとも簡単なMATSimの起動方法
~/matsim-example-project/simple-scenario というディレクトリを作り、さらに出力用にoutput/simple1 というディレクトリも掘っておく。
simple-scenario
├── config.xml
├── config.xml~
├── network.xml
├── network.xml~
├── output
└── simple1
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE config SYSTEM "http://www.matsim.org/files/dtd/config_v2.dtd">
<config>
<module name="controller">
<param name="firstIteration" value="0"/>
<param name="lastIteration" value="0"/>
<param name="overwriteFiles" value="overwriteExistingFiles"/>
<param name="outputDirectory" value="output/simple1"/>
</module>
<module name="network">
<param name="inputNetworkFile" value="network.xml"/>
</module>
<module name="plans">
<param name="inputPlansFile" value="plans.xml"/>
</module>
<module name="qsim">
<param name="startTime" value="00:00:00"/>
<param name="endTime" value="24:00:00"/>
</module>
<!-- 旧 strategy → replanning に修正済み -->
<module name="replanning">
<param name="maxAgentPlanMemorySize" value="1"/>
</module>
<!-- scoring に h / w を定義 -->
<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"/>
<param name="openingTime" value="07:00:00"/>
<param name="closingTime" value="18:00:00"/>
</parameterset>
</module>
</config>
この `config.xml` は、MATSim(Multi-Agent Transport Simulation)の実行設定を記述したファイルです。内容をセクションごとに整理すると次のようになります。
---
### 1. `<module name="controller">`
シミュレーション全体の制御に関する設定。
* `firstIteration=0`
最初のイテレーション番号を 0 に設定。
* `lastIteration=0`
最後のイテレーションも 0 にしているので、学習や繰り返しは行わず、初期の状態のみを実行する(ワンショットのシミュレーション)。
* `overwriteFiles=overwriteExistingFiles`
出力ディレクトリに既存のファイルがあっても上書きする設定。
* `outputDirectory=output/simple1`
シミュレーション結果の出力先フォルダ。
---
### 2. `<module name="network">`
利用する交通ネットワークデータの指定。
* `inputNetworkFile=network.xml`
道路やリンク構造が記載されたネットワーク定義ファイル。
---
### 3. `<module name="plans">`
エージェント(個人)の行動計画データの指定。
* `inputPlansFile=plans.xml`
各エージェントの出発地・目的地・活動スケジュールを記載したプランファイル。
---
### 4. `<module name="qsim">`
シミュレーション実行時間の設定。
* `startTime=00:00:00`
シミュレーション開始時刻を午前 0 時に設定。
* `endTime=24:00:00`
シミュレーション終了時刻を 24 時に設定(丸一日分を対象にする)。
---
### 5. `<module name="replanning">`
プラン修正(replanning)の設定。
※旧名称 `strategy` が `replanning` に変更されたもの。
* `maxAgentPlanMemorySize=1`
各エージェントが保持できるプランの数を 1 に制限(つまり再計画はせず、最初のプランをそのまま利用)。
---
### 6. `<module name="scoring">`
エージェントが行動を評価するためのスコアリング設定。ここでは活動(activity)のパラメータを定義している。
* `activityType=h`
「h」(home、自宅滞在)活動を 12 時間の典型的持続時間で設定。
* `activityType=w`
「w」(work、仕事)活動を 8 時間の典型的持続時間で設定。
また、開店時間を 7:00、閉店時間を 18:00 とすることで、仕事に従事できる時間帯の制約を表現。
---
### 総合説明
この設定ファイルは、**1日分の単発シミュレーション**を対象とし、ネットワークとプランデータを与え、再計画を行わずに実行するシンプルなケースを記述している。活動は「自宅(h)」と「仕事(w)」の2種類のみで、典型的な1日の行動(12時間の在宅と8時間の勤務)を再現する構成になっている。
---
?? 要するに、この `config.xml` は \*\*「network.xml」と「plans.xml」を入力として、エージェントが自宅と仕事の往復を行う1日シミュレーションを出力/simple1 に結果保存する」\*\*ための設定ファイルです。
[config.xml]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE network SYSTEM "http://www.matsim.org/files/dtd/network_v2.dtd">
<network name="tiny-net">
<nodes>
<node id="1" x="0.0" y="0.0"/>
<node id="2" x="1000.0" y="0.0"/>
</nodes>
<links>
<!-- 1km、自由速度15m/s ≒ 54km/h、容量 1000veh/h、1車線 -->
<link id="1_2" from="1" to="2" length="1000.0" freespeed="15.0"
capacity="1000.0" permlanes="1" modes="car"/>
<link id="2_1" from="2" to="1" length="1000.0" freespeed="15.0"
capacity="1000.0" permlanes="1" modes="car"/>
</links>
</network>
この `network.xml` は、MATSim で利用する交通ネットワークを記述したファイルで、最小限の「2ノード・2リンク」からなる非常にシンプルなネットワークを定義しています。内容を整理すると以下の通りです。
---
### 1. `<network name="tiny-net">`
ネットワーク全体の名前として `"tiny-net"` を定義。小規模なテスト用ネットワークであることを示す。
---
### 2. `<nodes>`
ノード(交差点や地点)を定義。ここでは2つのノードがある。
* `<node id="1" x="0.0" y="0.0"/>`
座標 (0,0) にあるノード。IDは `1`。
* `<node id="2" x="1000.0" y="0.0"/>`
座標 (1000,0) にあるノード。IDは `2`。
→ ノード間は直線で 1000m(=1km)離れている。
---
### 3. `<links>`
ノード間を結ぶリンク(道路)を定義。2本のリンクが双方向に設定されている。
* `<link id="1_2" from="1" to="2" ... />`
ノード1からノード2へ向かうリンク。
* 長さ:`1000.0` m (1km)
* 自由速度:`15.0` m/s ≒ 54 km/h
* 容量:`1000.0` 台/時 (1時間あたりの通過可能車両数)
* 車線数:`1`
* 利用可能モード:`car` のみ
* `<link id="2_1" from="2" to="1" ... />`
ノード2からノード1へ戻るリンク。条件は上記と同じ。
---
### まとめ
このファイルは、**1kmの直線道路を2ノードで表現し、車が双方向に走行できるようにした最小限の道路ネットワーク**を定義している。速度や容量も現実的な数値(片側1車線、時速54km、1000台/時)で設定されており、テストや学習用のシミュレーションに適したネットワーク構成になっている。
?? 要するに「**ノード1とノード2を結ぶ片側1車線の道路(往復2車線)だけのシンプルネットワーク**」です。
[plans.xml]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plans SYSTEM "http://www.matsim.org/files/dtd/plans_v4.dtd">
<plans>
<person id="1">
<plan selected="yes">
<act type="h" link="1_2" x="0.0" y="0.0" end_time="08:00:00"/>
<leg mode="car"/>
<act type="w" link="2_1" x="1000.0" y="0.0" end_time="17:00:00"/>
<leg mode="car"/>
<act type="h" link="1_2" x="0.0" y="0.0"/>
</plan>
</person>
</plans>
この `plans.xml` は、MATSim におけるエージェント(人物)の行動計画を記述したファイルです。内容を整理すると以下のようになります。
---
### 1. `<plans>` ルート要素
計画ファイル全体を示すルート。内部に個々の人物(`<person>`)とその行動計画(`<plan>`)を記述。
---
### 2. `<person id="1">`
ID が `1` の人物を定義。ここでは 1 人だけ。
---
### 3. `<plan selected="yes">`
この人物の計画(行動スケジュール)を記述。
* `selected="yes"` → このプランが実行対象として選択されている。
---
### 4. 行動と移動の流れ
計画は **行動(`<act>`)と移動(`<leg>`)が交互に記述**される。ここでは1日の典型的な「自宅→仕事→自宅」往復を表現している。
#### (1) 自宅での行動
```xml
<act type="h" link="1_2" x="0.0" y="0.0" end_time="08:00:00"/>
```
* `type="h"`:自宅(home)活動。
* `link="1_2"`:ノード1→2のリンク上に自宅があると仮定。
* 座標 `(0.0, 0.0)`(ノード1の位置に対応)。
* `end_time="08:00:00"` → 午前8時まで自宅に滞在し、その後移動を開始。
#### (2) 通勤移動
```xml
<leg mode="car"/>
```
* `mode="car"` → 自動車で移動する。
* 出発地点は自宅(link="1\_2")、目的地は次の `<act>` で指定。
#### (3) 仕事での行動
```xml
<act type="w" link="2_1" x="1000.0" y="0.0" end_time="17:00:00"/>
```
* `type="w"`:仕事(work)活動。
* `link="2_1"`:ノード2→1のリンク上に職場があると仮定。
* 座標 `(1000.0, 0.0)`(ノード2の位置に対応)。
* `end_time="17:00:00"` → 午後5時まで仕事をして、その後帰宅移動。
#### (4) 帰宅移動
```xml
<leg mode="car"/>
```
* 仕事先から自動車で自宅へ戻る。
#### (5) 自宅での行動(帰宅後)
```xml
<act type="h" link="1_2" x="0.0" y="0.0"/>
```
* 再び自宅(link="1\_2")で活動。
* 終了時刻は未設定なので、そのまま夜間~翌日まで滞在。
---
### まとめ
この `plans.xml` は、**1人の人物(id=1)が「午前8時に自宅を出発 → 車で職場へ通勤 → 午後5時まで勤務 → 車で帰宅 → 以降は自宅で滞在」する一日の行動計画**を記述している。
ネットワーク(`network.xml`)と組み合わせると、ノード1(自宅)とノード2(職場)の間を往復する最小限の通勤シナリオが再現できる構成になっている。
---
kno