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

39 lines
2.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.