# 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.