Files
mesh-configs/skills/devops/gtfs-timetable-routing/references/gtfs-recalc-lessons.md
T

2.2 KiB
Raw Blame History

GTFS-Neuberechnung — harte Lehren aus urlaub.perfekt-ohne-en.de (2026-08-19)

Ergänzung zum main SKILL.md. Diese Notes stammen aus dem echten Großumbau der Fahrzeiten auf der Zugverbindungs-Webseite und sind die Dinge, die NICHT sofort ersichtlich sind. (Haupt-SKILL.md-Patch war durch eine Schreib-Sperre blockiert; diese Erkenntnisse gehören trotzdem zu diesem Umbrella.)

Die 3 Teambefunde, die den Dijkstra erst korrekt machten

  1. Geo-Stop-Merging — Ein Bahnhof hat MEHRERE aktive stop_ids in der st-Tabelle (Saarbrücken Hbf: 6 IDs = Plattform-/Gleis-Stops). stops.txt stop_id ist nicht eindeutig. Fix: Stops < ~350m Luftlinie zu einer Gruppe zusammenfassen; der Router expandiert von/zu allen Gruppen-IDs.
  2. Umstiegsbuffer — Ohne min ~4min Transfer-Puffer erlaubt Dijkstra physisch unmögliche Anschlüsse (Ankunft 10:05 → Abfahrt 10:04) → zu optimistische Zeiten. Buffer NUR beim Umstieg, nicht beim Start: dep_s < t + (BUFFER if t>dep0 else 0).
  3. Profil-Query (Min) — Feste Abfahrtszeit (09:00) liefert systematisch zu langsame Werte, wenn die früheste Verbindung zufällig viele Umstiege hat. Abfahrten über den Tag scannen (z.B. stündlich 06-22) und MIN(Fahrzeit) nehmen.

Performance: EIN Dijkstra je Start statt je Verbindung

  • Naiv: 12.201 Verbindungen × ~17 Abfahrtsstichproben = ~207k Dijkstra-Läufe → ~18h.
  • Korrekt: EIN Dijkstra je eindeutigen Start (191 Starts), der ALLE Ziele gleichzeitig erreicht (spread(start_ids) → dict stop→ankunft). Danach Werte ablesen → ~10 Min.
  • Commit NUR am Ende, und nur markierte Ziele (0.0h / mehrdeutig) neu verteilen.

Start ohne Bahnhof (z.B. Radevormwald)

Städte ohne eigene Bahnhofs-ID matchen in stops nicht. Löse über den nächstgelegenen Bahnhof (Radevormwald → Remscheid-Lennep Bf) und addiere die Bus-Anreise (~20min): Gesamtzeit = BUS_MIN + Dijkstra(Bahnhof → Ziel).

Ziel-Eindeutigkeit: Berlin-Falle

Mehrdeutige Zielnamen (z.B. "Berlin") matchen falsche/lokalnahe Stops → ungenaue oder sogar 0.0h-Zeiten. Abbilden auf eindeutiges "… Hbf": UPDATE verkehr SET nach='Berlin Hbf' WHERE nach='Berlin'; 0.0h-Zeilen sind als Fehler zu behandeln und neu zu berechnen, nicht zu akzeptieren.