Treffpunkt per Bahn berechnen: Der Algorithmus hinter bahnmitte.de
Wenn ihr auf bahnmitte.de drei Startbahnhöfe eingebt und auf „Berechnen" klickt, passiert im Hintergrund eine ganze Menge. Fahrpläne werden abgefragt, Reisezeiten verglichen, Algorithmen laufen – und das alles, ohne dass eure Daten bei Google, der Deutschen Bahn oder sonst irgendwem landen.
In diesem Artikel zeige ich, wie bahnmitte.de unter der Haube funktioniert: welche Technologien im Einsatz sind, warum ich alles auf eigenen Servern betreibe und wie der Algorithmus den optimalen Treffpunkt findet.
Das Problem, das bahnmitte löst
Die Idee klingt simpel: Mehrere Menschen in verschiedenen Städten wollen sich treffen. Wo ist die beste Mitte?
Der erste Instinkt ist, auf eine Karte zu schauen. Hamburg liegt oben, München unten, also treffen wir uns in der Mitte – Kassel vielleicht, oder Göttingen? Das Problem: Die geografische Mitte hat wenig mit der verkehrstechnischen Realität zu tun. Bahnstrecken verlaufen nicht in geraden Linien. ICE-Verbindungen folgen bestimmten Korridoren. Umsteigezeiten können eine Reise um eine Stunde verlängern. Und am Wochenende fahren manche Züge gar nicht.
bahnmitte.de löst dieses Problem, indem es nicht die Karte befragt, sondern den echten Fahrplan. Konkrete Anwendungsfälle und Tipps findet ihr in unserem Artikel So findet ihr den perfekten Treffpunkt per Bahn.
Die Architektur: Drei Schichten, null Drittanbieter
Das System besteht aus drei Schichten, die alle auf eigenen Servern laufen:
Schicht 1: Das Frontend – die Website, die ihr im Browser seht. Hier gebt ihr eure Startbahnhöfe ein, wählt Datum und Verkehrsmittel und seht am Ende die Ergebnisse.
Schicht 2: Der Berechnungsserver – das Herzstück. Er nimmt eure Eingaben entgegen, fragt die Fahrplandaten ab, berechnet die Reisezeiten zu allen möglichen Treffpunkten und sortiert die Ergebnisse.
Schicht 3: Die Fahrplandaten – hier wird es interessant.
Fahrplandaten ohne Deutsche Bahn
Für die Fahrplanabfragen nutze ich db-rest, eine Open-Source-Software von Jannis Redmann. db-rest stellt eine REST-API bereit, über die sich Verbindungen, Abfahrtszeiten und Haltestelleninformationen abfragen lassen – dieselben Daten, die auch in der DB-Navigator-App stecken.
Der entscheidende Punkt: Ich betreibe eigene Instanzen dieser Software auf meinen Servern. Wenn bahnmitte eine Verbindung abfragt, geht diese Anfrage nicht an die Deutsche Bahn, sondern an meinen eigenen Server-Cluster. Das hat zwei Vorteile: Erstens ist es schneller, weil ich die Last verteilen kann. Zweitens landen eure Anfragen nicht in den Logfiles der Deutschen Bahn.
Warum ein Cluster? Eine einzelne Instanz wäre ein Flaschenhals. Wenn 20 Nutzer gleichzeitig eine Berechnung starten und jede Berechnung dutzende Fahrplanabfragen auslöst, braucht es Kapazität. Mehrere db-rest-Instanzen hinter einem Load Balancer lösen dieses Problem.
Die Karte: OpenStreetMap ohne Tracking
Für die Kartendarstellung nutze ich OpenStreetMap – aber nicht direkt. Normalerweise laden Websites die Kartenkacheln (Tiles) direkt von den OpenStreetMap-Servern. Dabei wird eure IP-Adresse an OpenStreetMap übermittelt, was datenschutztechnisch mindestens erwähnenswert ist.
Bei bahnmitte.de läuft ein eigener Tile-Proxy-Server. Der funktioniert so: Euer Browser fragt eine Kartenkachel an, mein Server lädt sie von OpenStreetMap (oder liefert sie aus dem Cache), und schickt sie an euch weiter. OpenStreetMap sieht dabei nur die IP meines Servers – nicht eure.
Das klingt nach viel Aufwand für ein Detail, aber ich finde: Wenn man Datenschutz ernst meint, dann konsequent.
Der Algorithmus: Wie wird der beste Treffpunkt gefunden?
Jetzt zum spannendsten Teil. Wie findet bahnmitte aus hunderten möglichen Bahnhöfen den optimalen Treffpunkt?
Schritt 1: Kandidaten bestimmen. Nicht jeder der rund 5.400 Bahnhöfe in Deutschland kommt als Treffpunkt in Frage. Je nach Einstellung filtert bahnmitte nach Größe: nur Hauptknotenpunkte (die großen ICE-Halte wie Frankfurt, Hannover, Erfurt), Großstadt-Bahnhöfe, oder alle Fernbahnhöfe. Im Modus „Eigene wählen" könnt ihr auch selbst Zielbahnhöfe festlegen.
Schritt 2: Reisezeiten berechnen. Für jeden Kandidaten-Bahnhof fragt das System die Fahrplanverbindungen von allen Startbahnhöfen ab. Dabei werden echte Verbindungen am gewählten Tag und zur gewählten Uhrzeit berücksichtigt – inklusive Umstiege, Wartezeiten und Taktung.
Schritt 3: Bewerten. Hier kommen die zwei Modi ins Spiel:
Im Modus Gesamtzeit ist die Berechnung vergleichsweise einfach: Für jeden Kandidaten werden die Reisezeiten aller Teilnehmer addiert. Der Bahnhof mit der geringsten Gesamtreisezeit gewinnt. Mathematisch ausgedrückt wird die Summe aller Fahrzeiten minimiert.
Der Modus Faire Verteilung ist komplexer. Hier geht es nicht nur um die Summe, sondern um die Verteilung. Ein Treffpunkt, bei dem drei Personen je 2 Stunden fahren, ist „fairer" als einer, bei dem zwei Personen 1 Stunde und eine Person 4 Stunden fahren – auch wenn die Gesamtzeit im zweiten Fall geringer wäre. Der Algorithmus bestraft große Unterschiede zwischen den Reisezeiten und bevorzugt gleichmäßige Verteilungen.
Schritt 4: Ranking. Die Kandidaten werden nach ihrem Score sortiert und die besten Ergebnisse angezeigt.
Caching: Lernen aus vergangenen Berechnungen
Eine Fahrplanabfrage dauert je nach Verbindung einige hundert Millisekunden. Bei 10 Startbahnhöfen und 50 Kandidaten wären das 500 Abfragen – viel zu langsam für eine gute Nutzererfahrung.
Deshalb speichert bahnmitte nach jeder Berechnung die ermittelten durchschnittlichen Reisezeiten zwischen Bahnhöfen. Diese Daten enthalten keinen Personenbezug – es sind reine Durchschnittswerte wie „Hamburg Hbf → Erfurt Hbf: ca. 168 Minuten". Bei zukünftigen Berechnungen können bekannte Strecken aus dem Cache bedient werden, statt den Fahrplan erneut abzufragen.
Das macht das System mit jeder Nutzung schneller und genauer, ohne dass dabei persönliche Daten anfallen.
Datenschutz: Was gespeichert wird – und was nicht
Ich fasse zusammen, was bei einer Berechnung auf bahnmitte.de passiert:
Gespeichert wird: die durchschnittliche Reisezeit zwischen Bahnhöfen (anonymisiert, ohne Personenbezug, wird nach einem Jahr gelöscht). Serverlogs mit IP-Adresse und Zugriffszeit (werden nach 60 Tagen gelöscht).
Nicht gespeichert wird: welche Bahnhöfe ihr eingegeben habt, wann ihr die Berechnung gemacht habt, wie viele Personen beteiligt waren, oder irgendein anderer Kontext eurer Anfrage.
Nicht verwendet wird: Cookies, Tracking-Pixel, Google Analytics, Facebook-Pixel oder sonstige Analyse-Tools.
Was ich gelernt habe
bahnmitte.de ist ein Hobbyprojekt, und wie bei jedem Hobbyprojekt habe ich unterwegs einiges gelernt.
Fahrplandaten sind komplex. Die gleiche Strecke kann je nach Wochentag, Uhrzeit und Saison völlig unterschiedliche Reisezeiten haben. Ein ICE-Sprinter Hamburg–München braucht unter 4 Stunden, eine Verbindung mit Umstieg am Sonntagabend über 6. Der Algorithmus muss diese Varianz berücksichtigen, ohne einzelne Ausreißer überzubewerten.
Fairness ist subjektiv. Was „fair" bedeutet, hängt vom Kontext ab. Für ein Klassentreffen ist eine gleichmäßige Verteilung wichtig. Für ein Geschäftstreffen zählt vielleicht eher die Gesamteffizienz. Die zwei Modi sind ein Kompromiss – in Zukunft könnte ich mir vorstellen, individuelle Gewichtungen pro Person anzubieten.
Datenschutz kostet Aufwand, lohnt sich aber. Einen eigenen Tile-Proxy und eigene Fahrplan-Server zu betreiben ist deutlich aufwändiger, als einfach Google Maps und die DB-API einzubinden. Aber es fühlt sich richtig an – und das Feedback der Nutzer bestätigt das.
Ausblick
bahnmitte.de wird aktiv weiterentwickelt. Ein paar Dinge, über die ich nachdenke: teilbare Ergebnis-Links, damit man den Treffpunkt direkt an die Gruppe schicken kann; eine erweiterte Kartenansicht der Ergebnisse; und die Möglichkeit, individuelle Zeitbudgets pro Person zu setzen.
Wenn ihr Ideen, Wünsche oder Feedback habt, schreibt mir gerne an bahnmitte@tldev.de. Und wenn ihr das Tool noch nicht ausprobiert habt: bahnmitte.de – drei Bahnhöfe eingeben, berechnen, fertig.
Weiterführende Links
- db-rest auf GitHub – die Open-Source-Software hinter den Fahrplandaten
- OpenStreetMap – das Kartenmaterial
- Datenschutzerklärung von bahnmitte.de