Dies ist eine alte Version des Dokuments!
Es existieren zwei Versionen des Simulationsprogrammes. Das eine simuliert tatsächlich die einzelnen Zugbewegeungen in einzelnen Zeitschritten, ist jedoch vergleichsweise unperformant. Stefan hat freundlicherweise ein Simulationsprogramm geschrieben, dass die Züge berechnen kann (wann laufen die Züge aufeinander auf usw.) und um ein Vielfaches schneller ist:
5 Züge - Simulation:
0.04804 sec
5 Züge - Berechnen:
0.00107 sec
Die Simulation arbeitet mit mehreren Schleifen, die wie folgt agieren:
t = 0 streckebelegt = [] def streckefrei(i, order): # Zug: Woerterbuch, order = Objekt wie reihenfolge freivoraus = -1 if i > 0: if order[i - 1]["ankunft"] == -1: freivoraus = - order[i]["ort"] + order[i - 1]["ort"] else: freivoraus = -1 if i == 0: freivoraus = -1 return freivoraus def simulieren(optimum, abstand=1500, streckenlaenge=20000): logger.error( optimum ) reihenfolge = deepcopy( optimum ) # Eingabeliste soll nicht veraendert werden t = 0 # Abfahrtszeit ist 0 angekommen = 0 for i, zug in enumerate( reihenfolge ): if i > 0: zug["vist"] = min( reihenfolge[i - 1]["vist"], zug[ "vavg"] ) - 1 # Es wird vor Programmstart sichergestellt, dass kein Zug schneller ist als sein vorheriger und diesen im ersten Schritt ggf. überholen kann. while 1 == 1: for i, zug in enumerate( reihenfolge ): if zug["ankunft"] == -1: # and t>=zug["abfahrt"]: # Wenn nicht angekommen und abfahrtszeit erreicht if streckefrei( i, reihenfolge ) == -1: zug["vist"] = zug["vavg"] # vavg beschreibt die maximale geschwindigkeit des zuges elif streckefrei( i, reihenfolge ) >= abstand: if i != 0: zug["vist"] = min( reihenfolge[i - 1]["vist"], zug["vavg"] ) else: zug["vist"] = 0 for zug in reihenfolge: if zug["ankunft"] == -1: zug["ort"] += zug["vist"] logger.debug( str( zug["nummer"] ) + " fährt von " + str( zug["ort"] - zug["vist"] ) + " nach " + str( zug["ort"] ) ) if zug["ort"] > streckenlaenge: if zug["ankunft"] == -1: zug["ankunft"] = t zug["ort"] = streckenlaenge angekommen += 1 logger.warning( "Ein Zug ist angekommen" ) # print("Zug angekommen") t = t + 1 if angekommen >= len( reihenfolge ): # simuliere, bis alle Zuege angekommen sind return reihenfolge break