Das schöne an einer Forschungseinrichtung ist ja, dass man sich auch mal mit völlig abseitigen Themen beschäftigen kann, Sachen die in der realen Welt praktisch nie vorkommen, aber eben doch interessant zu modellieren sind, wie zum Beispiel: Zugverspätungen.

In SUMO sind Züge erst einmal ganz normale Fahrzeuge und man kann ihnen Halte (in SUMO heißen sie stop) in ihrer Route mitgeben. Natürlich kann SUMO auch Fahren im Block und ähnliche Bahnbesonderheiten simulieren, das ist für das Anhalten in diesem Artikel aber nicht so wichtig. Nehmen wir also an, wir haben schon eine Haltestelle mit dem schönen Namen „Halt“ definiert und möchten, dass unser Zug dort hält. In netedit sieht das im einfachsten Fall wie oben im Bild aus, in SUMO’s XML so:
<routes>
<trip id="Zug" type="DEFAULT_RAILTYPE" depart="0" from="E0" to="E1">
<stop trainStop="Halt" duration="60"/>
</trip>
</routes>
Wie man leicht erraten kann, hält dieser Zug dann in der Simulation eine Minute am angegebenen Halt.
Wie man den Zug und alles weitere in SUMO’s netedit definiert beschreibe ich hier nicht näher und beschränke mich auch im Folgenden auf die XML-Dateien. Natürlich kann man das auch alles in netedit klicken. Insgesamt benötigt man immer ein Netz, eine Routendatei (wie oben), eine Additional-Datei (für den Halt) und eine sumocfg, die alles zusammenführt. Ich habe Netz, Halt und initiale Route in netedit erstellt und einmal die sumocfg gespeichert und dann mit XML weitergemacht. Die finalen Dateien finden sich auch am Ende des Artikels zum Download.
Wenn man das nicht nur anschauen möchte, wertet man das am besten aus indem man stopinfo-output aktiviert:
sumo -c train.sumocfg --stop-output stops.xml
was folgende Ausgabe in der Datei stops.xml erzeugt (unwesentliche Attribute habe ich zugunsten der Lesbarkeit weggelassen und es sei sumo auch verziehen, dass es busStop schreibt, auch wenn es ein Zug ist):
<stops>
<stopinfo id="Zug" ... started="39.00" ended="99.00" busStop="Halt" .../>
</stops>
Der Zug hat also tatsächlich von Sekunde 39 bis Sekunde 99 gehalten. Um Verspätungen zu ermitteln, müssten wir jedoch wissen, wann er denn hätte losfahren sollen, wir brauchen also einen Fahrplan. Dazu nutzen wir in der Routendatei das Attribut until an Stelle von duration um deutlich zu machen, dass es eine geplante Abfahrtzeit gibt:
<routes>
<trip id="Zug" type="DEFAULT_RAILTYPE" depart="0.00" from="E0" to="E1">
<stop trainStop="Halt" until="120.00"/>
</trip>
</routes>
Jetzt enthält der stop output auch mehr Informationen:
<stops>
<stopinfo id="Zug" ... started="39.00" ended="120.00" delay="0.00" busStop="Halt" .../>
</stops>
Keine Verspätung (delay), alles super. Jetzt lassen wir unseren Zug mal extra langsam fahren, um eine Verspätung zu provozieren:
<routes>
<vType id="langsam" vClass="rail" maxSpeed="1"/>
<trip id="Zug" type="langsam" depart="0" from="E0" to="E1">
<stop trainStop="Halt" until="120"/>
</trip>
</routes>
Der stop output sieht jetzt so aus:
<stops>
<stopinfo id="Zug" ... started="163.00" ended="164.00" delay="44.00" busStop="Halt" .../>
</stops>
Die Verspätung ist jetzt schon mal abgebildet, aber wir würden natürlich gerne wissen woran es lag. Ist der Zug schon zu spät angekommen oder ist er genau hier einfach nur länger stehengeblieben? Dazu müssen wir allerdings auch die geplante Ankunftszeit wissen:
<routes>
<vType id="langsam" vClass="rail" maxSpeed="1"/>
<trip id="Zug" type="langsam" depart="0" from="E0" to="E1">
<stop trainStop="Halt" arrival="60" until="120"/>
</trip>
</routes>
generiert folgende Ausgabe:
<stops>
<stopinfo id="Zug" ... started="163.00" ended="164.00" delay="44.00" arrivalDelay="103.00" busStop="Halt" .../>
</stops>
Wir sehen also, dass der Zug tatsächlich schon viel zu spät angekommen ist und sogar durch einen kürzeren Halt etwas Zeit gut gemacht hat. Jetzt wollen wir das mal mit ein paar mehr Zügen ausprobieren:
<routes>
<vType id="default" vClass="rail"/>
<vType id="langsam" vClass="rail" maxSpeed="1"/>
<vTypeDistribution id="mix" vTypes="langsam default"/>
<flow id="Zug" type="mix" begin="0" end="3600" period="300" from="E0" to="E1">
<stop trainStop="Halt" until="120"/>
</flow>
</routes>
Jetzt fährt also alle fünf Minuten ein Zug (und er ist mit 50% Wahrscheinlichkeit langsam) und man kann sehen, wie die Verspätung von Zug.1 und Zug.2 vor allem auf die nachfolgenden wirkt:

Dieses Bild wurde übrigens mit dem folgenden Aufruf erzeugt:
$SUMO_HOME/tools/visualization/plotXMLAttributes.py -x id,type -y delay --join-x \
--join "\n" --barplot flow_stops.xml
und hier noch die Dateien des Szenarios zum herunterladen.
TL;DR
SUMO unterstützt für Halte die Attribute until und arrival. Damit lassen sich Fahrpläne für Fahrzeuge abbilden und die Verspätungen sowohl bei Ankunft als auch bei Abfahrt auswerten.






