Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws1516:logistische_probleme:simulationsprogramm

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

Variante von Jakob

Die Simulation arbeitet mit mehreren Schleifen, die wie folgt agieren:

  1. Für jeden Zug wird überprüft, wie viel Platz vor ihm ist, den er einnehmen darf (Zugfolgeabstand!)
    1. Dies übernimmt die Funktoin streckefrei(), die den freien Weg oder -1 für eine freie Strecke zurückliefert
  2. Dementsprechend wird die Geschwindigkeit angepasst: Es wird so dicht aufgefahren wie möglich und dann die Geschwindigkeit an den Vordermann angepasst
  3. Nachdem alle Geschwindigkeiten angepasst wurden, werden die Züge eine Zeiteinheit weiter nach vorne gesetzt
  4. Dies wird wiederholt, bis alle Züge das Streckenende erreicht haben
  5. Bei Ankunft eines Zuges wird die aktuelle Uhrzeit in den key „ankunft“ des betreffenden Zuges geschrieben
 
def streckefrei(i, order):  # Zug: Woerterbuch, order = Objekt wie reihenfolge
t = 0
streckebelegt = []
 
    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

Variante von Stefan

ws1516/logistische_probleme/simulationsprogramm.1456323272.txt.gz · Zuletzt geändert: 2016/05/10 14:46 (Externe Bearbeitung)