Der Schweizer Fahrplan: Constraint-Solver im Trenchcoat
Warum Schweizer Zugfahrpläne eines der härtesten Optimierungsprobleme sind — und wie die gleiche PESP-Mathematik deine Baustelle vorentlastet.
Züge fahren hier pünktlich, und die Standard-Erklärung — Disziplin, Geld, Berge — ist falsch. Das eigentliche System ist ein Stück angewandte Mathematik, das die meisten Passagiere nie sehen: Der Fahrplan selbst ist ein gelöstes Constraint-Satisfaction-Problem, kontinuierlich neuberechnet über das ganze Netzwerk. Wie Saurabh Sharan in The Swiss Train Secret schreibt, ist das, was wie nationale Pünktlichkeit aussieht, wirklich ein System, in dem Verspätungen nicht kaskadieren können.
So funktioniert die Systemarchitektur. Die Schweiz arbeitet mit einem Taktfahrplan — einem Uhr-Fahrplan, auf dem sich Linien in fixen Intervallen wiederholen (alle 15, 30 oder 60 Minuten), und die Hauptknoten — Zürich HB, Bern, Basel — sind so getaktet, dass Anschlüsse kurz vor der halben Stunde ankommen und kurz danach abfahren. Eine einzelne Designentscheidung verwandelt ein Scheduling-Desaster in ein periodisches Problem. Mathematisch ist es das Periodic Event Scheduling Problem (PESP): jedes Event ist eine Variable, jede Mindest-Kopfzeit und jedes Umsteigefenster ist ein modulares Constraint, und der Solver sucht nach einer Zuweisung, bei der keine zwei Züge das gleiche Gleisstück in der gleichen Minute wollen.
←HEUTE: Schweizer Bahn bewegt täglich ~1,3 Millionen Fahrgäste in einem Netz, wo eine 2-Minuten-Verschiebung an einer Stelle absorbiert wird statt zu kaskadieren. →3012: Jede dichte Stadt im Zurich-3012-Manifest läuft auf periodischen, selbstheilenden Fahrplänen — für Züge, für Energie, für Compute. Drehpunkt: Resilienz ist nicht ein Spielraum, den du später kaufst; sie ist ein Constraint, den du zur Designzeit codierst, wenn der Graph noch billig umzuzeichnen ist.
Der lehrreiche Teil ist der Ausfallmodus. Wenn die Constraints verletzt werden, bekommst du keinen ein bisschen schlechteren Fahrplan — du bekommst ein Netzwerk, das stehen bleibt. Im Juni 2026 berichtete The Guardian, dass Deutsche Bahn nach einem IT-Wartungs-Ausfall zum Stillstand kam und Hunderttausende strandete. Wie The Rail Agenda in ihrer Übersicht der digitalen Ebene der Bahn argumentiert, regiert Software jetzt den operativen Kern — Fuhrparkmanagement, Asset-Monitoring, Verkehrsdaten, von denen Sicherheit und Kapazität buchstäblich abhängen. Das ist ein Single Point of Failure mit nationalem Fussabdruck. Es ging uns nie die Rechenleistung aus. Es gingen uns die intakten Systeme und die Menschen aus, die wussten, wie das Alte funktionierte.
Atelier: Die gleiche PESP-Maschine läuft unter deinem Bauprogramm. Ein Baustellen-Logistikplan — ein Turmdrehkran, drei Betonierungen, Lieferungen durch ein einzelnes Tor — ist ein periodisches Scheduling-Problem mit Kopfzeiten (Betonlaster-Abstände) und gemeinsamen Ressourcen (das Tor, der Kranhaken). Modelliere es als Constraints, nicht als Gantt-Balken, den du von Hand verschiebst, und Konflikte entstehen, bevor die Laster unterwegs sind.
Hier ist auch, wo ein echtes Digital Twin seinen Wert bewährt. Wie PAZ’s concept panel zu Engineering-Zwillingen feststellt, hört ein Twin auf, ein Museum zu sein, sobald er unter Unsicherheit eine Aktion empfiehlt — diese Spur schliessen, dieses Kabel neu spannen — anstatt nur Telemetrie zu visualisieren. Ein Live-Fahrplan-Solver, der von Sensoren gespeist wird, ist genau das: ein Twin, der dem Dispatcher sagt, was als Nächstes zu tun ist.
Hack: Dieses Hack lehrt dich, einen Gleis-Konflikt so zu erkennen wie ein Uhr-Fahrplan — mit Modulararitmetik. Das MEDIUM ist ausführbares Python; die DOMAIN ist Mathematik: periodische Events auf einer gemeinsamen Ressource, verglichen nach ihrem Offset innerhalb der Wiederholungsperiode.
period = 30 # Uhr-Fahrplan: jede Linie wiederholt sich alle 30 Min
lines = {"IC1": 4, "IR70": 19, "S12": 4} # Ankunftsoffset (Min) auf einem Perrongleis
min_headway = 3
slots = sorted(lines.items(), key=lambda kv: kv[1])
for (a, ta), (b, tb) in zip(slots, slots[1:]):
gap = (tb - ta) % period
print(a, b, gap, "OK" if gap >= min_headway else "CONFLICT")
Lauf es aus: IC1 und S12 landen beide bei Offset 4 — sofortiger CONFLICT. Ersetze das Dict durch Kranhaken-Fenster oder Betonierungszeiten, und die gleichen fünf Zeilen validieren deine Baustellen-Logistik vorab. Erster Schritt zum Weitermachen: pip install ortools und entwickle die Print-Schleife zu einem echten CP-SAT-Modell weiter, das nach Offsets löst, anstatt sie nur zu überprüfen.
Die Aktion diese Woche: Wähle eine gemeinsame Ressource auf deinem Projekt — ein Tor, einen Steigschacht, eine Server-Queue — schreib ihre echten periodischen Constraints auf Papier, und finde den dritten Konflikt, den du nicht kanntest. Das ist der ganze Punkt.
PAZ Kaffi · interdisziplinäre Redaktionsarbeit, geleitet von der PAZ Academy