概要
trainRoute の値で台形の速度プロファイルを作って走らせると、estimateArrivalTimes より所要時間が短くなります。
原因は、2 つのクエリが別々の運動学モデルで値を出していることです。trainRoute の最高速度と加減速は、追加した時点(#1568)の MobileApp の定数を写したものです。その後の推定の改良(#1572、#1577、#1580、#1590、#1596)は、arrival_estimation.rs にだけ入りました。
- 路線種別ごとの速度
- 運転余裕率
- 通過駅のペナルティ
- 停車時間
- 迂回係数
また、#1591 と #1597 の較正値は、scripts/compute_speed_table.py が推定のモデル(加速 0.7m/s²、減速 0.9m/s²、運転余裕率 1.15 など)を再現して当てはめた値です。trainRoute はその最高速度だけを、#1568 の加減速(0.83m/s² / 0.69m/s²)と組み合わせて返しています。このため、較正した所要時間が trainRoute では再現されません。
再現方法
次の 2 経路で比べました。trainRoute の値は、MobileApp の useSimulationMode と同じ方法で走らせました。
- 走らせ方: 停車駅から次の停車駅までを 1 本の走行とし、到着側の駅の値で台形を作ります。
- 距離:
trackDistanceFromPrevious の合計です。
- 途中駅の停車: 推定と同じ 0.6 分にそろえました。
| 経路 |
trainRoute の値で走らせた所要時間 |
estimateArrivalTimes の終点 |
東急東横線 特急 渋谷→横浜(lineGroupId 161) |
23.1 分 |
26.5 分 |
京王線 特急 新宿→京王八王子(lineGroupId 71) |
32.3 分 |
41.0 分 |
一般則(較正テーブルに無い路線・種別の速度)も、2 か所で値が違います。
| 条件 |
arrival_estimation.rs |
dto/simulation.rs |
| 在来線・種別なし |
80km/h |
90km/h |
| 在来線・特急 |
96km/h |
130km/h |
| 新幹線 |
250km/h |
320km/h |
想定していた動作
走行の所要時間を時刻表に近づけたい用途(MobileApp の GPX 生成など)で、trainRoute から推定と同じモデルの値を取れること。
実際の動作
trainRoute は、#1568 の時点のモデルの値しか返しません。
対応方針
trainRoute に、どちらのモデルで値を出すかを選ぶ引数を足します。
enum TrainRouteModel {
Legacy
Estimated
}
trainRoute(fromStationId: Int!, toStationId: Int!, lineGroupId: Int, legs: [RouteLegInput!], model: TrainRouteModel): TrainRouteResponse!
Legacy(省略時): いまの処理のまま変えません。MobileApp のオートモードはこちらを使い続けます。新しいフィールドは null です。
Estimated: 推定(arrival_estimation)のモデルで値を出します。
TrainRouteSegment に arrivalCumulativeMinutes / departureCumulativeMinutes を足し、返す駅列に対する到着・出発の累積分を入れます。legs を渡したときは、estimateArrivalTimes に同じ legs を渡した値と一致させます。
maxSpeed / maxAcceleration / maxDeceleration も、推定のモデルの値にします。
- バスは
Legacy と同じ値を返し、累積分は null にします。
環境情報
- 対象: 本番(
gql.trainlcd.app)、2026-10-01 に取得
- コードの参照:
dev(c0e7fd0)
概要
trainRouteの値で台形の速度プロファイルを作って走らせると、estimateArrivalTimesより所要時間が短くなります。原因は、2 つのクエリが別々の運動学モデルで値を出していることです。
trainRouteの最高速度と加減速は、追加した時点(#1568)の MobileApp の定数を写したものです。その後の推定の改良(#1572、#1577、#1580、#1590、#1596)は、arrival_estimation.rsにだけ入りました。また、#1591 と #1597 の較正値は、
scripts/compute_speed_table.pyが推定のモデル(加速 0.7m/s²、減速 0.9m/s²、運転余裕率 1.15 など)を再現して当てはめた値です。trainRouteはその最高速度だけを、#1568 の加減速(0.83m/s² / 0.69m/s²)と組み合わせて返しています。このため、較正した所要時間がtrainRouteでは再現されません。再現方法
次の 2 経路で比べました。
trainRouteの値は、MobileApp のuseSimulationModeと同じ方法で走らせました。trackDistanceFromPreviousの合計です。trainRouteの値で走らせた所要時間estimateArrivalTimesの終点lineGroupId161)lineGroupId71)一般則(較正テーブルに無い路線・種別の速度)も、2 か所で値が違います。
arrival_estimation.rsdto/simulation.rs想定していた動作
走行の所要時間を時刻表に近づけたい用途(MobileApp の GPX 生成など)で、
trainRouteから推定と同じモデルの値を取れること。実際の動作
trainRouteは、#1568 の時点のモデルの値しか返しません。対応方針
trainRouteに、どちらのモデルで値を出すかを選ぶ引数を足します。Legacy(省略時): いまの処理のまま変えません。MobileApp のオートモードはこちらを使い続けます。新しいフィールドはnullです。Estimated: 推定(arrival_estimation)のモデルで値を出します。TrainRouteSegmentにarrivalCumulativeMinutes/departureCumulativeMinutesを足し、返す駅列に対する到着・出発の累積分を入れます。legsを渡したときは、estimateArrivalTimesに同じlegsを渡した値と一致させます。maxSpeed/maxAcceleration/maxDecelerationも、推定のモデルの値にします。Legacyと同じ値を返し、累積分はnullにします。環境情報
gql.trainlcd.app)、2026-10-01 に取得dev(c0e7fd0)