コンテンツにスキップ

データ作成マニュアル

1.はじめに

1.1 本マニュアルの目的

シェアドモビリティ最適配置のデモアプリケーションのファイルアップロード機能や、APIによるデータ登録で利用するデータの作成方法をご紹介します。

1.2 前提条件

  • FUJITSU Research Portalのアカウントを保有していること

1.3 サンプルデータについて

デモアプリにデモ用シミュレーション結果と、デモシミュレーションで利用したデータを公開しています。データ作成の際にはこちらのデータもご活用ください。

  • デモシミュレーション結果一覧
    トップ画面からデモシミュレーション結果を確認できます。
  • サンプルデータ一覧
    デモシミュレーションで利用したサンプルデータを公開しています。Upload Data Filesボタンをクリックし、データ一覧を参照ください。

2.手順

2.1 データ生成ツールを利用したデータ作成

FUJITSU Research Portalから、技術一覧→シェアドモビリティ最適配置を選択します。 ページ下部にあるデータ生成ツールを試すボタンをクリックすると、本サービスを利用することができます。 シェアドモビリティ最適配置のトップ画面は以下のような画面です。

2.1.1 地図データ生成:OSM Converter

OSM Converterでは、任意の地点での地図データを生成します。

  • Geocodingで好きな都市を入力します
  • 必要に応じてParameterを調整します
  • Generateボタンを押します
  • Downloadボタンを押します

2.1.2 ODデータ生成

移動開始場所・移動目的場所を設定することで人々の動きのデータを生成します。

方法1: OD Builderを利用した手動登録

  • OD Builderを開きます
  • 地図上で出発地・目的地を登録します
  • 必要に応じてParameterを調整します
  • Downloadボタンを押します

方法2: OD Generatorを利用した自動生成

  • Synthetic OD Generatorを開きます
  • スライダで人数を設定します
  • 必要に応じてParameterを調整します
  • Downloadボタンを押します

2.1.3 シェアドeスクータのステーション設定

方法1 Stations Builderを利用した手動登録

  • Stations Builderを開きます
  • 地図上でステーション位置を登録します
  • 必要に応じてParameterを調整します
  • Downloadボタンを押します 

方法2 Stations Generatorを利用した自動生成

  • Synthetic Stations Generatorを開きます
  • スライダでstation数を設定します
  • 必要に応じてParameterを調整します
  • Downloadボタンを押します​

2.1.4 model.jsonデータ生成

人の行動選択モデルとして、恣意的な選択確率を指定したい場合向けの設定ファイルです。

  • model.json Generatorを開きます
  • 必要に応じてParameterを調整します
  • Downloadボタンを押します

2.1.5 precondition.jsonデータ生成

デモアプリ(Webアプリ)からファイルアップロードを行ってデジタルリハーサルを行うときに必要なJSONデータを生成します。

  • precondition.json Builderを開きます
  • 必要に応じてParameterを調整します
  • Downloadボタンを押します
{
"USECASE":"dynamic-discount"
"ASSIMIL_PERSON_FILE":"simdata-your-simdataId-of-od/od.csv.gz"
"SOARS_STATIONS_FILE":"simdata-your-simdataId-of-stations-csv/stations.csv"
"SUMO_NET_FILE":"simdata-your-simdataId-of-net-file/map.net.xml.gz"
"DMM_MODEL_INFO_FILE":"simdata-your-simdataId-of-model-file/model.json"
"MAP_CENTER_LATITUDE":"35.444395"
"MAP_CENTER_LONGITUDE":"139.636773"
"CURRENCY_SYMBOL":"¥"
"CURRENCY_RATE":"189.1800"
"START_HOUR":"10"
"END_HOUR":"12"
}

2.1.6 road-closure.csv road-pricing.csv データ生成

road-closure.csv

閉鎖する道路を設定するCSV形式のファイルです。

road-pricing.csv

課金する道路を設定するCSV形式のファイルです。

  • closure.csv road-pricing.csv Generatorを開きます
  • 必要に応じてParameterを調整します
  • Downloadボタンを押します

2.2 ユースケース: ダイナミックディスカウント

概要

人が目的地に移動する手段として、車、徒歩、escooterの選択肢を設け、それぞれの人がコストや時間によって、移動手段を選択し、移動するというデジタルリハーサルを行うユースケースです。 escooterを借りるときに、escooterのステーションの状況に応じてディスカウントすることで、コストに影響を与え、人の移動手段の選択に変化を与えます。 それにより、escooterの利用率や利用料収入への変化がどうなるかを確認することができます。 また、escooterの初期配備を変更することもできます。

デジタルリハーサルの入出力

デジタルリハーサルの入出力は、ユースケースごとに定義されます。 ダイナミックディスカウントは、以下のフォーマットで入力ファイルを用意します。 出力は後述する「デジタルリハーサルの結果として出力されるファイル」のフォーマットで出力されます。

デジタルリハーサルに必要な入力ファイル

(共通)

  • stations.csv
  • map.net.xml.gz
  • od.csv.gz
  • (model.json)

map.net.xml.gzおよびod.csv.gzは、必ずgzipしてください。

(WEBアプリの場合)

  • precondition.json

(APIの場合)

  • condition.json
  • env.json

map.net.xml.gz

SUMOで使用するネットファイルです。作成方法は 2.1.1 地図データ生成:OSM Converter もしくは2.6 地図データ登録手順を参照ください。

stations.csv

name,zone,latitude,longitude,initial
bay1,a,35.55934337167842,139.63850582201087,3
bay2,a,35.580495,139.6351646,3
...

escooterのステーションの初期配置を設定するCSV形式のファイルです。

| 項目 | 値の例 | 説明 | |----|----|----| | name | bay0 | ステーションの名前。 | | zone | b | ステーションが所属するゾーン。同じゾーンのステーション間の移動しかできない。 | | latitude | 35.58 | ステーションの緯度。 | | longitude | 139.64| ステーションの経度。 | | initial | 2 | escooterの初期配備台数。 |

od.csv.gz

人の移動を出発地と到着地として指定するファイルです。

oid,timestamp,origin_lon,origin_lat,dest_lon,dest_lat,type,age,gender_type,driving_license,car_ownership
person-0,05:00:00,139.582230,35.436874,139.558556,35.424722,car,52,1,1,2
...
| 項目 | 値の例 | 説明 | |----|----|----| | oid | person-0 | 必須。OD内でユニークなIDである必要があります。 | | timestamp | 05:00:00 | 必須。[ISO_LOCAL_TIME](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/time/format/DateTimeFormatter.html#ISO_LOCAL_TIME)の形式。 | | origin_lon | 139.582230 | 必須。出発地の経度。 | | origin_lat | 35.436874 | 必須。出発地の緯度。 | | dest_lon | 139.558556 | 必須。到着地の経度。 | | dest_lat | 35.424722 | 必須。到着地の緯度。 | | type | car | 省略可能。移動手段を固定する場合に指定します。指定可能なのは、car、pedestrian、escooterです。何も指定しなければ、移動手段を選択します。 | | age | 52 | 省略可能。実年齢。 | | gender_type | 1 | 省略可能。性別。女性の場合は1、その他の場合は0。 | | driving_license | 1 | 省略可能。運転免許を持っているか。持っている場合は1、その他の場合は0。 | | car_ownership | 2 | 省略可能。世帯の車保持状況。保持していない場合は0, 大人一人につき一台以下しか保持していない場合は1、大人一人につき一台より多く保持している場合は2。 | | household_carvan | 1 | 省略可能。自家用車の数を指定します。car_ownershipが指定されていないときのみ有効です。 | | sex_type | 1 | 省略可能。1は男性。2は女性。gender_typeが指定されていないときのみ有効です。 | | age_type | 1 | 省略可能。1: 0~15歳、2: 16~24歳、3: 25~34歳、4: 35~49歳、5: 50~64歳、6: 65歳以上。ageが指定されていないときのみ有効です。 |

項目を省略する場合は、すべての行で省略します。 必須項目のみの場合は以下のような形になります。

oid,timestamp,origin_lon,origin_lat,dest_lon,dest_lat
person-0,05:00:22,139.582230,35.436874,139.558556,35.424722
...

model.json

人の行動選択モデルとして、恣意的な選択確率を指定したい場合向けのファイルです。

固定確率
{
  "rulebase_model": "fixed",
  "fixed_weights": {
    "CAR": 1,
    "WALKING": 1,
    "CYCLING": 1
  }
}

各移動手段の選択確率(重み)を指定する場合向け。

| key | | valueの例 | 説明 | |----------------|---------|-----------|------| | rulebase_model | | "fixed" | 固定確率指定 | | fixed_weights | CAR | 1 | carの重み。指定しない場合は0になります。 | | | WALKING | 1 | pedestrianの重み。指定しない場合は0になります。 | | | CYCLING | 1 | escooterの重み。指定しない場合は0になります。 |
  • escooterだけを選択させたい場合、"fixed_weights": {"CYCLING": 1}
  • carだけを選択させたい場合、"fixed_weights": {"CAR": 1}
  • pedestrianだけを選択させたい場合、"fixed_weights": {"WALKING": 1}
ランダム
{"rulebase_model": "random"}

各移動手段の選択確率をランダムにする場合向け。

時間とコストの重み係数指定
{
  "rulebase_model": "linear",
  "w_time": 1,
  "w_cost": 1
}

移動時の各選択肢に関し、時間とコストの重みを指定する場合向け。

| key | valueの例 | 説明 | |----------------|-----------|------| | rulebase_model | "linear" | | | w_time | 1 | 時間の重み。指定しない場合は1になります。 | | w_cost | 1 | コストの重み。指定しない場合は1になります。 |
  • 時間のみで移動手段を選択(時間が短い移動手段を選択)させたい場合、"w_time": 1, "w_cost": 0
  • コストのみで移動手段を選択(コストが安い移動手段を選択)させたい場合、"w_time": 0, "w_cost": 1

precondition.json

{
  "USECASE":"dynamic-discount",
  "ASSIMIL_PERSON_FILE":"simdata-your-simdataId-of-od/od.csv.gz",
  "SOARS_STATIONS_FILE":"simdata-your-simdataId-of-stations-csv/stations.csv",
  "SUMO_NET_FILE":"simdata-your-simdataId-of-net-file/map.net.xml.gz",
  "DMM_MODEL_INFO_FILE":"simdata-your-simdataId-of-model-file/model.json",
  "MAP_CENTER_LATITUDE":"35.444395",
  "MAP_CENTER_LONGITUDE":"139.636773",
  "CURRENCY_SYMBOL":"¥",
  "CURRENCY_RATE":"189.1800",
  "START_HOUR":"10",
  "END_HOUR":"12"
}

condition.json

{
 "name":"09/11_14:59:08",
 "seed":0,
 "start":5,
 "end":6,
 "usecases":{"batteryBased":{"enabled":true,"discount":10,"lowBatteryPercent":15},"numberBased":{"enabled":true,"discount":25,"scooterNumberThreshold":1}},
 "usecase":"dynamic-discount",
 "vtypes":{"car":true,"pedestrian":true,"escooter":true},
 "dmmmodel":{},
 "currencySymbol":"¥","createdAt":"2023-09-11T05:59:18.403Z","mapcenter":[139.645,35.584],
 "stations":[{"id":"bay0","initial":2,"pos":[35.438606,139.642578],"zone":"b"},{"id":"bay1","initial":0,"pos":[35.449786,139.642196],"zone":"a"},{"id":"bay2","initial":1,"pos":[35.440275,139.645568],"zone":"a"},...]
}

どのような条件でデジタルリハーサルを実行したかを登録するJSON形式のファイルです。各プロパティ名は上記を参考にしてください。 サンプルWebサーバでは、このファイルを用いて、デジタルリハーサル結果表示を行っています。

env.json

{
 "USECASE":"dynamic-discount",
 "CONDITION_JSON_ID":"simdata-d2d0e1b3-7f78-4939-affc-939d712b15d7",
 "ASSIMIL_PERSON_FILE":"simdata-272c8229-5a50-48c1-b0db-771c46e3b5d3/od.csv.gz",
 "ASSIMIL_ALIGNER_MAX_STEPS":"3600",
 "ASSIMIL_ALIGNER_START_TIME":"5",
 "SOARS_STATIONS_FILE":"simdata-1c480139-c8d5-4d24-a551-af10f008339a/stations.csv",
 "SUMO_NET_FILE":"simdata-4467079a-fbd0-440e-8505-a8c518e94562/map.net.xml.gz",
 "DMM_MODEL_INFO_FILE":"simdata-feaf5067-43c2-4673-a229-43e0d7d5dc6d/model.json",
 "RANDOM_SEED":"0",
 "CURRENCY_RATE":"1.0",
 "VTYPES":"car,pedestrian,escooter",
 "USECASE_BATTERY_ENABLED":"false",
 "USECASE_BATTERY_DISCOUNT":"0",
 "USECASE_BATTERY_LOW_PERCENT":"15",
 "USECASE_NUMBER_ENABLED":"false",
 "USECASE_NUMBER_DISCOUNT":"0",
 "USECASE_NUMBER_THRESHOLD":"1"
}

デジタルリハーサル実行時にデジタルリハーサルへの入力となる情報を記載するJSON形式のファイルです。 デジタルリハーサルの実行指示は、このenv.jsonを指定して行います。

| key | valueの例 | 説明 | |----|----|----| | USECASE | "dynamic-discount" | 実行するデジタルリハーサルのユースケースを指定します。 | | CONDITION_JSON_ID | "simdata-d2d0e1b3-7f78-4939-affc-939d712b15d7" | "condition.json"のsimdataIdを指定します。 | | ASSIMIL_PERSON_FILE | "simdata-272c8229-5a50-48c1-b0db-771c46e3b5d3/od.csv.gz" | 登録したODファイルを使用してデジタルリハーサルを実行する場合に指定します。`simdataId/ファイル名`で指定します。指定しない場合はサンプルとして用意されているODファイルが使用されます。 | | ASSIMIL_ALIGNER_MAX_STEPS | "3600" | デジタルリハーサルの時間を指定します(秒)。例は1時間です | | ASSIMIL_ALIGNER_START_TIME | "5" | デジタルリハーサルの開始時間を指定します(時)。ODファイルのtimestampが、この時間以降で、ASSIMIL_ALIGNER_MAX_STEPSの期間のODを対象としてデジタルリハーサルを行います。 | | SOARS_STATIONS_FILE | "simdata-1c480139-c8d5-4d24-a551-af10f008339a/stations.csv" | 登録したステーションのescooterの初期配置ファイルを指定します。`simdataId/ファイル名`で指定します。 | | SUMO_NET_FILE | "simdata-4467079a-fbd0-440e-8505-a8c518e94562/map.net.xml.gz" | 登録したSUMOのネットファイルを使用してデジタルリハーサルを実行する場合に指定します。`simdataId/ファイル名`で指定します。指定しない場合はサンプルとして用意されているネットファイルが使用されます。 | | DMM_MODEL_INFO_FILE | "simdata-feaf5067-43c2-4673-a229-43e0d7d5dc6d/model.json" | 登録した行動選択モデルファイルを使用してデジタルリハーサルを実行する場合に指定します。`simdataId/ファイル名`で指定します。指定しない場合はロンドンのデータで学習された行動選択モデルが使用されます。 | | RANDOM_SEED | "0" | 乱数のシードを設定します。シードが同じであってもデジタルリハーサルの結果が同じとなるわけではありません。 | | CURRENCY_RATE | "1.0" | 通貨レートを設定します。£を基準としていますので、円換算としたい場合には、例えば186.0といった指定になります。 | | VTYPES | "car,pedestrian,escooter" | デジタルリハーサルにおいて、移動手段の選択肢とするものを指定します。設定できるのは、car、pedestrian、escooterです。 | | USECASE_BATTERY_ENABLED | "false" | バッテリ残量が低いescooterのあるステーションへ返却する際に割引する施策を有効にする際にtrueにします。 | | USECASE_BATTERY_DISCOUNT | "0" | 割引する率を指定します(%)。 | | USECASE_BATTERY_LOW_PERCENT | "15" | バッテリ残量が低いと判断する残量を指定します(%)。 | | USECASE_NUMBER_ENABLED | "false" | 利用可能なescooterの台数が少ないステーションへ返却する際に割引する施策を有効にする際にtrueにします。 | | USECASE_NUMBER_DISCOUNT | "0" | 割引する率を指定します(%)。 | | USECASE_NUMBER_THRESHOLD | "1" | 利用可能な台数が少ないと判断する台数を指定します。 |

デジタルリハーサルの結果として出力されるファイル

  • states.txt
  • output.txt
  • current-usage.txt
  • total-usage.txt
  • choice.txt

これらのファイルは、デジタルリハーサル結果ファイル取得APIにて取得できます。

states.txt

{"name":"states","time":180,"data":{"oid":"person-12","value":{"wayId":"254070103#2","co2":0.0,"lon":139.64,"type":"pedestrian","lat":35.58,"speed":1.39,"ec":0.0}}}
...

JSON Linesフォーマットで出力されます。 1分毎に、人がどのような移動手段を用いてどこにいるかを緯度経度で示しています。 co2は、その時点でのco2排出量です。speedはその地点での速度になります。 wayIdは、その地点のSUMOにおける道路IDです。

| key | | | valueの例 | 説明 | |----|----|----|----|----| | name | | | "states" | | | time | | | 180 | デジタルリハーサルの経過時間(秒) | | data | oid | | "person-12" | デジタルリハーサルに登場する人のID | | | value | co2 | 0.0 | CO2排出量(mg/s) | | | | lon | 139.64 | 現在位置の経度 | | | | type | "pedestrian" | 移動手段(pedestrian, car, escooter)| | | | lat | 35.58 | 現在位置の緯度 | | | | speed | 1.39 | 現在位置での速度(m/s)| | | | ec | 0.0 | 電力消費量(Wh/s)| | | | wayId | "254070103#2" | 道路ID |

誰も移動していないときは、dataがnullになります。

{"name":"states","time":60,"data":null}

output.txt

{"name":"output","time":8700,"data":{"oid":"person-695","value":{"move":{"travelTime":330,"carFuelCost":54.833810134163656,"carParkCharge":558.0,"carDistance":2939.5950000000003,"totalCo2":804645.4112034136,"travelRoute":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"mode":"car"},"geometry":{"type":"LineString","coordinates":[[139.6663565,35.5956173],[139.6494531,35.6088534]]}}]},"park_dst":558.0,"type":"car","carTime":330,"fuelCost":54.833810134163656}}}}
{"name":"output","time":980,"data":{"oid":"person-9","value":{"move":{"pedestrianTime":750,"travelTime":750,"pedestrianDistance":1004.0500000000001,"totalCo2":0.0,"travelRoute":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"mode":"pedestrian"},"geometry":{"type":"LineString","coordinates":[[139.6758158,35.6039659],[139.6678026,35.6030643]]}}]},"type":"pedestrian"}}}}
{"name":"output","time":1850,"data":{"oid":"person-21","value":{"move":{"pedestrianTime":1040,"escooterFee":390.6,"travelTime":1390,"escooterDiscount":0.0,"escooterCost":390.6,"pedestrianDistance":1269.5899999999997,"totalCo2":0.0,"travelRoute":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"mode":"pedestrian"},"geometry":{"type":"LineString","coordinates":[[139.6551776,35.5881223],[139.65688347811465,35.5821084092067]]}},{"type":"Feature","properties":{"mode":"escooter"},"geometry":{"type":"LineString","coordinates":[[139.65688347811465,35.5821084092067],[139.6444064,35.5818028]]}},{"type":"Feature","properties":{"mode":"pedestrian"},"geometry":{"type":"LineString","coordinates":[[139.6444064,35.5818028],[139.6477012,35.580581]]}}]},"escooterDistance":1215.5099999999998,"escooterTime":350,"type":"pedestrian-escooter-pedestrian","escooterFeeDiscount":0.0}}}}
{"name":"output","time":8670,"data":{"oid":"person-564","value":{"move":{"reason":"escooterEmpty","opportunityLoss":409.20000000000005},"move2":{"pedestrianTime":1810,"travelTime":1810,"pedestrianDistance":2249.7899999999995,"totalCo2":0.0,"travelRoute":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"mode":"pedestrian"},"geometry":{"type":"LineString","coordinates":[[139.6307184,35.5844267],[139.6429601,35.5702724]]}}]},"type":"pedestrian"}}}}
...

JSON Linesフォーマットで出力されます。 10秒間隔で、目的地に到着した人の移動の履歴を出力します。 一人に対して、その人が到着した時のみ、その人の情報が一度だけ出力されます。

| key | | | | valueの例 | 説明 | |----|----|----|----|----|----| | name | | | | "output" | | | time | | | | 1010 | デジタルリハーサルの経過時間(秒) | | data | oid | | | "person-269" | デジタルリハーサルに登場する人のID | | | value | move | travelTime | 500 | 移動にかかった時間(s) | | | | | totalCo2 | 11818.295182953709 | CO2排出量(mg) | | | | | type | "car" | 移動手段(pedestrian, car, pedestrian-escooter-pedestrian)| | | | | carTime | 380 | carで移動した時間(s) | | | | | carDistance | 330 | carで移動した距離(m) | | | | | pedestrianTime | 380 | pedestrianで移動した時間(s) | | | | | pedestrianDistance | 330 | pedestrianで移動した距離(m) | | | | | escooterTime | 380 | escooterで移動した時間(s) | | | | | escooterDistance | 330 | escooterで移動した距離(m) | | | | | escooterFeeCost | 1.7 | 利用料金 | | | | | escooterFeeDiscount | 0.0 | 割引される額(負の値) | | | | | carFuelCost | 201.1 | 燃料代 | | | | | carParkCharge | 200.0 | 車のみの移動時の目的地の駐車料金 | | | | | escooterCost | 1.7 | 利用料金(割引後の金額) | | | | | escooterDiscount | 0.0 | 割引された額(負の値) | | | | | fuelCost | 201.1 | 燃料代 (carのみ) | | | | | park_dst | 200.0 | 車のみの移動時の目的地の駐車料金(carのみ) | | | | | travelRoute || 移動手段を含む移動経路 |

料金は、£を起点としており、env.jsonにてCURRENCY_RATEを設定することで、レートで換算した値が返されます。 escooter利用料金は、基本料金が1.5£で、1分毎に0.1£です。 駐車料金は、3£です。

また、escooterが借りれなかった場合には、moveは以下の出力となります。

| key | | | | valueの例 | 説明 | |----|----|----|----|----|----| | name | | | | "output" | | | time | | | | 480 | デジタルリハーサルの経過時間(秒) | | data | oid | | | "person-118" | デジタルリハーサルに登場する人のID | | | value | move | opportunityLoss | 2.0 | escooterを予約できなったときに、利用できていた場合の料金を出力 | | | | | reason | "escooterEmpty" | 機会損失の理由 |

予約を失敗したときには、移動手段を絞った上で、再度移動を試みるため、move2として、上記と同様の出力が追加で行われます。

選択肢の移動手段を用いて、移動することができない場合には、以下が出力されます。

{"name":"output","time":150,"data":{"oid":"person-18","value":{"move":{"message":"Could not create plan."}}}}

current-usage.txt

{"name":"current-usage","time":60,"data":{"oid":"station-18","value":{"reserved":0,"minBattery":100.0,"type":"station","low":0,"available":4}}}
...

JSON Linesフォーマットで出力されます。 1分間隔で、すべてのステーションのescooterの状況が出力されています。

| key | | | valueの例 | 説明 | |----|----|----|----|----| | name | | | "current-usage" | | | time | | | 60 | デジタルリハーサルの経過時間(秒) | | data | oid | | "station-18" | ステーションのID | | | value | available | 4 | ステーションにおいて利用可能なescooterの台数 | | | | reserved | 0 | ステーションにおいて予約されているescooterの台数 | | | | low | 0 | ステーションにおいてバッテリの残量が低いescooterの台数 | | | | minBattery | 100.0 | ステーションに配置されているescooterのバッテリ残量の最小値(%) | | | | type | "station" | station固定 |

lowと判断されるescooterは、env.jsonにおける、USECASE_BATTERY_LOW_PERCENTによって指定された残量以下になったものです。

total-usage.txt

{"name":"total-usage","time":0,"data":{"oid":"station-14","value":{"rentCount":2,"type":"station","returnCount":1}}}
...

JSON Linesフォーマットで出力されます。 デジタルリハーサル終了時に、すべてのステーションのescooterの貸し出し結果が出力されます。

| key | | | valueの例 | 説明 | |----|----|----|----|----| | name | | | "total-usage" | | | time | | | 0 | 0固定です | | data | oid | | "station-14" | ステーションのID | | | value | rentCount | 2 | ステーションにおいて貸し出したescooterの台数 | | | | returnCount | 1 | ステーションに返却されたescooterの台数 | | | | type | "station" | station固定 |

choice.txt

{"name": "choice", "time": 110, "data": {"oid": "person-4", "value": {"plans": [{"mainMode": "CAR", "subMode": "CAR", "time": 285, "cost": 3.425899683600594, "distance": 3047.582709127686, "type": "car", "normalized_time": 1807.0, "normalized_cost": 1.0, "probability": 0.925650575652241}, {"mainMode": "CYCLING", "subMode": "WALKING", "time": 1816, "cost": 3.0, "distance": 3548.5852119360934, "type": "escooter", "normalized_time": 1888.0, "normalized_cost": 0.875682383334419, "probability": 0.005469548460307576}, {"mainMode": "CYCLING", "subMode": "WALKING", "time": 1881, "cost": 3.0, "distance": 3671.499009820486, "type": "escooter", "normalized_time": 1891.0, "normalized_cost": 0.875682383334419, "probability": 0.005398592563289859}, {"mainMode": "WALKING", "subMode": "WALKING", "time": 3565, "cost": 0.0, "distance": 3047.582709127686, "type": "pedestrian", "normalized_time": 1981.0, "normalized_cost": 0.0, "probability": 0.06347298844144315}], "people_features": [40, 1, 0, 1], "environment_features": [3047.582709127686]}}}
{"simulator":"action-selector","name":"choice","time":120,"data":{"oid":"person-4","value":{"choice":0}}}

JSON Linesフォーマットで出力されます。 移動手段を選択する際に出力されます。 選択肢と選択結果が出力されます。

選択肢は以下のフォーマットで出力されます。

| key | | | | valueの例 | 説明 | |----|----|----|----|----|----| | name | | | | "choice" | | | time | | | | 110 | デジタルリハーサルの経過時間(秒) | | data | oid | | | "person-4" | デジタルリハーサルに登場する人のID | | | value | plans | mainMode | "CAR" | 移動距離が一番長い移動手段 (CAR, WALKING, CYCLING, PT) | | | | | subMode | "CAR" | 二番目に移動距離が長い移動手段 (CAR, WALKING, CYCLING, PT) | | | | | time | 285 | 移動にかかる時間(秒) | | | | | cost | 3.425899683600594 | 移動にかかるコスト(£) | | | | | distance | 3047.582709127686 | 移動距離(m) | | | | | type | "car" | output.txtにて出力されるtype | | | | | normalized_time | 1807.0 | 平準化された時間。選択肢の平均値の10%以内に平準化 | | | | | normalized_cost | 1.0 | 平準化されたコスト。0~1に平準化 | | | | | probability | 0.925650575652241 | この選択肢が選択される確率 |

plansは、選択肢の配列になります。

選択結果は、以下のフォーマットで出力されます。

| key | | | valueの例 | 説明 | |----|----|----|----|----| | simulator | | | "action-selector" | | | name | | | "choice" | | | time | | | 120 | デジタルリハーサルの経過時間(秒) | | data | oid | | "person-4" | デジタルリハーサルに登場する人のID | | | value | choice | 0 | 選択されたplansのインデックス |

2.3 ユースケース: 道路閉鎖

概要

人が目的地に移動する手段として、車、徒歩、自転車、escooterの選択肢を設け、それぞれの人がコストや時間によって、移動手段を選択し、移動するというデジタルリハーサルを行うユースケースです。 道路を移動手段毎に時間帯で閉鎖することにより、移動ルートが変わり、移動時間に影響を与え、人の移動手段の選択に変化を与えます。

また、ダイナミックディスカウントや初期配備のユースケースと同様、以下の影響の確認も可能です。

  • escooterを借りるときに、escooterのステーションの状況に応じてディスカウントすることで、コストに影響を与え、人の移動手段の選択に変化を与えます。それにより、escooterの利用率や利用料収入への変化がどうなるかを確認することができます。
  • また、初期配備のユースケースと同様、escooterの初期配備を変更することもできます。

移動手段として、トラックも存在しています。ただし、トラックは移動手段として選択するのではなく、必ずトラックで移動する人としてデジタルリハーサルに登場します。

デジタルリハーサルの入出力

デジタルリハーサルの入出力は、ユースケースごとに定義されます。 道路閉鎖は、以下のフォーマットで入力ファイルを用意します。 出力は後述する「デジタルリハーサルの結果として出力されるファイル」のフォーマットで出力されます。

デジタルリハーサルに必要な入力ファイル

(共通)

  • stations.csv
  • road-closure.csv
  • map.net.xml.gz
  • od.csv.gz
  • (model.json)

map.net.xml.gzおよびod.csv.gzは、必ずgzipしてください。

(WEBアプリの場合)

  • precondition.json

(APIの場合)

  • condition.json
  • env.json

precondition.json

{
  "USECASE": "road-closure",
  "ASSIMIL_PERSON_FILE": "simdata-your-simdataId-of-od/od.csv.gz",
  "SOARS_STATIONS_FILE": "simdata-your-simdataId-of-stations-csv/stations.csv",
  "SUMO_NET_FILE": "simdata-your-simdataId-of-net-file/map.net.xml.gz",
  "DMM_MODEL_INFO_FILE": "simdata-your-simdataId-of-model-file/model.json",
  "ROAD_CLOSURE_FILE": "simdata-your-simdataId-of-road-closure-file/road-closure.csv",
  "MAP_CENTER_LATITUDE":"35.444395",
  "MAP_CENTER_LONGITUDE":"139.636773",
  "MAP_ZOOM": "14",
  "CURRENCY_SYMBOL": "¥",
  "CURRENCY_RATE":"189.1800",
  "START_HOUR": "10",
  "END_HOUR": "12"
}

condition.json

{
 "name":"09/11_14:59:08",
 "seed":0,
 "start":5,
 "end":6,
 "usecases":{"batteryBased":{"enabled":true,"discount":10,"lowBatteryPercent":15},"numberBased":{"enabled":true,"discount":25,"scooterNumberThreshold":1}},
 "usecase":"road-closure",
 "vtypes":{"car":true,"pedestrian":true,"escooter":false,"bicycle":false,"truck":false},
 "dmmmodel":{},
 "currencySymbol":"¥","createdAt":"2023-09-11T05:59:18.403Z","mapcenter":[139.645,35.584],
 "stations":[{"id":"bay0","initial":2,"pos":[35.438606,139.642578],"zone":"b"},{"id":"bay1","initial":0,"pos":[35.449786,139.642196],"zone":"a"},{"id":"bay2","initial":1,"pos":[35.440275,139.645568],"zone":"a"},...]
}

どのような条件でデジタルリハーサルを実行したかを登録するJSON形式のファイルです。 フォーマットは自由です。 サンプルWebサーバでは、このファイルを用いて、デジタルリハーサル結果表示を行っています。

stations.csv

name,zone,latitude,longitude,initial
bay1,a,35.55934337167842,139.63850582201087,3
bay2,a,35.580495,139.6351646,3
...

escooterのステーションの初期配置を設定するCSV形式のファイルです。

| 項目 | 値の例 | 説明 | |----|----|----| | name | bay0 | ステーションの名前。 | | zone | b | ステーションが所属するゾーン。同じゾーンのステーション間の移動しかできない。 | | latitude | 35.58 | ステーションの緯度。 | | longitude | 139.64| ステーションの経度。 | | initial | 2 | escooterの初期配備台数。 |

road-closure.csv

oid,start,end,type,polygon,lanes
948feb22aa309eda98f5f36cee428b4b,05:00:00,06:00:00,car,"139.66056921784974,35.57560496598741,139.66658309933842,35.57404537981951,139.66449131447303,35.56879927623754,139.66056921784974,35.57560496598741",""
...

閉鎖する道路を設定するCSV形式のファイルです。

| 項目 | 値の例 | 説明 | |----|----|----| | oid | 948feb22aa309eda98f5f36cee428b4b | 道路閉鎖設定のID。 | | start | 05:00:00 | 道路閉鎖を開始する時刻。[ISO_LOCAL_TIME](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/time/format/DateTimeFormatter.html#ISO_LOCAL_TIME)の形式。 | | end | 06:00:00 | 道路閉鎖を終了する時刻。[ISO_LOCAL_TIME](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/time/format/DateTimeFormatter.html#ISO_LOCAL_TIME)の形式。 | | type | car | 通行できなくなる移動手段。(car, pedestrian, escooter, bicycle, truck) | | polygon | "139.66056921784974,35.57560496598741,139.66658309933842,35.57404537981951,139.66449131447303,35.56879927623754,139.66056921784974,35.57560496598741" | 経度,緯度を組として、,で区切って領域を指定。"で囲む。 | | lanes | "" | レーンIDを,区切りで指定します。 |

map.net.xml.gz

SUMOで使用するネットファイルです。作成方法は 2.1.1 地図データ生成:OSM Converter もしくは2.6 地図データ登録手順を参照ください。

od.csv.gz

人の移動を出発地と到着地として指定するファイルです。

oid,timestamp,origin_lon,origin_lat,dest_lon,dest_lat,type,age,gender_type,driving_license,car_ownership
person-0,05:00:00,139.582230,35.436874,139.558556,35.424722,truck,52,1,1,2
...
| 項目 | 値の例 | 説明 | |----|----|----| | oid | person-0 | 必須。OD内でユニークなIDである必要があります。 | | timestamp | 05:00:00 | 必須。[ISO_LOCAL_TIME](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/time/format/DateTimeFormatter.html#ISO_LOCAL_TIME)の形式。 | | origin_lon | 139.582230 | 必須。出発地の経度。 | | origin_lat | 35.436874 | 必須。出発地の緯度。 | | dest_lon | 139.558556 | 必須。到着地の経度。 | | dest_lat | 35.424722 | 必須。到着地の緯度。 | | type | truck | 省略可能。移動手段を固定する場合に指定します。指定可能なのは、car、pedestrian、escooter、bicycle、truckです。何も指定しなければ、移動手段を選択します。 | | age | 52 | 省略可能。実年齢。 | | gender_type | 1 | 省略可能。性別。女性の場合は1、その他の場合は0。 | | driving_license | 1 | 省略可能。運転免許を持っているか。持っている場合は1、その他の場合は0。 | | car_ownership | 2 | 省略可能。世帯の車保持状況。保持していない場合は0, 大人一人につき一台以下しか保持していない場合は1、大人一人につき一台より多く保持している場合は2。 | | household_carvan | 1 | 省略可能。自家用車の数を指定します。car_ownershipが指定されていないときのみ有効です。 | | sex_type | 1 | 省略可能。1は男性。2は女性。gender_typeが指定されていないときのみ有効です。 | | age_type | 1 | 省略可能。1: 0~15歳、2: 16~24歳、3: 25~34歳、4: 35~49歳、5: 50~64歳、6: 65歳以上。ageが指定されていないときのみ有効です。 |

項目を省略する場合は、すべての行で省略します。 必須項目のみの場合は以下のような形になります。

oid,timestamp,origin_lon,origin_lat,dest_lon,dest_lat
person-0,05:00:00,139.582230,35.436874,139.558556,35.424722
...

model.json

人の行動選択モデルとして、恣意的な選択確率を指定したい場合向けのファイルです。

固定確率
{
  "rulebase_model": "fixed",
  "fixed_weights": {
    "CAR": 1,
    "WALKING": 1,
    "CYCLING": 1
  }
}

各移動手段の選択確率(重み)を指定する場合向け。

| key | | valueの例 | 説明 | |----------------|---------|-----------|------| | rulebase_model | | "fixed" | 固定確率指定 | | fixed_weights | CAR | 1 | carの重み。指定しない場合は0になります。 | | | WALKING | 1 | pedestrianの重み。指定しない場合は0になります。 | | | CYCLING | 1 | escooterの重み。指定しない場合は0になります。 |
  • escooterだけを選択させたい場合、"fixed_weights": {"CYCLING": 1}
  • carだけを選択させたい場合、"fixed_weights": {"CAR": 1}
  • pedestrianだけを選択させたい場合、"fixed_weights": {"WALKING": 1}
ランダム
{"rulebase_model": "random"}

各移動手段の選択確率をランダムにする場合向け。

時間とコストの重み係数指定
{
  "rulebase_model": "linear",
  "w_time": 1,
  "w_cost": 1
}

移動時の各選択肢に関し、時間とコストの重みを指定する場合向け。

| key | valueの例 | 説明 | |----------------|-----------|------| | rulebase_model | "linear" | | | w_time | 1 | 時間の重み。指定しない場合は1になります。 | | w_cost | 1 | コストの重み。指定しない場合は1になります。 |
  • 時間のみで移動手段を選択(時間が短い移動手段を選択)させたい場合、"w_time": 1, "w_cost": 0
  • コストのみで移動手段を選択(コストが安い移動手段を選択)させたい場合、"w_time": 0, "w_cost": 1

env.json

{
 "USECASE":"road-closure",
 "CONDITION_JSON_ID":"simdata-d2d0e1b3-7f78-4939-affc-939d712b15d7",
 "ASSIMIL_PERSON_FILE":"simdata-272c8229-5a50-48c1-b0db-771c46e3b5d3/od.csv.gz",
 "ASSIMIL_ALIGNER_MAX_STEPS":"3600",
 "ASSIMIL_ALIGNER_START_TIME":"5",
 "SOARS_STATIONS_FILE":"simdata-1c480139-c8d5-4d24-a551-af10f008339a/stations.csv",
 "SUMO_NET_FILE":"simdata-4467079a-fbd0-440e-8505-a8c518e94562/map.net.xml.gz",
 "DMM_MODEL_INFO_FILE":"simdata-feaf5067-43c2-4673-a229-43e0d7d5dc6d/model.json",
 "RANDOM_SEED":"0",
 "CURRENCY_RATE":"1.0",
 "ROAD_CLOSURE_FILE":"simdata-f261a82b-dac2-4034-a765-7e4d56901c12/road-closure.csv",
 "VTYPES":"car,pedestrian",
 "USECASE_BATTERY_ENABLED":"false",
 "USECASE_BATTERY_DISCOUNT":"0",
 "USECASE_BATTERY_LOW_PERCENT":"15",
 "USECASE_NUMBER_ENABLED":"false",
 "USECASE_NUMBER_DISCOUNT":"0",
 "USECASE_NUMBER_THRESHOLD":"1"
}

デジタルリハーサル実行時にデジタルリハーサルへの入力となる情報を記載するJSON形式のファイルです。 デジタルリハーサルの実行指示は、このenv.jsonを指定して行います。

| key | valueの例 | 説明 | |----|----|----| | USECASE | "road-closure" | 実行するデジタルリハーサルのユースケースを指定します。 | | CONDITION_JSON_ID | "simdata-d2d0e1b3-7f78-4939-affc-939d712b15d7" | "condition.json"のsimdataIdを指定します。 | | ASSIMIL_PERSON_FILE | "simdata-272c8229-5a50-48c1-b0db-771c46e3b5d3/od.csv.gz" | 登録したODファイルを使用してデジタルリハーサルを実行する場合に指定します。`simdataId/ファイル名`で指定します。指定しない場合はサンプルとして用意されているODファイルが使用されます。 | | ASSIMIL_ALIGNER_MAX_STEPS | "3600" | デジタルリハーサルの時間を指定します(秒)。例は1時間です | | ASSIMIL_ALIGNER_START_TIME | "5" | デジタルリハーサルの開始時間を指定します(時)。ODファイルのtimestampが、この時間以降で、ASSIMIL_ALIGNER_MAX_STEPSの期間のODを対象としてデジタルリハーサルを行います。 | | SOARS_STATIONS_FILE | "simdata-1c480139-c8d5-4d24-a551-af10f008339a/stations.csv" | 登録したステーションのescooterの初期配置ファイルを指定します。`simdataId/ファイル名`で指定します。 | | SUMO_NET_FILE | "simdata-4467079a-fbd0-440e-8505-a8c518e94562/map.net.xml.gz" | 登録したSUMOのネットファイルを使用してデジタルリハーサルを実行する場合に指定します。`simdataId/ファイル名`で指定します。指定しない場合はサンプルとして用意されているネットファイルが使用されます。 | | DMM_MODEL_INFO_FILE | "simdata-feaf5067-43c2-4673-a229-43e0d7d5dc6d/model.json" | 登録した行動選択モデルファイルを使用してデジタルリハーサルを実行する場合に指定します。`simdataId/ファイル名`で指定します。指定しない場合はロンドンのデータで学習された行動選択モデルが使用されます。 | | RANDOM_SEED | "0" | 乱数のシードを設定します。シードが同じであってもデジタルリハーサルの結果が同じとなるわけではありません。 | | CURRENCY_RATE | "1.0" | 通貨レートを設定します。£を基準としていますので、円換算としたい場合には、例えば186.0といった指定になります。 | | ROAD_CLOSURE_FILE | "simdata-f261a82b-dac2-4034-a765-7e4d56901c12/road-closure.csv" | 登録した道路閉鎖設定ファイルを指定します。`simdataId/ファイル名`で指定します。 | | VTYPES | "car,pedestrian" | デジタルリハーサルにおいて、移動手段の選択肢とするものを指定します。設定できるのは、car、pedestrian、escooter、bicycle、truckです。ただし、truckは、移動手段として選択されません。 | | USECASE_BATTERY_ENABLED | "false" | バッテリ残量が低いescooterのあるステーションへ返却する際に割引する施策を有効にする際にtrueにします。 | | USECASE_BATTERY_DISCOUNT | "0" | 割引する率を指定します(%)。 | | USECASE_BATTERY_LOW_PERCENT | "15" | バッテリ残量が低いと判断する残量を指定します(%)。 | | USECASE_NUMBER_ENABLED | "false" | 利用可能なescooterの台数が少ないステーションへ返却する際に割引する施策を有効にする際にtrueにします。 | | USECASE_NUMBER_DISCOUNT | "0" | 割引する率を指定します(%)。 | | USECASE_NUMBER_THRESHOLD | "1" | 利用可能な台数が少ないと判断する台数を指定します。 |

デジタルリハーサルの結果として出力されるファイル

  • states.txt
  • output.txt
  • current-usage.txt
  • total-usage.txt
  • choice.txt

これらのファイルは、デジタルリハーサル結果ファイル取得APIにて取得できます。

states.txt

{"name":"states","time":180,"data":{"oid":"person-12","value":{"wayId":"254070103#2","co2":0.0,"lon":139.64,"type":"pedestrian","lat":35.58,"speed":1.39,"ec":0.0}}}
...

JSON Linesフォーマットで出力されます。 1分毎に、人がどのような移動手段を用いてどこにいるかを緯度経度で示しています。 co2は、その時点でのco2排出量です。speedはその地点での速度になります。 wayIdは、その地点のSUMOにおける道路IDです。

| key | | | valueの例 | 説明 | |----|----|----|----|----| | name | | | "states" | | | time | | | 180 | デジタルリハーサルの経過時間(秒) | | data | oid | | "person-12" | デジタルリハーサルに登場する人のID | | | value | co2 | 0.0 | CO2排出量(mg/s) | | | | lon | 139.64 | 現在位置の経度 | | | | type | "pedestrian" | 移動手段(pedestrian, car, escooter, bicycle, truck)| | | | lat | 35.58 | 現在位置の緯度 | | | | speed | 1.39 | 現在位置での速度(m/s)| | | | ec | 0.3372070179260734 | 電力消費量(Wh/s)| | | | wayId | "254070103#2" | 道路ID |

誰も移動していないときは、dataがnullになります。

{"name":"states","time":60,"data":null}

output.txt

{"name":"output","time":8700,"data":{"oid":"person-695","value":{"move":{"travelTime":330,"carFuelCost":54.833810134163656,"carParkCharge":558.0,"carDistance":2939.5950000000003,"totalCo2":804645.4112034136,"travelRoute":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"mode":"car"},"geometry":{"type":"LineString","coordinates":[[139.6663565,35.5956173],[139.6494531,35.6088534]]}}]},"park_dst":558.0,"type":"car","carTime":330,"fuelCost":54.833810134163656}}}}
{"name":"output","time":980,"data":{"oid":"person-9","value":{"move":{"pedestrianTime":750,"travelTime":750,"pedestrianDistance":1004.0500000000001,"totalCo2":0.0,"travelRoute":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"mode":"pedestrian"},"geometry":{"type":"LineString","coordinates":[[139.6758158,35.6039659],[139.6678026,35.6030643]]}}]},"type":"pedestrian"}}}}
{"name":"output","time":1850,"data":{"oid":"person-21","value":{"move":{"pedestrianTime":1040,"escooterFee":390.6,"travelTime":1390,"escooterDiscount":0.0,"escooterCost":390.6,"pedestrianDistance":1269.5899999999997,"totalCo2":0.0,"travelRoute":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"mode":"pedestrian"},"geometry":{"type":"LineString","coordinates":[[139.6551776,35.5881223],[139.65688347811465,35.5821084092067]]}},{"type":"Feature","properties":{"mode":"escooter"},"geometry":{"type":"LineString","coordinates":[[139.65688347811465,35.5821084092067],[139.6444064,35.5818028]]}},{"type":"Feature","properties":{"mode":"pedestrian"},"geometry":{"type":"LineString","coordinates":[[139.6444064,35.5818028],[139.6477012,35.580581]]}}]},"escooterDistance":1215.5099999999998,"escooterTime":350,"type":"pedestrian-escooter-pedestrian","escooterFeeDiscount":0.0}}}}
{"name":"output","time":8670,"data":{"oid":"person-564","value":{"move":{"reason":"escooterEmpty","opportunityLoss":409.20000000000005},"move2":{"pedestrianTime":1810,"travelTime":1810,"pedestrianDistance":2249.7899999999995,"totalCo2":0.0,"travelRoute":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"mode":"pedestrian"},"geometry":{"type":"LineString","coordinates":[[139.6307184,35.5844267],[139.6429601,35.5702724]]}}]},"type":"pedestrian"}}}}
...

JSON Linesフォーマットで出力されます。 10秒間隔で、目的地に到着した人の移動の履歴を出力します。 一人に対して、その人が到着した時のみ、その人の情報が一度だけ出力されます。

| key | | | | valueの例 | 説明 | |----|----|----|----|----|----| | name | | | | "output" | | | time | | | | 1010 | デジタルリハーサルの経過時間(秒) | | data | oid | | | "person-269" | デジタルリハーサルに登場する人のID | | | value | move | travelTime | 500 | 移動にかかった時間(s) | | | | | totalCo2 | 11818.295182953709 | CO2排出量(mg) | | | | | type | "car" | 移動手段(pedestrian, car, pedestrian-escooter-pedestrian, bicycle, truck)| | | | | carTime | 380 | carで移動した時間(s) | | | | | carDistance | 330 | carで移動した距離(m) | | | | | pedestrianTime | 380 | pedestrianで移動した時間(s) | | | | | pedestrianDistance | 330 | pedestrianで移動した距離(m) | | | | | escooterTime | 380 | escooterで移動した時間(s) | | | | | escooterDistance | 330 | escooterで移動した距離(m) | | | | | bicycleTime | 380 | bicycleで移動した時間(s) | | | | | bicycleDistance | 330 | bicycleで移動した距離(m) | | | | | truckTime | 380 | truckで移動した時間(s) | | | | | truckDistance | 330 | truckで移動した距離(m) | | | | | escooterFeeCost | 1.7 | 利用料金 | | | | | escooterFeeDiscount | 0.0 | 割引される額(負の値) | | | | | carFuelCost | 201.1 | 燃料代 | | | | | carParkCharge | 200.0 | 車のみの移動時の目的地の駐車料金 | | | | | bicycleParkCharge | 100.0 | 自転車のみの移動時の目的地の駐車料金 | | | | | escooterCost | 1.7 | 利用料金(割引後の金額) | | | | | escooterDiscount | 0.0 | 割引された額(負の値) | | | | | fuelCost | 201.1 | 燃料代 (carのみ) | | | | | park_dst | 200.0 | 車もしくは自転車で移動時の目的地の駐車料金(carのみ) | | | | | travelRoute || 移動手段を含む移動経路 |

料金は、£を起点としており、env.jsonにてCURRENCY_RATEを設定することで、レートで換算した値が返されます。 escooter利用料金は、基本料金が1.5£で、1分毎に0.1£です。 駐車料金は、車が3£で、自転車が1£です。

また、escooterが借りれなかった場合には、moveは以下の出力となります。

| key | | | | valueの例 | 説明 | |----|----|----|----|----|----| | name | | | | "output" | | | time | | | | 480 | デジタルリハーサルの経過時間(秒) | | data | oid | | | "person-118" | デジタルリハーサルに登場する人のID | | | value | move | opportunityLoss | 2.0 | escooterを予約できなったときに、利用できていた場合の料金を出力 | | | | | reason | "escooterEmpty" | 機会損失の理由 |

予約を失敗したときには、移動手段を絞った上で、再度移動を試みるため、move2として、上記と同様の出力が追加で行われます。

選択肢の移動手段を用いて、移動することができない場合には、以下が出力されます。

{"name":"output","time":150,"data":{"oid":"person-18","value":{"move":{"message":"Could not create plan."}}}}

current-usage.txt

{"name":"current-usage","time":60,"data":{"oid":"station-18","value":{"reserved":0,"minBattery":100.0,"type":"station","low":0,"available":4}}}
...

JSON Linesフォーマットで出力されます。 1分間隔で、すべてのステーションのescooterの状況が出力されています。

| key | | | valueの例 | 説明 | |----|----|----|----|----| | name | | | "current-usage" | | | time | | | 60 | デジタルリハーサルの経過時間(秒) | | data | oid | | "station-18" | ステーションのID | | | value | available | 4 | ステーションにおいて利用可能なescooterの台数 | | | | reserved | 0 | ステーションにおいて予約されているescooterの台数 | | | | low | 0 | ステーションにおいてバッテリの残量が低いescooterの台数 | | | | minBattery | 100.0 | ステーションに配置されているescooterのバッテリ残量の最小値(%) | | | | type | "station" | station固定 |

lowと判断されるescooterは、env.jsonにおける、USECASE_BATTERY_LOW_PERCENTによって指定された残量以下になったものです。

total-usage.txt

{"name":"total-usage","time":0,"data":{"oid":"station-14","value":{"rentCount":2,"type":"station","returnCount":1}}}
...

JSON Linesフォーマットで出力されます。 デジタルリハーサル終了時に、すべてのステーションのescooterの貸し出し結果が出力されます。

| key | | | valueの例 | 説明 | |----|----|----|----|----| | name | | | "total-usage" | | | time | | | 0 | 0固定です | | data | oid | | "station-14" | ステーションのID | | | value | rentCount | 2 | ステーションにおいて貸し出したescooterの台数 | | | | returnCount | 1 | ステーションに返却されたescooterの台数 | | | | type | "station" | station固定 |

choice.txt

{"name": "choice", "time": 110, "data": {"oid": "person-4", "value": {"plans": [{"mainMode": "CAR", "subMode": "CAR", "time": 285, "cost": 3.425899683600594, "distance": 3047.582709127686, "type": "car", "normalized_time": 1807.0, "normalized_cost": 1.0, "probability": 0.925650575652241}, {"mainMode": "CYCLING", "subMode": "WALKING", "time": 1816, "cost": 3.0, "distance": 3548.5852119360934, "type": "escooter", "normalized_time": 1888.0, "normalized_cost": 0.875682383334419, "probability": 0.005469548460307576}, {"mainMode": "CYCLING", "subMode": "WALKING", "time": 1881, "cost": 3.0, "distance": 3671.499009820486, "type": "escooter", "normalized_time": 1891.0, "normalized_cost": 0.875682383334419, "probability": 0.005398592563289859}, {"mainMode": "WALKING", "subMode": "WALKING", "time": 3565, "cost": 0.0, "distance": 3047.582709127686, "type": "pedestrian", "normalized_time": 1981.0, "normalized_cost": 0.0, "probability": 0.06347298844144315}], "people_features": [40, 1, 0, 1], "environment_features": [3047.582709127686]}}}
{"simulator":"action-selector","name":"choice","time":120,"data":{"oid":"person-4","value":{"choice":0}}}

JSON Linesフォーマットで出力されます。 移動手段を選択する際に出力されます。 選択肢と選択結果が出力されます。

選択肢は以下のフォーマットで出力されます。

| key | | | | valueの例 | 説明 | |----|----|----|----|----|----| | name | | | | "choice" | | | time | | | | 110 | デジタルリハーサルの経過時間(秒) | | data | oid | | | "person-4" | デジタルリハーサルに登場する人のID | | | value | plans | mainMode | "CAR" | 移動距離が一番長い移動手段 (CAR, WALKING, CYCLING, PT) | | | | | subMode | "CAR" | 二番目に移動距離が長い移動手段 (CAR, WALKING, CYCLING, PT) | | | | | time | 285 | 移動にかかる時間(秒) | | | | | cost | 3.425899683600594 | 移動にかかるコスト(£) | | | | | distance | 3047.582709127686 | 移動距離(m) | | | | | type | "car" | output.txtにて出力されるtype | | | | | normalized_time | 1807.0 | 平準化された時間。選択肢の平均値の10%以内に平準化 | | | | | normalized_cost | 1.0 | 平準化されたコスト。0~1に平準化 | | | | | probability | 0.925650575652241 | この選択肢が選択される確率 |

plansは、選択肢の配列になります。

選択結果は、以下のフォーマットで出力されます。

| key | | | valueの例 | 説明 | |----|----|----|----|----| | simulator | | | "action-selector" | | | name | | | "choice" | | | time | | | 120 | デジタルリハーサルの経過時間(秒) | | data | oid | | "person-4" | デジタルリハーサルに登場する人のID | | | value | choice | 0 | 選択されたplansのインデックス |

2.4 ユースケース: ロードプライシング

概要

人が目的地に移動する手段として、車、徒歩、自転車、escooterの選択肢を設け、それぞれの人がコストや時間によって、移動手段を選択し、移動するというデジタルリハーサルを行うユースケースです。 道路に対して、移動手段毎に時間帯で課金することにより、コストに影響を与え、迂回する場合には移動時間に影響を与え、人の移動手段の選択に変化を与えます。

また、道路閉鎖やダイナミックディスカウントや初期配備のユースケースと同様、以下の影響の確認も可能です。

  • 道路を移動手段毎に時間帯で閉鎖することにより、移動ルートが変わり、移動時間に影響を与え、人の移動手段の選択に変化を与えます。
  • escooterを借りるときに、escooterのステーションの状況に応じてディスカウントすることで、コストに影響を与え、人の移動手段の選択に変化を与えます。それにより、escooterの利用率や利用料収入への変化がどうなるかを確認することができます。
  • また、初期配備のユースケースと同様、escooterの初期配備を変更することもできます。

移動手段として、トラックも存在しています。ただし、トラックは移動手段として選択するのではなく、必ずトラックで移動する人としてデジタルリハーサルに登場します。

デジタルリハーサルの入出力

デジタルリハーサルの入出力は、ユースケースごとに定義されます。 ロードプライシングは、以下のフォーマットで入力ファイルを用意します。 出力は後述する「デジタルリハーサルの結果として出力されるファイル」のフォーマットで出力されます。

デジタルリハーサルに必要な入力ファイル

(共通)

  • stations.csv
  • road-closure.csv
  • road-pricing.csv
  • map.net.xml.gz
  • od.csv.gz
  • (model.json)

map.net.xml.gzおよびod.csv.gzは、必ずgzipしてください。

(WEBアプリの場合)

  • precondition.json

(APIの場合)

  • condition.json
  • env.json

precondition.json

{
  "USECASE": "road-pricing",
  "ASSIMIL_PERSON_FILE": "simdata-your-simdataId-of-od/od.csv.gz",
  "SOARS_STATIONS_FILE": "simdata-your-simdataId-of-stations-csv/stations.csv",
  "SUMO_NET_FILE": "simdata-your-simdataId-of-net-file/map.net.xml.gz",
  "DMM_MODEL_INFO_FILE": "simdata-your-simdataId-of-model-file/model.json",
  "ROAD_CLOSURE_FILE": "simdata-your-simdataId-of-road-closure-file/road-closure.csv",
  "ROAD_PRICING_FILE": "simdata-your-simdataId-of-road-pricing-file/road-pricing.csv",
  "MAP_CENTER_LATITUDE":"35.444395",
  "MAP_CENTER_LONGITUDE":"139.636773",
  "MAP_ZOOM": "14",
  "CURRENCY_SYMBOL": "¥",
  "CURRENCY_RATE":"189.1800",
  "START_HOUR": "10",
  "END_HOUR": "12"
}

condition.json

{
 "name":"09/11_14:59:08",
 "seed":0,
 "start":5,
 "end":6,
 "usecases":{"batteryBased":{"enabled":true,"discount":10,"lowBatteryPercent":15},"numberBased":{"enabled":true,"discount":25,"scooterNumberThreshold":1}},
 "usecase":"road-pricing",
 "vtypes":{"car":true,"pedestrian":true,"escooter":false,"bicycle":false,"truck":false},
 "detour":{"car":true,"pedestrian":false,"bicycle":false},
 "dmmmodel":{},
 "currencySymbol":"¥","createdAt":"2023-09-11T05:59:18.403Z","mapcenter":[139.645,35.584],
 "stations":[{"id":"bay0","initial":2,"pos":[35.438606,139.642578],"zone":"b"},{"id":"bay1","initial":0,"pos":[35.449786,139.642196],"zone":"a"},{"id":"bay2","initial":1,"pos":[35.440275,139.645568],"zone":"a"},...]
}

どのような条件でデジタルリハーサルを実行したかを登録するJSON形式のファイルです。 フォーマットは自由です。 サンプルWebサーバでは、このファイルを用いて、デジタルリハーサル結果表示を行っています。

stations.csv

name,zone,latitude,longitude,initial
bay1,a,35.55934337167842,139.63850582201087,3
bay2,a,35.580495,139.6351646,3
...

escooterのステーションの初期配置を設定するCSV形式のファイルです。

| 項目 | 値の例 | 説明 | |----|----|----| | name | bay0 | ステーションの名前。 | | zone | b | ステーションが所属するゾーン。同じゾーンのステーション間の移動しかできない。 | | latitude | 35.58 | ステーションの緯度。 | | longitude | 139.64| ステーションの経度。 | | initial | 2 | escooterの初期配備台数。 |

road-closure.csv

oid,start,end,type,polygon,lanes
948feb22aa309eda98f5f36cee428b4b,05:00:00,06:00:00,car,"139.66056921784974,35.57560496598741,139.66658309933842,35.57404537981951,139.66449131447303,35.56879927623754,139.66056921784974,35.57560496598741",""
...

閉鎖する道路を設定するCSV形式のファイルです。

| 項目 | 値の例 | 説明 | |----|----|----| | oid | 948feb22aa309eda98f5f36cee428b4b | 道路閉鎖設定のID。 | | start | 05:00:00 | 道路閉鎖を開始する時刻。[ISO_LOCAL_TIME](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/time/format/DateTimeFormatter.html#ISO_LOCAL_TIME)の形式。 | | end | 06:00:00 | 道路閉鎖を終了する時刻。[ISO_LOCAL_TIME](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/time/format/DateTimeFormatter.html#ISO_LOCAL_TIME)の形式。 | | type | car | 通行できなくなる移動手段。(car, pedestrian, escooter, bicycle, truck) | | polygon | "139.66056921784974,35.57560496598741,139.66658309933842,35.57404537981951,139.66449131447303,35.56879927623754,139.66056921784974,35.57560496598741" | 経度,緯度を組として、,で区切って領域を指定。"で囲む。 | | lanes | "" | レーンIDを,区切りで指定します。 |

road-pricing.csv

oid,start,end,type,price,polygon
2ac5dc629aebf5a9077c2a77178a0b84,05:00:00,06:00:00,car,200,"139.6512009048468,35.579720773775605,139.6559554628551,35.5770538920699,139.65275843247736,35.57592044045461,139.6512009048468,35.579720773775605"
...

課金する道路を設定するCSV形式のファイルです。

| 項目 | 値の例 | 説明 | |----|----|----| | oid | 2ac5dc629aebf5a9077c2a77178a0b84 | 道路課金設定のID。 | | start | 05:00:00 | 道路課金を開始する時刻。[ISO_LOCAL_TIME](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/time/format/DateTimeFormatter.html#ISO_LOCAL_TIME)の形式。 | | end | 06:00:00 | 道路課金を終了する時刻。[ISO_LOCAL_TIME](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/time/format/DateTimeFormatter.html#ISO_LOCAL_TIME)の形式。 | | type | car | 課金される移動手段。(car, pedestrian, escooter, bicycle, truck) | | price | 200 | 課金額。 | | polygon | "139.66056921784974,35.57560496598741,139.66658309933842,35.57404537981951,139.66449131447303,35.56879927623754,139.66056921784974,35.57560496598741" | 経度,緯度を組として、,で区切って領域を指定。"で囲む。 |

map.net.xml.gz

SUMOで使用するネットファイルです。作成方法は 2.1.1 地図データ生成:OSM Converter もしくは2.6 地図データ登録手順を参照ください。

od.csv.gz

人の移動を出発地と到着地として指定するファイルです。

oid,timestamp,origin_lon,origin_lat,dest_lon,dest_lat,type,age,gender_type,driving_license,car_ownership
person-0,05:00:00,139.582230,35.436874,139.558556,35.424722,truck,52,1,1,2
...
| 項目 | 値の例 | 説明 | |----|----|----| | oid | person-0 | 必須。OD内でユニークなIDである必要があります。 | | timestamp | 05:00:00 | 必須。[ISO_LOCAL_TIME](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/time/format/DateTimeFormatter.html#ISO_LOCAL_TIME)の形式。 | | origin_lon | 139.582230 | 必須。出発地の経度。 | | origin_lat | 35.436874 | 必須。出発地の緯度。 | | dest_lon | 139.558556 | 必須。到着地の経度。 | | dest_lat | 35.424722 | 必須。到着地の緯度。 | | type | truck | 省略可能。移動手段を固定する場合に指定します。指定可能なのは、car、pedestrian、escooter、bicycle、truckです。何も指定しなければ、移動手段を選択します。 | | age | 52 | 省略可能。実年齢。 | | gender_type | 1 | 省略可能。性別。女性の場合は1、その他の場合は0。 | | driving_license | 1 | 省略可能。運転免許を持っているか。持っている場合は1、その他の場合は0。 | | car_ownership | 2 | 省略可能。世帯の車保持状況。保持していない場合は0, 大人一人につき一台以下しか保持していない場合は1、大人一人につき一台より多く保持している場合は2。 | | household_carvan | 1 | 省略可能。自家用車の数を指定します。car_ownershipが指定されていないときのみ有効です。 | | sex_type | 1 | 省略可能。1は男性。2は女性。gender_typeが指定されていないときのみ有効です。 | | age_type | 1 | 省略可能。1: 0~15歳、2: 16~24歳、3: 25~34歳、4: 35~49歳、5: 50~64歳、6: 65歳以上。ageが指定されていないときのみ有効です。 |

項目を省略する場合は、すべての行で省略します。 必須項目のみの場合は以下のような形になります。

oid,timestamp,origin_lon,origin_lat,dest_lon,dest_lat
person-0,05:00:00,139.582230,35.436874,139.558556,35.424722
...

model.json

人の行動選択モデルとして、恣意的な選択確率を指定したい場合向けのファイルです。

固定確率
{
  "rulebase_model": "fixed",
  "fixed_weights": {
    "CAR": 1,
    "WALKING": 1,
    "CYCLING": 1
  }
}

各移動手段の選択確率(重み)を指定する場合向け。

| key | | valueの例 | 説明 | |----------------|---------|-----------|------| | rulebase_model | | "fixed" | 固定確率指定 | | fixed_weights | CAR | 1 | carの重み。指定しない場合は0になります。 | | | WALKING | 1 | pedestrianの重み。指定しない場合は0になります。 | | | CYCLING | 1 | escooterの重み。指定しない場合は0になります。 |
  • escooterだけを選択させたい場合、"fixed_weights": {"CYCLING": 1}
  • carだけを選択させたい場合、"fixed_weights": {"CAR": 1}
  • pedestrianだけを選択させたい場合、"fixed_weights": {"WALKING": 1}
ランダム
{"rulebase_model": "random"}

各移動手段の選択確率をランダムにする場合向け。

時間とコストの重み係数指定
{
  "rulebase_model": "linear",
  "w_time": 1,
  "w_cost": 1
}

移動時の各選択肢に関し、時間とコストの重みを指定する場合向け。

| key | valueの例 | 説明 | |----------------|-----------|------| | rulebase_model | "linear" | | | w_time | 1 | 時間の重み。指定しない場合は1になります。 | | w_cost | 1 | コストの重み。指定しない場合は1になります。 |
  • 時間のみで移動手段を選択(時間が短い移動手段を選択)させたい場合、"w_time": 1, "w_cost": 0
  • コストのみで移動手段を選択(コストが安い移動手段を選択)させたい場合、"w_time": 0, "w_cost": 1

env.json

{
 "USECASE":"road-pricing",
 "CONDITION_JSON_ID":"simdata-d2d0e1b3-7f78-4939-affc-939d712b15d7",
 "ASSIMIL_PERSON_FILE":"simdata-272c8229-5a50-48c1-b0db-771c46e3b5d3/od.csv.gz",
 "ASSIMIL_ALIGNER_MAX_STEPS":"3600",
 "ASSIMIL_ALIGNER_START_TIME":"5",
 "SOARS_STATIONS_FILE":"simdata-1c480139-c8d5-4d24-a551-af10f008339a/stations.csv",
 "SUMO_NET_FILE":"simdata-4467079a-fbd0-440e-8505-a8c518e94562/map.net.xml.gz",
 "DMM_MODEL_INFO_FILE":"simdata-feaf5067-43c2-4673-a229-43e0d7d5dc6d/model.json",
 "RANDOM_SEED":"0",
 "CURRENCY_RATE":"1.0",
 "ROAD_CLOSURE_FILE":"simdata-f261a82b-dac2-4034-a765-7e4d56901c12/road-closure.csv",
 "ROAD_PRICING_FILE":"simdata-f0917da6-4a9b-4e24-99f4-909f240be14d/road-pricing.csv",
 "VTYPES":"car,pedestrian",
 "DETOUR_VTYPES":"car",
 "USECASE_BATTERY_ENABLED":"false",
 "USECASE_BATTERY_DISCOUNT":"0",
 "USECASE_BATTERY_LOW_PERCENT":"15",
 "USECASE_NUMBER_ENABLED":"false",
 "USECASE_NUMBER_DISCOUNT":"0",
 "USECASE_NUMBER_THRESHOLD":"1"
}

デジタルリハーサル実行時にデジタルリハーサルへの入力となる情報を記載するJSON形式のファイルです。 デジタルリハーサルの実行指示は、このenv.jsonを指定して行います。

| key | valueの例 | 説明 | |----|----|----| | USECASE | "road-pricing" | 実行するデジタルリハーサルのユースケースを指定します。 | | CONDITION_JSON_ID | "simdata-d2d0e1b3-7f78-4939-affc-939d712b15d7" | "condition.json"のsimdataIdを指定します。 | | ASSIMIL_PERSON_FILE | "simdata-272c8229-5a50-48c1-b0db-771c46e3b5d3/od.csv.gz" | 登録したODファイルを使用してデジタルリハーサルを実行する場合に指定します。`simdataId/ファイル名`で指定します。指定しない場合はサンプルとして用意されているODファイルが使用されます。 | | ASSIMIL_ALIGNER_MAX_STEPS | "3600" | デジタルリハーサルの時間を指定します(秒)。例は1時間です | | ASSIMIL_ALIGNER_START_TIME | "5" | デジタルリハーサルの開始時間を指定します(時)。ODファイルのtimestampが、この時間以降で、ASSIMIL_ALIGNER_MAX_STEPSの期間のODを対象としてデジタルリハーサルを行います。 | | SOARS_STATIONS_FILE | "simdata-1c480139-c8d5-4d24-a551-af10f008339a/stations.csv" | 登録したステーションのescooterの初期配置ファイルを指定します。`simdataId/ファイル名`で指定します。 | | SUMO_NET_FILE | "simdata-4467079a-fbd0-440e-8505-a8c518e94562/map.net.xml.gz" | 登録したSUMOのネットファイルを使用してデジタルリハーサルを実行する場合に指定します。`simdataId/ファイル名`で指定します。指定しない場合はサンプルとして用意されているネットファイルが使用されます。 | | DMM_MODEL_INFO_FILE | "simdata-feaf5067-43c2-4673-a229-43e0d7d5dc6d/model.json" | 登録した行動選択モデルファイルを使用してデジタルリハーサルを実行する場合に指定します。`simdataId/ファイル名`で指定します。指定しない場合はロンドンのデータで学習された行動選択モデルが使用されます。 | | RANDOM_SEED | "0" | 乱数のシードを設定します。シードが同じであってもデジタルリハーサルの結果が同じとなるわけではありません。 | | CURRENCY_RATE | "1.0" | 通貨レートを設定します。£を基準としていますので、円換算としたい場合には、例えば186.0といった指定になります。 | | ROAD_CLOSURE_FILE | "simdata-f261a82b-dac2-4034-a765-7e4d56901c12/road-closure.csv" | 登録した道路閉鎖設定ファイルを指定します。`simdataId/ファイル名`で指定します。 | | ROAD_PRICING_FILE | "simdata-f0917da6-4a9b-4e24-99f4-909f240be14d/road-pricing.csv" | 登録した道路課金設定ファイルを指定します。`simdataId/ファイル名`で指定します。 | | VTYPES | "car,pedestrian" | デジタルリハーサルにおいて、移動手段の選択肢とするものを指定します。設定できるのは、car、pedestrian、escooter、bicycle、truckです。ただし、truckは、移動手段として選択されません。 | | DETOUR_VTYPES | "car" | 迂回する移動手段を指定します。設定できるのは、car、pedestrian、bicycleです。 | | USECASE_BATTERY_ENABLED | "false" | バッテリ残量が低いescooterのあるステーションへ返却する際に割引する施策を有効にする際にtrueにします。 | | USECASE_BATTERY_DISCOUNT | "0" | 割引する率を指定します(%)。 | | USECASE_BATTERY_LOW_PERCENT | "15" | バッテリ残量が低いと判断する残量を指定します(%)。 | | USECASE_NUMBER_ENABLED | "false" | 利用可能なescooterの台数が少ないステーションへ返却する際に割引する施策を有効にする際にtrueにします。 | | USECASE_NUMBER_DISCOUNT | "0" | 割引する率を指定します(%)。 | | USECASE_NUMBER_THRESHOLD | "1" | 利用可能な台数が少ないと判断する台数を指定します。 |

デジタルリハーサルの結果として出力されるファイル

  • states.txt
  • output.txt
  • current-usage.txt
  • total-usage.txt
  • choice.txt

これらのファイルは、デジタルリハーサル結果ファイル取得APIにて取得できます。

states.txt

{"name":"states","time":180,"data":{"oid":"person-12","value":{"wayId":"254070103#2","co2":0.0,"lon":139.64,"type":"pedestrian","lat":35.58,"speed":1.39,"ec":0.0}}}
...

JSON Linesフォーマットで出力されます。 1分毎に、人がどのような移動手段を用いてどこにいるかを緯度経度で示しています。 co2は、その時点でのco2排出量です。speedはその地点での速度になります。 wayIdは、その地点のSUMOにおける道路IDです。

| key | | | valueの例 | 説明 | |----|----|----|----|----| | name | | | "states" | | | time | | | 180 | デジタルリハーサルの経過時間(秒) | | data | oid | | "person-12" | デジタルリハーサルに登場する人のID | | | value | co2 | 0.0 | CO2排出量(mg/s) | | | | lon | 139.64 | 現在位置の経度 | | | | type | "pedestrian" | 移動手段(pedestrian, car, escooter, bicycle, truck)| | | | lat | 35.58 | 現在位置の緯度 | | | | speed | 1.39 | 現在位置での速度(m/s)| | | | ec | 0.3372070179260734 | 電力消費量(Wh/s)| | | | wayId | "254070103#2" | 道路ID |

誰も移動していないときは、dataがnullになります。

{"name":"states","time":60,"data":null}

output.txt

{"name":"output","time":810,"data":{"oid":"person-22","value":{"move":{"travelTime":410,"carFuelCost":67.96146549542729,"carParkCharge":558.0,"carToll":200.0,"carDistance":3889.3099999999986,"totalCo2":997283.9971498502,"travelRoute":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"mode":"car"},"geometry":{"type":"LineString","coordinates":[[139.6562912,35.601877],[139.6605364,35.5808197]]}}]},"park_dst":558.0,"type":"car","carTime":410,"toll":200.0,"fuelCost":67.96146549542729}}}}
{"name":"output","time":850,"data":{"oid":"person-32","value":{"move":{"travelTime":360,"carFuelCost":61.355974420527964,"carDistance":4107.1500000000015,"detour":true,"totalCo2":900353.3248300118,"travelRoute":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"mode":"car"},"geometry":{"type":"LineString","coordinates":[[139.6605364,35.5808197],[139.6279828,35.59391]]}}]},"type":"car","carTime":360,"fuelCost":61.355974420527964}}}}
{"name":"output","time":980,"data":{"oid":"person-9","value":{"move":{"pedestrianTime":750,"travelTime":750,"pedestrianDistance":1004.0500000000001,"totalCo2":0.0,"travelRoute":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"mode":"pedestrian"},"geometry":{"type":"LineString","coordinates":[[139.6758158,35.6039659],[139.6678026,35.6030643]]}}]},"type":"pedestrian"}}}}
{"name":"output","time":1850,"data":{"oid":"person-21","value":{"move":{"pedestrianTime":1040,"escooterFee":390.6,"travelTime":1390,"escooterDiscount":0.0,"escooterCost":390.6,"pedestrianDistance":1269.5899999999997,"totalCo2":0.0,"travelRoute":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"mode":"pedestrian"},"geometry":{"type":"LineString","coordinates":[[139.6551776,35.5881223],[139.65688347811465,35.5821084092067]]}},{"type":"Feature","properties":{"mode":"escooter"},"geometry":{"type":"LineString","coordinates":[[139.65688347811465,35.5821084092067],[139.6444064,35.5818028]]}},{"type":"Feature","properties":{"mode":"pedestrian"},"geometry":{"type":"LineString","coordinates":[[139.6444064,35.5818028],[139.6477012,35.580581]]}}]},"escooterDistance":1215.5099999999998,"escooterTime":350,"type":"pedestrian-escooter-pedestrian","escooterFeeDiscount":0.0}}}}
{"name":"output","time":8670,"data":{"oid":"person-564","value":{"move":{"reason":"escooterEmpty","opportunityLoss":409.20000000000005},"move2":{"pedestrianTime":1810,"travelTime":1810,"pedestrianDistance":2249.7899999999995,"totalCo2":0.0,"travelRoute":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"mode":"pedestrian"},"geometry":{"type":"LineString","coordinates":[[139.6307184,35.5844267],[139.6429601,35.5702724]]}}]},"type":"pedestrian"}}}}
...

JSON Linesフォーマットで出力されます。 10秒間隔で、目的地に到着した人の移動の履歴を出力します。 一人に対して、その人が到着した時のみ、その人の情報が一度だけ出力されます。

| key | | | | valueの例 | 説明 | |----|----|----|----|----|----| | name | | | | "output" | | | time | | | | 1010 | デジタルリハーサルの経過時間(秒) | | data | oid | | | "person-269" | デジタルリハーサルに登場する人のID | | | value | move | travelTime | 500 | 移動にかかった時間(s) | | | | | totalCo2 | 11818.295182953709 | CO2排出量(mg) | | | | | type | "car" | 移動手段(pedestrian, car, pedestrian-escooter-pedestrian, bicycle, truck)| | | | | carTime | 380 | carで移動した時間(s) | | | | | carDistance | 330 | carで移動した距離(m) | | | | | pedestrianTime | 380 | pedestrianで移動した時間(s) | | | | | pedestrianDistance | 330 | pedestrianで移動した距離(m) | | | | | escooterTime | 380 | escooterで移動した時間(s) | | | | | escooterDistance | 330 | escooterで移動した距離(m) | | | | | bicycleTime | 380 | bicycleで移動した時間(s) | | | | | bicycleDistance | 330 | bicycleで移動した距離(m) | | | | | truckTime | 380 | truckで移動した時間(s) | | | | | truckDistance | 330 | truckで移動した距離(m) | | | | | escooterFeeCost | 1.7 | 利用料金 | | | | | escooterFeeDiscount | 0.0 | 割引される額(負の値) | | | | | carFuelCost | 201.1 | 燃料代 | | | | | carParkCharge | 200.0 | 車のみの移動時の目的地の駐車料金 | | | | | bicycleParkCharge | 100.0 | 自転車のみの移動時の目的地の駐車料金 | | | | | carToll | 200 | 課金額 | | | | | pedestrianToll | 200 | 課金額 | | | | | escooterToll | 200 | 課金額 | | | | | bicycleToll | 200 | 課金額 | | | | | truckToll | 200 | 課金額 | | | | | detour | true | 迂回した場合にtrueが設定される | | | | | escooterCost | 1.7 | 利用料金(割引後の金額) | | | | | escooterDiscount | 0.0 | 割引された額(負の値) | | | | | fuelCost | 201.1 | 燃料代 (carのみ) | | | | | park_dst | 200.0 | 車もしくは自転車で移動時の目的地の駐車料金(carのみ) | | | | | toll | 200 | 課金額 | | | | | travelRoute || 移動手段を含む移動経路 |

料金は、£を起点としており、env.jsonにてCURRENCY_RATEを設定することで、レートで換算した値が返されます。 escooter利用料金は、基本料金が1.5£で、1分毎に0.1£です。 駐車料金は、車が3£で、自転車が1£です。

また、escooterが借りれなかった場合には、moveは以下の出力となります。

| key | | | | valueの例 | 説明 | |----|----|----|----|----|----| | name | | | | "output" | | | time | | | | 480 | デジタルリハーサルの経過時間(秒) | | data | oid | | | "person-118" | デジタルリハーサルに登場する人のID | | | value | move | opportunityLoss | 2.0 | escooterを予約できなったときに、利用できていた場合の料金を出力 | | | | | reason | "escooterEmpty" | 機会損失の理由 |

予約を失敗したときには、移動手段を絞った上で、再度移動を試みるため、move2として、上記と同様の出力が追加で行われます。

選択肢の移動手段を用いて、移動することができない場合には、以下が出力されます。

{"name":"output","time":150,"data":{"oid":"person-18","value":{"move":{"message":"Could not create plan."}}}}

current-usage.txt

{"name":"current-usage","time":60,"data":{"oid":"station-18","value":{"reserved":0,"minBattery":100.0,"type":"station","low":0,"available":4}}}
...

JSON Linesフォーマットで出力されます。 1分間隔で、すべてのステーションのescooterの状況が出力されています。

| key | | | valueの例 | 説明 | |----|----|----|----|----| | name | | | "current-usage" | | | time | | | 60 | デジタルリハーサルの経過時間(秒) | | data | oid | | "station-18" | ステーションのID | | | value | available | 4 | ステーションにおいて利用可能なescooterの台数 | | | | reserved | 0 | ステーションにおいて予約されているescooterの台数 | | | | low | 0 | ステーションにおいてバッテリの残量が低いescooterの台数 | | | | minBattery | 100.0 | ステーションに配置されているescooterのバッテリ残量の最小値(%) | | | | type | "station" | station固定 |

lowと判断されるescooterは、env.jsonにおける、USECASE_BATTERY_LOW_PERCENTによって指定された残量以下になったものです。

total-usage.txt

{"name":"total-usage","time":0,"data":{"oid":"station-14","value":{"rentCount":2,"type":"station","returnCount":1}}}
...

JSON Linesフォーマットで出力されます。 デジタルリハーサル終了時に、すべてのステーションのescooterの貸し出し結果が出力されます。

| key | | | valueの例 | 説明 | |----|----|----|----|----| | name | | | "total-usage" | | | time | | | 0 | 0固定です | | data | oid | | "station-14" | ステーションのID | | | value | rentCount | 2 | ステーションにおいて貸し出したescooterの台数 | | | | returnCount | 1 | ステーションに返却されたescooterの台数 | | | | type | "station" | station固定 |

choice.txt

{"name": "choice", "time": 110, "data": {"oid": "person-4", "value": {"plans": [{"mainMode": "CAR", "subMode": "CAR", "time": 285, "cost": 3.425899683600594, "distance": 3047.582709127686, "type": "car", "normalized_time": 1807.0, "normalized_cost": 1.0, "probability": 0.925650575652241}, {"mainMode": "CYCLING", "subMode": "WALKING", "time": 1816, "cost": 3.0, "distance": 3548.5852119360934, "type": "escooter", "normalized_time": 1888.0, "normalized_cost": 0.875682383334419, "probability": 0.005469548460307576}, {"mainMode": "CYCLING", "subMode": "WALKING", "time": 1881, "cost": 3.0, "distance": 3671.499009820486, "type": "escooter", "normalized_time": 1891.0, "normalized_cost": 0.875682383334419, "probability": 0.005398592563289859}, {"mainMode": "WALKING", "subMode": "WALKING", "time": 3565, "cost": 0.0, "distance": 3047.582709127686, "type": "pedestrian", "normalized_time": 1981.0, "normalized_cost": 0.0, "probability": 0.06347298844144315}], "people_features": [40, 1, 0, 1], "environment_features": [3047.582709127686]}}}
{"simulator":"action-selector","name":"choice","time":120,"data":{"oid":"person-4","value":{"choice":0}}}

JSON Linesフォーマットで出力されます。 移動手段を選択する際に出力されます。 選択肢と選択結果が出力されます。

選択肢は以下のフォーマットで出力されます。

| key | | | | valueの例 | 説明 | |----|----|----|----|----|----| | name | | | | "choice" | | | time | | | | 110 | デジタルリハーサルの経過時間(秒) | | data | oid | | | "person-4" | デジタルリハーサルに登場する人のID | | | value | plans | mainMode | "CAR" | 移動距離が一番長い移動手段 (CAR, WALKING, CYCLING, PT) | | | | | subMode | "CAR" | 二番目に移動距離が長い移動手段 (CAR, WALKING, CYCLING, PT) | | | | | time | 285 | 移動にかかる時間(秒) | | | | | cost | 3.425899683600594 | 移動にかかるコスト(£) | | | | | distance | 3047.582709127686 | 移動距離(m) | | | | | type | "car" | output.txtにて出力されるtype | | | | | normalized_time | 1807.0 | 平準化された時間。選択肢の平均値の10%以内に平準化 | | | | | normalized_cost | 1.0 | 平準化されたコスト。0~1に平準化 | | | | | probability | 0.925650575652241 | この選択肢が選択される確率 |

plansは、選択肢の配列になります。

選択結果は、以下のフォーマットで出力されます。

| key | | | valueの例 | 説明 | |----|----|----|----|----| | simulator | | | "action-selector" | | | name | | | "choice" | | | time | | | 120 | デジタルリハーサルの経過時間(秒) | | data | oid | | "person-4" | デジタルリハーサルに登場する人のID | | | value | choice | 0 | 選択されたplansのインデックス |

2.5 ユースケース: パーク&ライド

概要

人が目的地に移動する手段として、車、徒歩、escooter、自転車、公共共通機関の選択肢を設け、それぞれの人がコストや時間によって、移動手段を選択し、移動するというデジタルリハーサルを行うユースケースです。

駐車場を設置することにより、公共交通機関への乗り換えが選択肢になり、コストや移動時間に影響を与え、人の移動手段の選択に変化を与えます。

また、ダイナミックディスカウントや初期配備のユースケースと同様、以下の影響の確認も可能です。

  • escooterを借りるときに、escooterのステーションの状況に応じてディスカウントすることで、コストに影響を与え、人の移動手段の選択に変化を与えます。それにより、escooterの利用率や利用料収入への変化がどうなるかを確認することができます。
  • また、初期配備のユースケースと同様、escooterの初期配備を変更することもできます。

デジタルリハーサルの入出力

デジタルリハーサルの入出力は、ユースケースごとに定義されます。 パーク&ライドは、以下のフォーマットで入力ファイルを用意します。 出力は後述する「デジタルリハーサルの結果として出力されるファイル」のフォーマットで出力されます。

デジタルリハーサルに必要な入力ファイル

(共通)

  • stations.csv
  • map.net.xml.gz
  • od.csv.gz
  • parking.csv
  • (osm.pbf)
  • (gtfs.zip)

map.net.xml.gzおよびod.csv.gzは、必ずgzipしてください。

(WEBアプリの場合)

  • precondition.json

(APIの場合)

  • condition.json
  • env.json

precondition.json

{
  "USECASE": "park-and-ride",
  "ASSIMIL_PERSON_FILE": "simdata-your-simdataId-of-od/od.csv.gz",
  "SOARS_STATIONS_FILE": "simdata-your-simdataId-of-stations-csv/stations.csv",
  "SUMO_NET_FILE": "simdata-your-simdataId-of-net-file/map.net.xml.gz",
  "MAP_CENTER_LATITUDE":"35.444395",
  "MAP_CENTER_LONGITUDE":"139.636773",
  "MAP_ZOOM": "14",
  "CURRENCY_SYMBOL": "¥",
  "CURRENCY_RATE":"189.1800",
  "START_HOUR": "10",
  "END_HOUR": "12",
  "DATE": "2024-05-13",
  "TIMEZONE": "Asia/Tokyo",
  "PARKING_FILE": "simdata-your-simdataId-of-parking-csv/parking.csv",
  "PARK_CHARGE_DST": 0,
  "OTP_OSM_FILE": "simdata-your-simdataId-of-otp-osm-pbf/osm.pbf",
  "OTP_GTFS_USE_DEFAULT": true
}

condition.json

{
 "name":"03/15_16:17:44",
 "seed":0,
 "date":{"year":2024,"month":3,"day":14},
 "start":5,
 "end":6,
 "park_charge_dst":0,
 "usecases":{"batteryBased":{"enabled":false,"discount":0,"lowBatteryPercent":15},"numberBased":{"enabled":false,"discount":0,"scooterNumberThreshold":1}},
 "usecase":"park-and-ride",
 "vtypes":{"car":true,"pedestrian":true,"escooter":false,"bicycle":true,"pt":true},
 "dmmmodel":{},
 "currencySymbol":"¥",
 "createdAt":"2024-03-15T07:17:58.470Z",
 "mapcenter":[139.645,35.584],
 "parking":[{"id":"parking1","total":5,"pos":[139.64652349472,35.58208039592385],"type":"car","charge":100},{"id":"parking2","total":5,"pos":[139.64478542327885,35.58114675367203],"type":"bicycle","charge":100},{"id":"parking3","total":5,"pos":[139.64345504760655,35.581207833404605],"type":"car","charge":100},{"id":"parking4","total":5,"pos":[139.64252163887005,35.58129509008397],"type":"car","charge":100}]
}

どのような条件でデジタルリハーサルを実行したかを登録するJSON形式のファイルです。 フォーマットは自由です。 サンプルWebサーバでは、このファイルを用いて、デジタルリハーサル結果表示を行っています。

stations.csv

name,zone,latitude,longitude,initial
bay1,a,35.55934337167842,139.63850582201087,3
bay2,a,35.580495,139.6351646,3
...

escooterのステーションの初期配置を設定するCSV形式のファイルです。

| 項目 | 値の例 | 説明 | |----|----|----| | name | bay0 | ステーションの名前。 | | zone | b | ステーションが所属するゾーン。同じゾーンのステーション間の移動しかできない。 | | latitude | 35.58 | ステーションの緯度。 | | longitude | 139.64| ステーションの経度。 | | initial | 2 | escooterの初期配備台数。 |

parking.csv

name,latitude,longitude,total,type,charge
parking1,35.58139979797416,139.64179207801715,5,car,100
parking2,35.58081517716869,139.64339067458974,5,car,100
...

駐車場の配置を設定するCSV形式のファイルです。

| 項目 | 値の例 | 説明 | |----|----|----| | name | parking1 | 駐車場の名前。 | | latitude | 35.58139979797416 | 駐車場の緯度。 | | longitude | 139.64179207801715 | 駐車場の経度。 | | total | 5 | 駐車可能な台数。 | | type | car | 駐車可能な種類。carかbicycle | | charge | 100 | 駐車料金。 |

map.net.xml.gz

SUMOで使用するネットファイルです。作成方法は 2.1.1 地図データ生成:OSM Converter もしくは2.6 地図データ登録手順を参照ください。

od.csv.gz

人の移動を出発地と到着地として指定するファイルです。

oid,timestamp,origin_lon,origin_lat,dest_lon,dest_lat,age,gender_type,driving_license,car_ownership
person-0,05:00:00,139.582230,35.436874,139.558556,35.424722,52,1,1,2
...
| 項目 | 値の例 | 説明 | |----|----|----| | oid | person-0 | 必須。OD内でユニークなIDである必要があります。 | | timestamp | 05:00:00 | 必須。[ISO_LOCAL_TIME](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/time/format/DateTimeFormatter.html#ISO_LOCAL_TIME)の形式。 | | origin_lon | 139.582230 | 必須。出発地の経度。 | | origin_lat | 35.436874 | 必須。出発地の緯度。 | | dest_lon | 139.558556 | 必須。到着地の経度。 | | dest_lat | 35.424722 | 必須。到着地の緯度。 | | type | bicycle | 省略可能。移動手段を固定する場合に指定します。指定可能なのは、car、pedestrian、bicycle、escooter、pt、bus、rail、subway、tramです。ptは、bus、rail、subway、tramの組み合わせでの移動になります。なお、pt、bus、rail、subway、tramを指定した場合、pedestrianとして移動する場合があります。何も指定しなければ、移動手段を選択します。 | | age | 52 | 省略可能。実年齢。 | | gender_type | 1 | 省略可能。性別。女性の場合は1、その他の場合は0。 | | driving_license | 1 | 省略可能。運転免許を持っているか。持っている場合は1、その他の場合は0。 | | car_ownership | 2 | 省略可能。世帯の車保持状況。保持していない場合は0, 大人一人につき一台以下しか保持していない場合は1、大人一人につき一台より多く保持している場合は2。 | | household_carvan | 1 | 省略可能。自家用車の数を指定します。car_ownershipが指定されていないときのみ有効です。 | | sex_type | 1 | 省略可能。1は男性。2は女性。gender_typeが指定されていないときのみ有効です。 | | age_type | 1 | 省略可能。1: 0~15歳、2: 16~24歳、3: 25~34歳、4: 35~49歳、5: 50~64歳、6: 65歳以上。ageが指定されていないときのみ有効です。 |

項目を省略する場合は、すべての行で省略します。 必須項目のみの場合は以下のような形になります。

oid,timestamp,origin_lon,origin_lat,dest_lon,dest_lat
person-0,05:00:00,139.582230,35.436874,139.558556,35.424722
...

env.json

{
 "USECASE":"park-and-ride",
 "CONDITION_JSON_ID":"simdata-79e4b04f-532e-43b5-8898-22b71e0b3aa4",
 "ASSIMIL_PERSON_FILE":"simdata-272c8229-5a50-48c1-b0db-771c46e3b5d3/od.csv.gz",
 "ASSIMIL_ALIGNER_MAX_STEPS":"3600",
 "ASSIMIL_ALIGNER_START_TIME":"5",
 "SOARS_STATIONS_FILE":"simdata-1c480139-c8d5-4d24-a551-af10f008339a/stations.csv",
 "SUMO_NET_FILE":"simdata-4467079a-fbd0-440e-8505-a8c518e94562/map.net.xml.gz",
 "DMM_MODEL_INFO_FILE":"simdata-feaf5067-43c2-4673-a229-43e0d7d5dc6d/model.json",
 "RANDOM_SEED":"0",
 "CURRENCY_RATE":"186.0",
 "VTYPES":"car,pedestrian,bicycle,pt",
 "USECASE_BATTERY_ENABLED":"false",
 "USECASE_BATTERY_DISCOUNT":"0",
 "USECASE_BATTERY_LOW_PERCENT":"15",
 "USECASE_NUMBER_ENABLED":"false",
 "USECASE_NUMBER_DISCOUNT":"0",
 "USECASE_NUMBER_THRESHOLD":"1"
 "DATE":"2024-03-14",
 "TIMEZONE":"Asia/Tokyo",
 "PARKING_FILE":"simdata-10f56ac9-9296-4c9b-ba34-7db6ddda809d/parking.csv",
 "PARK_CHARGE_DST":0,
}

デジタルリハーサル実行時にデジタルリハーサルへの入力となる情報を記載するJSON形式のファイルです。 デジタルリハーサルの実行指示は、このenv.jsonを指定して行います。

| key | valueの例 | 説明 | |----|----|----| | USECASE | "park-and-ride" | 実行するデジタルリハーサルのユースケースを指定します。 | | CONDITION_JSON_ID | "simdata-d2d0e1b3-7f78-4939-affc-939d712b15d7" | "condition.json"のsimdataIdを指定します。 | | ASSIMIL_PERSON_FILE | "simdata-272c8229-5a50-48c1-b0db-771c46e3b5d3/od.csv.gz" | 登録したODファイルを使用してデジタルリハーサルを実行する場合に指定します。`simdataId/ファイル名`で指定します。指定しない場合はサンプルとして用意されているODファイルが使用されます。 | | ASSIMIL_ALIGNER_MAX_STEPS | "3600" | デジタルリハーサルの時間を指定します(秒)。例は1時間です | | ASSIMIL_ALIGNER_START_TIME | "5" | デジタルリハーサルの開始時間を指定します(時)。ODファイルのtimestampが、この時間以降で、ASSIMIL_ALIGNER_MAX_STEPSの期間のODを対象としてデジタルリハーサルを行います。 | | SOARS_STATIONS_FILE | "simdata-1c480139-c8d5-4d24-a551-af10f008339a/stations.csv" | 登録したステーションのescooterの初期配置ファイルを指定します。`simdataId/ファイル名`で指定します。 | | SUMO_NET_FILE | "simdata-4467079a-fbd0-440e-8505-a8c518e94562/map.net.xml.gz" | 登録したSUMOのネットファイルを使用してデジタルリハーサルを実行する場合に指定します。`simdataId/ファイル名`で指定します。指定しない場合はサンプルとして用意されているネットファイルが使用されます。 | | DMM_MODEL_INFO_FILE | "simdata-feaf5067-43c2-4673-a229-43e0d7d5dc6d/model.json" | 登録した行動選択モデルファイルを使用してデジタルリハーサルを実行する場合に指定します。`simdataId/ファイル名`で指定します。指定しない場合はロンドンのデータで学習された行動選択モデルが使用されます。 | | RANDOM_SEED | "0" | 乱数のシードを設定します。シードが同じであってもデジタルリハーサルの結果が同じとなるわけではありません。 | | CURRENCY_RATE | "1.0" | 通貨レートを設定します。£を基準としていますので、円換算としたい場合には、例えば186.0といった指定になります。 | | VTYPES | "car,pedestrian,bicycle,escooter,pt" | デジタルリハーサルにおいて、移動手段の選択肢とするものを指定します。設定できるのは、car、pedestrian、escooter、bicycle、ptです。 | | USECASE_BATTERY_ENABLED | "false" | バッテリ残量が低いescooterのあるステーションへ返却する際に割引する施策を有効にする際にtrueにします。 | | USECASE_BATTERY_DISCOUNT | "0" | 割引する率を指定します(%)。 | | USECASE_BATTERY_LOW_PERCENT | "15" | バッテリ残量が低いと判断する残量を指定します(%)。 | | USECASE_NUMBER_ENABLED | "false" | 利用可能なescooterの台数が少ないステーションへ返却する際に割引する施策を有効にする際にtrueにします。 | | USECASE_NUMBER_DISCOUNT | "0" | 割引する率を指定します(%)。 | | USECASE_NUMBER_THRESHOLD | "1" | 利用可能な台数が少ないと判断する台数を指定します。 | | DATE | "2024-03-14" | デジタルリハーサルを実行する日付を指定します。[ISO_LOCAL_DATE](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/time/format/DateTimeFormatter.html#ISO_LOCAL_DATE)の形式。 | | TIMEZONE | "Asia/Tokyo" | デジタルリハーサルを実行する場所のタイムゾーンを指定します。[Time Zone Database](https://www.iana.org/time-zones)によって定義されているタイムゾーンを指定します。 | | PARKING_FILE | "simdata-10f56ac9-9296-4c9b-ba34-7db6ddda809d/parking.csv" | 駐車場情報のファイルを指定します。simdataId/ファイル名`で指定します。 | | PARK_CHARGE_DST | "0" | 車での移動の場合に、目的地にて駐車するのにかかる料金を設定します。 | | OTP_OSM_FILE | "simdata-b5824fa3-97e5-45a3-b087-fa7b5bb9c6b0/osm.pbf" | OpenTripPlannerが使用する地図情報を指定します。simdataId/ファイル名`で指定します。指定しない場合はサンプルとして用意されているファイルが使用されます。 | | OTP_GTFS_USE_DEFAULT | "true" | OpenTripPlannerで使用するGTFSファイルとして、あらかじめ用意しているファイルを使用する場合にtrueにします。サンプルファイルの内容は、川崎市バス、JR(南武線、横須賀線、鶴見線)、東急(東横線、目黒線、田園都市線、大井町線)です。| | OTP_GTFS_FILE_0 | "simdata-59d4f411-8fc8-411d-a882-c5e9e233cdcf/0_.gtfs.zip" | OpenTripPlannerが使用するGTFSファイルを指定します。simdataId/ファイル名`で指定します。 | | OTP_GTFS_FILE_1 | "simdata-59d4f411-8fc8-411d-a883-c5e9e233cdcf/1_.gtfs.zip" | OpenTripPlannerが使用するGTFSファイルを指定します。simdataId/ファイル名`で指定します。 | | OTP_GTFS_FILE_2 | "simdata-59d4f411-8fc8-411d-a884-c5e9e233cdcf/2_.gtfs.zip" | OpenTripPlannerが使用するGTFSファイルを指定します。simdataId/ファイル名`で指定します。 | | OTP_GTFS_FILE_3 | "simdata-59d4f411-8fc8-411d-a885-c5e9e233cdcf/3_.gtfs.zip" | OpenTripPlannerが使用するGTFSファイルを指定します。simdataId/ファイル名`で指定します。 | | OTP_GTFS_FILE_4 | "simdata-59d4f411-8fc8-411d-a886-c5e9e233cdcf/4_.gtfs.zip" | OpenTripPlannerが使用するGTFSファイルを指定します。simdataId/ファイル名`で指定します。 | | OTP_GTFS_FILE_5 | "simdata-59d4f411-8fc8-411d-a887-c5e9e233cdcf/5_.gtfs.zip" | OpenTripPlannerが使用するGTFSファイルを指定します。simdataId/ファイル名`で指定します。 |

GTFSファイルは、0から順に指定してください。途中指定されていないと、それ以降は使用されません。 例えば、0と2に指定していると、0のみが使用されます。

osm.pbf

OpenTripPlannerで使用する地図情報です。 作成方法は、こちらを参照ください。

gtfs.zip

OpenTripPlannerで使用するGTFSです。 GTFSについては、こちらを参照ください。

デジタルリハーサルの結果として出力されるファイル

  • states.txt
  • output.txt
  • current-usage.txt
  • total-usage.txt
  • choice.txt

これらのファイルは、デジタルリハーサル結果ファイル取得APIにて取得できます。

states.txt

{"name":"states","time":180,"data":{"oid":"person-12","value":{"wayId":null,"co2":0.0,"lon":139.64,"type":"pedestrian","lat":35.58,"speed":1.39,"ec":0.0}}}
...

JSON Linesフォーマットで出力されます。 1分毎に、人がどのような移動手段を用いてどこにいるかを緯度経度で示しています。 co2は、その時点でのco2排出量です。speedはその地点での速度になります。 wayIdは、その地点のSUMOにおける道路IDです。typeがcar以外では、wayIdはnullです。

| key | | | valueの例 | 説明 | |----|----|----|----|----| | name | | | "states" | | | time | | | 180 | デジタルリハーサルの経過時間(秒) | | data | oid | | "person-12" | デジタルリハーサルに登場する人のID | | | value | co2 | 0.0 | CO2排出量(mg/s) | | | | lon | 139.64 | 現在位置の経度 | | | | type | "pedestrian" | 移動手段(pedestrian, car, escooter, bicycle, bus, rail, tram, subway, waiting)| | | | lat | 35.58 | 現在位置の緯度 | | | | speed | 1.39 | 現在位置での速度(m/s)| | | | ec | 0.3372070179260734 | 電力消費量(Wh/s)| | | | wayId | null | 道路ID |

誰も移動していないときは、dataがnullになります。

{"name":"states","time":60,"data":null}

output.txt

{"name":"output","time":3010,"data":{"oid":"person-33","value":{"move":{"pedestrianTime":410,"fare":220.0,"travelTime":2470,"carFuelCost":21.343500000000002,"carParkCharge":100.0,"carDistance":1501.0,"pedestrianDistance":431.0,"travelRoute":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"mode":"car"},"geometry":{"type":"LineString","coordinates":[[139.62805,35.57091],[139.62806,35.57079],[139.62809,35.57071],[139.62823,35.57051],[139.62851,35.5701],[139.6286,35.56994],[139.62868,35.56989],[139.62871,35.56987],[139.62878,35.56983],[139.62879,35.5699],[139.62881,35.56998],[139.62885,35.57005],[139.6289,35.57016],[139.62898,35.57035],[139.62899,35.57037],[139.62909,35.5706],[139.62926,35.571],[139.62927,35.57106],[139.63038,35.57105],[139.63068,35.5716],[139.63095,35.57207],[139.63101,35.57219],[139.63116,35.57246],[139.63146,35.57299],[139.63149,35.57314],[139.63173,35.57358],[139.63182,35.57373],[139.6319,35.57386],[139.63208,35.57418],[139.63242,35.57477],[139.6325,35.57492],[139.63203,35.57566],[139.63197,35.57575],[139.6318,35.57598],[139.63178,35.576],[139.63175,35.57602],[139.6315,35.57626],[139.63131,35.57643],[139.63127,35.57647],[139.63086,35.57686],[139.63038,35.5773],[139.63022,35.57754],[139.63003,35.57786],[139.62997,35.57794],[139.6298,35.57822],[139.62975,35.57846],[139.6297,35.5788],[139.62967,35.57899],[139.62963,35.57922],[139.62959,35.57952],[139.62956,35.57952],[139.62948,35.57952],[139.62895,35.57951],[139.62893,35.5795],[139.62858,35.57928],[139.62855,35.57928]]}},{"type":"Feature","properties":{"mode":"pedestrian"},"geometry":{"type":"LineString","coordinates":[[139.62855,35.57928],[139.6282,35.57929],[139.62821,35.57936],[139.62813,35.57991],[139.62809,35.58019],[139.62807,35.5803],[139.62801,35.5803]]}},{"type":"Feature","properties":{"mode":"bus"},"geometry":{"type":"LineString","coordinates":[[139.62801,35.5803],[139.62882,35.5834],[139.62882,35.5834],[139.62995,35.58683]]}},{"type":"Feature","properties":{"mode":"pedestrian"},"geometry":{"type":"LineString","coordinates":[[139.62995,35.58683],[139.62991,35.58684],[139.62986,35.58675],[139.63,35.58675],[139.63006,35.58675],[139.63027,35.58675],[139.63041,35.58675],[139.63048,35.58674],[139.63061,35.58672],[139.63064,35.58671],[139.63071,35.58668],[139.63077,35.58666],[139.6315,35.58634],[139.63167,35.58626],[139.63244,35.58586],[139.6324,35.58582],[139.63239,35.58577]]}}]},"busTime":1780,"type":"car-pedestrian-bus-pedestrian","busFare":220.0,"busDistance":744.0,"totalCo2":313200.0,"carTime":280,"park_api":100.0,"fuelCost":21.343500000000002}}}}
{"name":"output","time":3040,"data":{"oid":"person-63","value":{"move":{"reason":"carParkingFull","opportunityLoss":100.0},"move3":{"pedestrianTime":540,"fare":390.0,"travelTime":2010,"railFare":390.0,"pedestrianDistance":1061.0,"totalCo2":0.0,"railTime":1470,"travelRoute":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"mode":"pedestrian"},"geometry":{"type":"LineString","coordinates":[[139.62882,35.60376],[139.62913,35.60362],[139.62917,35.6036],[139.62955,35.60422],[139.6296,35.60429],[139.62825,35.60512],[139.62696,35.60589],[139.62691,35.60592],[139.62233,35.60699]]}},{"type":"Feature","properties":{"mode":"rail"},"geometry":{"type":"LineString","coordinates":[[139.62233,35.60699],[139.62668,35.61178],[139.62668,35.61178],[139.63891,35.61195],[139.63891,35.61195],[139.64793,35.60836],[139.64793,35.60836],[139.65386,35.60697],[139.65386,35.60697],[139.66099,35.60537],[139.66099,35.60537],[139.66866,35.60722]]}},{"type":"Feature","properties":{"mode":"rail"},"geometry":{"type":"LineString","coordinates":[[139.66866,35.60722],[139.66735,35.59681],[139.66735,35.59681],[139.66872,35.58959],[139.66872,35.58959],[139.65963,35.57669]]}},{"type":"Feature","properties":{"mode":"pedestrian"},"geometry":{"type":"LineString","coordinates":[[139.65963,35.57669],[139.6595,35.57664],[139.65947,35.57664],[139.65947,35.57682],[139.65981,35.57681],[139.65983,35.57681],[139.65983,35.57689],[139.66018,35.57718],[139.66019,35.57718],[139.66019,35.57723],[139.66026,35.57723],[139.66026,35.57727],[139.66028,35.57728],[139.6606,35.57727],[139.6606,35.57732],[139.66068,35.57748],[139.66078,35.57772]]}}]},"railDistance":8232.0,"type":"pedestrian-rail-rail-pedestrian"}}}}
...

JSON Linesフォーマットで出力されます。 10秒間隔で、目的地に到着した人の移動の履歴を出力します。 一人に対して、その人が到着した時のみ、その人の情報が一度だけ出力されます。

| key | | | | valueの例 | 説明 | |----|----|----|----|----|----| | name | | | | "output" | | | time | | | | 310 | デジタルリハーサルの経過時間(秒) | | data | oid | | | "person-119" | デジタルリハーサルに登場する人のID | | | value | move | travelTime | 60 | 移動にかかった時間(s) | | | | | totalCo2 | 11818.295182953709 | CO2排出量(mg) | | | | | type | "car" | 移動手段(pedestrian, car, escooter, bicycle, bus, rail, tram, subwayの組み合わせ)| | | | | carTime | 380 | carで移動した時間(s) | | | | | carDistance | 330 | carで移動した距離(m) | | | | | pedestrianTime | 380 | pedestrianで移動した時間(s) | | | | | pedestrianDistance | 330 | pedestrianで移動した距離(m) | | | | | escooterTime | 380 | escooterで移動した時間(s) | | | | | escooterDistance | 330 | escooterで移動した距離(m) | | | | | bicycleTime | 380 | bicycleで移動した時間(s) | | | | | bicycleDistance | 330 | bicycleで移動した距離(m) | | | | | busTime | 390 | バスで移動した時間(s) | | | | | busDistance | 765.0 | バスで移動した距離(m) | | | | | railTime | 880 | 電車で移動した時間(s) | | | | | railDistance | 3012.0 | 電車で移動した距離(m) | | | | | tramTime | 880 | トラムで移動した時間(s) | | | | | tramDistance | 3012.0 | トラムで移動した距離(m) | | | | | subwayTime | 880 | 地下鉄で移動した時間(s) | | | | | subwayDistance | 3012.0 | 地下鉄で移動した距離(m) | | | | | escooterFeeCost | 1.7 | 利用料金 | | | | | escooterFeeDiscount | 0.0 | 割引される額(負の値) | | | | | carFuelCost | 201.1 | 燃料代 | | | | | carParkCharge | 200.0 | 車のみの移動時の目的地の駐車料金 | | | | | bicycleParkCharge | 100.0 | 自転車のみの移動時の目的地の駐車料金 | | | | | busFare | 200.0 | 運賃 | | | | | railFare | 200.0 | 運賃 | | | | | tramFare | 200.0 | 運賃 | | | | | subwayFare | 200.0 | 運賃 | | | | | escooterCost | 1.7 | 利用料金(割引後の金額) | | | | | escooterDiscount | 0.0 | 割引された額(負の値) | | | | | fuelCost | 201.1 | 燃料代 (carのみ) | | | | | park_dst | 200.0 | 車もしくは自転車で移動時の目的地の駐車料金(carのみ) | | | | | park_api | 100.0 | 駐車場料金 | | | | | fare | 200.0 | 運賃 | | | | | travelRoute || 移動手段を含む移動経路 |

料金は、£を起点としており、env.jsonにてCURRENCY_RATEを設定することで、レートで換算した値が返されます。 escooter利用料金は、基本料金が1.5£で、1分毎に0.1£です。

また、escooterが借りれなかった、駐車場が満車だった場合には、moveは以下の出力となります。

| key | | | | valueの例 | 説明 | |----|----|----|----|----|----| | name | | | | "output" | | | time | | | | 480 | デジタルリハーサルの経過時間(秒) | | data | oid | | | "person-118" | デジタルリハーサルに登場する人のID | | | value | move | opportunityLoss | 2.0 | 利用できていた場合の料金を出力 | | | | | reason | "carParkingFull" | 予約できなかった理由(escooterEmpty, carParkingFull, bicycleParkingFull) |

予約を失敗したときには、移動手段を絞った上で、再度移動を試みるため、move2~move5として、上記と同様の出力が追加で行われます。

選択肢の移動手段を用いて、移動することができない場合には、以下が出力されます。

{"name":"output","time":150,"data":{"oid":"person-18","value":{"move":{"message":"Could not create plan."}}}}

公共交通機関の出発に間に合わなかったときには、以下が出力されます。

{"name":"output","time":1020,"data":{"oid":"person-36","value":{"move":{"message":"The departure time has passed."}}}}

current-usage.txt

{"name":"current-usage","time":60,"data":{"oid":"station-91","value":{"available":2,"reserved":0,"low":0,"minBattery":100.0, "type":"station"}}}
{"name":"current-usage","time":1320,"data":{"oid":"parking5","value":{"reserved":1,"available":1,"type":"car-parking","details":{"reserved":["person-87"],"parked":[{"oid":"person-6","start":400},{"oid":"person-41","start":840},{"oid":"person-76","start":1280}]}}}}
...

JSON Linesフォーマットで出力されます。 1分間隔で、すべてのステーションのescooterの状況が出力されています。

| key | | | valueの例 | 説明 | |----|----|----|----|----| | name | | | "current-usage" | | | time | | | 60 | デジタルリハーサルの経過時間(秒) | | data | oid | | "station-91" | ステーションのID | | | value | available | 2 | ステーションにおいて利用可能なescooterの台数 | | | | reserved | 0 | ステーションにおいて予約されているescooterの台数 | | | | low | 0 | ステーションにおいてバッテリの残量が低いescooterの台数 | | | | minBattery | 100.0 | ステーションに配置されているescooterのバッテリ残量の最小値(%) |

lowと判断されるescooterは、env.jsonにおける、USECASE_BATTERY_LOW_PERCENTによって指定された残量以下になったものです。

駐車場の状況も出力されます。

| key | | | valueの例 | 説明 | |----|----|----|----|----| | name | | | "current-usage" | | | time | | | 1320 | デジタルリハーサルの経過時間(秒) | | data | oid | | "parking5" | 駐車場のID | | | value | available | 1 | 駐車場の空き数 | | | | reserved | 1 | 駐車場の予約されている数 | | | | type | "car-parking" | car-parkingかbicycle-parking | | | | details | | 予約や駐車状況の詳細 |

total-usage.txt

{"name":"total-usage","time":0,"data":{"oid":"station-34","value":{"rentCount":4,"returnCount":5,"type":"station"}}}
{"name":"total-usage","time":0,"data":{"oid":"parking5","value":{"type":"car-parking","rentCount":8,"returnCount":4}}}
...

JSON Linesフォーマットで出力されます。 デジタルリハーサル終了時に、すべてのステーションのescooterの貸し出し結果が出力されます。

| key | | | valueの例 | 説明 | |----|----|----|----|----| | time | | | 0 | 0固定です | | data | oid | | "station-34" | ステーションのID | | | value | rentCount | 4 | ステーションにおいて貸し出したescooterの台数 | | | | returnCount | 5 | ステーションに返却されたescooterの台数 | | | | type | "station" | station固定 |

駐車場の結果も出力されます。

| key | | | valueの例 | 説明 | |----|----|----|----|----| | name | | | "total-usage" | | | time | | | 0 | 0固定です | | data | oid | | "parking5" | 駐車場のID | | | value | rentCount | 8 | 駐車場に入庫した台数 | | | | returnCount | 4 | 駐車場から出庫した台数 | | | | type | "car-parking" | car-parkingかbicycle-parking |

choice.txt

{"name": "choice", "time": 110, "data": {"oid": "person-4", "value": {"plans": [{"mainMode": "CAR", "subMode": "CAR", "time": 285, "cost": 3.425899683600594, "distance": 3047.582709127686, "type": "car", "normalized_time": 1807.0, "normalized_cost": 1.0, "probability": 0.925650575652241}, {"mainMode": "CYCLING", "subMode": "WALKING", "time": 1816, "cost": 3.0, "distance": 3548.5852119360934, "type": "escooter", "normalized_time": 1888.0, "normalized_cost": 0.875682383334419, "probability": 0.005469548460307576}, {"mainMode": "CYCLING", "subMode": "WALKING", "time": 1881, "cost": 3.0, "distance": 3671.499009820486, "type": "escooter", "normalized_time": 1891.0, "normalized_cost": 0.875682383334419, "probability": 0.005398592563289859}, {"mainMode": "WALKING", "subMode": "WALKING", "time": 3565, "cost": 0.0, "distance": 3047.582709127686, "type": "pedestrian", "normalized_time": 1981.0, "normalized_cost": 0.0, "probability": 0.06347298844144315}], "people_features": [40, 1, 0, 1], "environment_features": [3047.582709127686]}}}
{"simulator":"action-selector","name":"choice","time":120,"data":{"oid":"person-4","value":{"choice":0}}}
...

JSON Linesフォーマットで出力されます。 移動手段を選択する際に出力されます。 選択肢と選択結果が出力されます。

選択肢は以下のフォーマットで出力されます。

| key | | | | valueの例 | 説明 | |----|----|----|----|----|----| | name | | | | "choice" | | | time | | | | 110 | デジタルリハーサルの経過時間(秒) | | data | oid | | | "person-4" | デジタルリハーサルに登場する人のID | | | value | plans | mainMode | "CAR" | 移動距離が一番長い移動手段 (CAR, WALKING, CYCLING, PT) | | | | | subMode | "CAR" | 二番目に移動距離が長い移動手段 (CAR, WALKING, CYCLING, PT) | | | | | time | 285 | 移動にかかる時間(秒) | | | | | cost | 3.425899683600594 | 移動にかかるコスト(£) | | | | | distance | 3047.582709127686 | 移動距離(m) | | | | | type | "car" | output.txtにて出力されるtype | | | | | normalized_time | 1807.0 | 平準化された時間。選択肢の平均値の10%以内に平準化 | | | | | normalized_cost | 1.0 | 平準化されたコスト。0~1に平準化 | | | | | probability | 0.925650575652241 | この選択肢が選択される確率 |

plansは、選択肢の配列になります。

選択結果は、以下のフォーマットで出力されます。

| key | | | valueの例 | 説明 | |----|----|----|----|----| | simulator | | | "action-selector" | | | name | | | "choice" | | | time | | | 120 | デジタルリハーサルの経過時間(秒) | | data | oid | | "person-4" | デジタルリハーサルに登場する人のID | | | value | choice | 0 | 選択されたplansのインデックス |

2.6 地図データ登録手順

SUMOサイト

作成方法は、こちらを参照ください。

サンプルデータの作成手順

サンプルとして用意している川崎市のネットファイルの作成手順を参考までに示します。

Open Street Mapのサイトから、OSMファイルを取得します。

エクスポートをクリックし、範囲を指定してエクスポートします。 以下の範囲を指定しています。

  • 緯度: 35.5667000 - 35.5955000
  • 経度: 139.6178000 - 139.6760000

エクスポートはエラーになるので、Overpass APIによりダウンロードしています。

SUMOのnetconvertコマンドによりOSMファイルを変換します。

netconvert --osm-files osmfile -o map.net.xml --speed-in-kmh --junctions.join --sidewalks.guess.from-permissions --crossings.guess --lefthand

SUMOのサイトのオプションとは異なりますが、SUMOにロードする際にエラーとなるため、これらのオプションとしています。

SUMOに作成したmap.net.xmlをロードしてエラーが出ないことを確認します。

最後に、gzipにより、map.net.xml.gzとします。

SUMOのインストールや利用方法は、SUMOのサイトを参照ください。