Skip to content

到着時間推定の駅間距離に線路の長さを使い、速度の較正をその距離で求め直した - #1712

Merged
TinyKitten merged 1 commit into
devfrom
feature/estimation-rules-review
Sep 30, 2026
Merged

TinyKitten merged 1 commit into
devfrom
feature/estimation-rules-review

Conversation

@TinyKitten

@TinyKitten TinyKitten commented Sep 30, 2026 •

Copy link
Copy Markdown
Member

概要

到着時間推定と乗換経路探索で、駅間の距離に線路の長さ(connections)を使うようにしました。速度の較正は、この距離で求め直しました。

これまでの推定は、駅間の距離を「直線距離 × 迂回係数」で見積もっていました。線路の長さは #1704 で返せるようになっていましたが、推定には使っていませんでした。所要時間のベンチマーク(#1711)で全体を測ると、典型的な所要時間からのずれの平均は 5.71% から 4.71% に下がりました。

オートモード(trainRoute の Legacy)が使う値は変えていません。求め直す前の較正を、別の表に凍結しました。

変更の種類

  • バグ修正
  • 新機能
  • データの修正・追加
  • リファクタリング
  • ドキュメント
  • CI/CD
  • その他

変更内容

  • 推定の距離(arrival_estimation.rs・query.rs)
    • estimate_arrival_minutes_with_track を足しました。線路の長さがある駅間はそれを走行距離に使い、無い駅間(または 0 以下の値)だけ、従来どおり直線距離 × 迂回係数で見積もります。
    • estimateArrivalTimes・trainRoute の Estimated・乗換経路の見込みで、系統の隣り合う駅の組の線路の長さを引いて渡します。環状線では、継ぎ目の組(末尾→先頭)も含めます。
  • 乗換経路探索(route_search.rs・src/repository.rs)
    • RouteNetwork::build_with_track を足し、Worker の経路網は線路の長さで組み立てます。connectedRoutes の乗車時間と、同じ経路の到着の見込みが同じ距離になります。
  • オートモードの値の凍結(legacy_speed_table.rs・simulation.rs・query.rs)
    • 求め直す前の路線別・駅間別の較正を legacy_speed_table.rs に写し、Legacy はこちらを引きます。MobileApp のオートモードが走らせる値は変わりません。
  • 速度の較正の求め直し(speed_table.rs・segment_speed_table.rs・compute_speed_table.py)
    • compute_speed_table.py の駅間の距離も線路の長さにしました。generated/connections.csv を読むので、先に make data が必要です。GTFS からの自動較正の2つの表は、この距離で生成し直しました。
    • 手動の較正は、ベンチマークの典型値に合わせて求め直しました。値は実際の最高速度を超えない範囲で決めています。詳しくは下の表のとおりです。
    • 函館市電の GTFS の取得先の URL を、日付が 20260815 のものに変えました。以前の URL は 404 を返していました。
  • テスト
    • 線路の長さを使うこと、無い駅間では従来の見積もりに戻ること、経路探索の所要時間に反映されること、継ぎ目の組を含むことを確かめるテストを足しました。
    • 実際の所要時間を固定値で確かめていた2つのテストは、ベンチマークに任せました。
      • 銀座線 渋谷→新橋(12〜14 分)のテストは消しました。東京メトロの GTFS では 15 分で、テストの前提が実際と違っていました。
      • 半蔵門線直通急行のテストは、所要時間の範囲の確認(16.2〜19.8 分)だけを外しました。テストのデータには線路の長さが無いので、本番の推定を再現できません。代わりに、ベンチマークに押上→神保町(GTFS で 17〜19 分、典型 17 分)を足しました。
      • 京急の手動の較正を例にしていたテストは、東急東横線の較正で同じ仕組みを確かめる形に変えました。
  • ベンチマーク(travel_times/)
    • 東京メトロ半蔵門線、りんかい線、多摩都市モノレールの3区間を足しました。値は各事業者の GTFS から求めた平日日中の所要時間です。
    • 推定を意図して変えたので、記録(baseline.csv)を更新しました。
  • ドキュメント
    • AGENTS.md・docs/architecture.md・scripts/README.md に、推定が線路の長さを使うこと、Legacy が凍結した表を使うこと、較正スクリプトに make data が要ることを書きました。
    • README.md の「Data Sources」に、りんかい線と多摩都市モノレールの GTFS の出典を足しました。

手動の較正

距離が直線 × 迂回係数だった頃の手動の値は、距離の水増しを速度で打ち消していました。そのまま線路の長さに替えると、スカイライナーは 42.1 分から 34.0 分に、小田急の快速急行は 32.8 分から 26.7 分に縮みます。一方、手動の値を外して一般則にすると、スカイライナーは 48.1 分(典型 41 分)まで遅くなります。そのため、外すのではなく求め直しました。

路線・種別 変更前 変更後 理由
総武快速線(Default) なし(一般則 80km/h) 100km/h StationAPI の総武快速線には快速の停車駅しか無く、通過駅が無いので、推定は各停として扱います。一般則の 80km/h では、錦糸町→津田沼が典型値より 12% 長くなっていました
成田スカイアクセス線(LimitedExpress) 160km/h 120km/h スカイライナーを典型値 41 分に合わせました。アクセス特急も同じ種別で、京成高砂→成田空港は 39.4 分です(実際は 38〜52 分)
京急本線(Express・LimitedExpress) 120km/h 120km/h 実際の最高速度のままで、快特 品川→横浜が 17.6 分(典型 17 分)になります
小田急線(Express) 110km/h なし(一般則) 一般則で 29.9 分(典型 30.5 分)になります
京成本線(LimitedExpress) 100km/h なし(一般則) スカイライナーの基準は、成田スカイアクセス線の値で合います
つくばエクスプレス・都営大江戸線(Default) 手動 GTFS の自動較正 同じ距離で求め直した GTFS の値に任せます

ベンチマークのレポート(変更前後)

変更前はステージング、変更後はこのブランチを make data && make dev で起動した Worker に向けて、make travel-time-report で測りました。

基準 典型 (範囲) 変更前 (ステージング) 変更後
総武快速線 快速 錦糸町→津田沼 20分 (19〜25分) 22.5分 (+12.3%) 20.0分 (-0.1%)
総武快速線 快速 新小岩→津田沼 16分 (15〜20分) 17.3分 (+8.2%) 15.4分 (-4.0%)
京成 スカイライナー 日暮里→空港第2ビル 41分 (40〜48分) 42.1分 (+2.7%) 41.1分 (+0.2%)
京急本線 快特 品川→横浜 17分 (17〜22分) 17.7分 (+4.0%) 17.6分 (+3.6%)
小田急小田原線 快速急行 新宿→町田 30.5分 (30〜31分) 32.8分 (+7.7%) 29.9分 (-2.0%)
東急東横線 特急 渋谷→横浜 27.5分 (27〜28分) 26.5分 (-3.7%) 26.9分 (-2.1%)
京王井の頭線 急行 渋谷→吉祥寺 17分 (17〜22分) 16.8分 (-1.1%) 16.8分 (-1.0%)
京王線 特急 新宿→京王八王子 45分 (45〜45分) 41.0分 (-8.9%) 41.4分 (-8.0%)
阪急神戸本線 特急 大阪梅田→神戸三宮 27.5分 (27〜28分) 26.6分 (-3.2%) 26.9分 (-2.3%)
西武池袋線 準急 池袋→所沢 38分 (30〜38分) 29.5分 (-22.4%) 29.3分 (-23.0%)
西武池袋線 急行 池袋→所沢 24分 (21〜25分) 22.5分 (-6.3%) 22.3分 (-7.2%)
都営大江戸線 落合南長崎→光が丘 11分 (11〜12分) 11.6分 (+5.1%) 11.9分 (+7.8%)
都営大江戸線 新宿→光が丘 24分 (24〜26分) 24.9分 (+3.6%) 25.0分 (+4.1%)
都営大江戸線 光が丘→都庁前 21分 (21〜21分) 22.6分 (+7.7%) 22.7分 (+8.2%)
都営大江戸線 清澄白河→赤羽橋 16分 (16〜17分) 16.0分 (+0.2%) 16.3分 (+1.6%)
都営大江戸線 光が丘→都庁前 (環状部経由) 84分 (84〜86分) 84.4分 (+0.5%) 84.8分 (+1.0%)
東京メトロ銀座線 渋谷→新橋 15分 (15〜15分) 13.2分 (-11.7%) 13.3分 (-11.4%)
つくばエクスプレス 普通 秋葉原→つくば 66分 (63〜66分) 61.9分 (-6.3%) 61.6分 (-6.6%)
東京メトロ半蔵門線 押上→神保町 17分 (17〜19分) 16.8分 (-1.3%) 16.6分 (-2.2%)
りんかい線 新木場→大崎 19分 (19〜20分) 19.2分 (+1.2%) 19.1分 (+0.6%)
多摩都市モノレール 多摩センター→上北台 37分 (37〜39分) 37.7分 (+1.9%) 37.6分 (+1.7%)

21 件: 典型からのずれ(絶対値)の平均 5.71% → 4.71%、範囲からの外れの平均 2.07% → 1.75%

残っている大きなずれ(この PR では直していません)

  • 西武池袋線 準急 池袋→所沢(−23%): 典型値 38 分が範囲の上端と同じで、途中で待ち合わせる列車が多いと考えられます。推定のモデルは待ち合わせを扱いません。
  • 東京メトロ銀座線 渋谷→新橋(−11%)、京王線 特急(−8%)、都営大江戸線 光が丘→都庁前(+8%)、つくばエクスプレス(−7%)。
  • 近鉄特急(名阪甲特急): 手動の較正は、距離を線路の長さへ替える前に決めた値のままです。種別グループ 335 の停車駅が実際の列車と一致しないので、ベンチマークで測れていません。

テスト

  • make fmt が通ること
  • make clippy が通ること(wasm32 ターゲットを含む)
  • make test が通ること

cargo fmt --all -- --check、make clippy、make check、make test を実行し、すべて成功しました(stationapi 443 件、stationapi-worker 28 件ほか、失敗なし)。make test は、generated/ がある状態と data/*.csv だけの状態の両方で通しています。

オートモードの値が変わっていないことも確かめました。trainRoute(Legacy)の区間の値(停車・通過、直線距離、最高速度、加減速)を本番とこのブランチで比べ、手動の較正を変えた系統(総武快速 40、スカイライナー 197、京急快特 74、小田急快速急行 129、つくばエクスプレス 977)で一致しました。

関連Issue

Refs #1704, #1711

スクリーンショット(任意)

🤖 Generated with Claude Code

Summary by CodeRabbit

  • 機能改善
    • 到着時刻の推定に実際の線路距離を反映するようになりました。距離データがない駅間では、従来の方法で推定します。
    • Legacyモデルの速度設定が固定され、到着時刻推定の較正更新による影響を受けなくなりました。
    • りんかい線と多摩都市モノレールのデータソースを追加しました。
  • データ更新
    • 各路線・駅間の速度較正値を更新しました。

@TinyKitten TinyKitten self-assigned this Sep 30, 2026
@github-actions github-actions Bot added feature 要望対応や課題解決 deploy-dev rust and removed feature 要望対応や課題解決 labels Sep 30, 2026
@coderabbitai

coderabbitai Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Essentials

Run ID: 767de651-75df-4f57-956f-da61da320040

📥 Commits

Reviewing files that changed from the base of the PR and between 3845c00 and cb21e83.

⛔ Files ignored due to path filters (2)
  • travel_times/baseline.csv is excluded by !**/*.csv
  • travel_times/cases.csv is excluded by !**/*.csv
📒 Files selected for processing (14)
  • AGENTS.md
  • README.md
  • docs/architecture.md
  • scripts/README.md
  • scripts/compute_speed_table.py
  • src/repository.rs
  • stationapi/src/domain.rs
  • stationapi/src/domain/arrival_estimation.rs
  • stationapi/src/domain/legacy_speed_table.rs
  • stationapi/src/domain/route_search.rs
  • stationapi/src/domain/segment_speed_table.rs
  • stationapi/src/domain/speed_table.rs
  • stationapi/src/use_case/dto/simulation.rs
  • stationapi/src/use_case/interactor/query.rs

Included review availability: This review used your included allowance. 0 included reviews remain after this review. Your included PR review attempts over the past 7 days set your current allowance at 3 reviews per hour.


📝 Walkthrough

Walkthrough

到着時間推定と較正処理に駅間の線路距離を追加しました。Legacy モデルには、現行の再較正から独立した固定速度テーブルを追加しました。

Changes

線路距離を用いた到着時間推定と Legacy 較正

Layer / File(s) Summary
線路距離を使った較正処理と速度テーブル
scripts/compute_speed_table.py, scripts/README.md, README.md, stationapi/src/domain/speed_table.rs, stationapi/src/domain/segment_speed_table.rs
較正スクリプトは generated/connections.csv の正の線路距離を優先し、距離がない場合は直線距離と迂回係数を使います。現行の路線速度・駅間速度テーブルとGTFSフィードの記述を更新しました。
推定器と経路探索への線路距離対応
stationapi/src/domain/arrival_estimation.rs, stationapi/src/domain/route_search.rs, AGENTS.md, docs/architecture.md
到着時間推定は、正の線路距離があればその値を使い、未登録または非正値の場合は従来の推定に戻ります。経路探索も駅間距離を推定器に渡します。
クエリ処理と経路ネットワークへの距離連携
src/repository.rs, stationapi/src/use_case/interactor/query.rs
クエリ処理は隣接駅間と環状線の継ぎ目の距離を取得し、到着時間推定と経路ネットワークに渡します。関連するテストも更新しました。
Legacy 用固定速度較正表
stationapi/src/domain/legacy_speed_table.rs, stationapi/src/domain.rs, stationapi/src/use_case/dto/simulation.rs, stationapi/src/use_case/interactor/query.rs, docs/architecture.md, AGENTS.md
Legacy 用に固定した路線・駅間速度較正表を追加しました。シミュレーションと区間速度上書き処理は、この表を参照します。

Priority: ➖ Normal

Estimated code review effort: 4 (Complex) | ~60 minutes

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant Query as query::track_distances_of
  participant TrackIndex as index::track_distance
  participant Estimator as estimate_arrival_minutes_with_track
  Query->>TrackIndex: 駅間の線路距離を取得
  TrackIndex-->>Query: 駅間距離を返す
  Query->>Estimator: TrackDistancesを渡す
  Estimator-->>Query: 推定停車時刻を返す
Loading

Merge Risk: ⚪ Minimal · up to cb21e

No actionable blocker is established for the track-distance and frozen Legacy calibration changes. The extra endpoint lookup does not change estimates; merging remains subject to normal checks.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 71.43% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 49 functions across 10 files. (4 skipped:… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed タイトルは、到着時間推定に線路長を使うことと、速度較正を更新することを明確に示しています。変更の主目的と一致し、簡潔です。
Description check ✅ Passed 説明には概要、変更種別、詳細、テスト結果、関連Issueが記載されています。必須テスト項目も確認済みで、変更内容と検証結果を十分に説明しています。
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

Docstring coverage is 71.43% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 49 functions across 10 files. (4 skipped: 4 unsupported.)

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


うさぎは線路の距離をたどる
駅から駅へ、ぴょんと値を渡す
固定の表は静かに眠り
新しい推定が時刻をつなぐ
にんじん片手に、改札を跳ねる

Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant