Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws1516:logistische_probleme:2ercode

Der komplette code der Tauschheuristik. Für die 2er-Tauschheuristik muss nichts angegeben werden, für die 3er-Tauschheuristik muss für modus „3“ angegeben werden.

def tauschalgorithmus(zuege, streckendaten, anschlussdaten, tauschzahl=500, modus=2):
    ausgangssituation = auswertung(simulieren(zuege, streckendaten["abstand"], streckendaten["streckenlaenge"]),
                                   anschlussdaten)
    ausgangsreihe = copy.deepcopy(zuege)
    neuesituation = []
    k = 1  # Zaehlindex fuer Tauschversuche
    n = 1  # Zaehlindex fuer Tausche
    if modus == 2:
 
        for i in range(0, tauschzahl):  # Bis wo es evtl noch schneller ist als die bruteforcemethode
            k += 1
            neuereihe = tauschen(zuege, random.randint(0, len(zuege) - 1),
                                 random.randint(0, len(zuege) - 1))  # zufaelliges tauschen zweier Zuege
            # print neuereihe
            neuereihe = deepcopy(neuereihe)
            # print neuesituation
            #debug.error(neuesituation)
            neuesituation = auswertung(simulieren(neuereihe),anschlussdaten)#, streckendaten["abstand"], streckendaten["streckenlaenge"]),anschlussdaten)
            #neuesituation = simulieren(({'ankunft': -1, 'nummer': 1007, 'vavg': 200, 'vist': 0, 'auf1': 0.14, 'ort': 0, 'auf3': 0.1, 'auf2': 0.3, 'besetzung': 60, 'ankunftplan': 340}, {'ankunft': -1, 'nummer': 3119, 'vavg': 200, 'vist': 0, 'auf1': 0.14, 'ort': 0, 'auf3': 0.1, 'auf2': 0.7, 'besetzung': 120, 'ankunftplan': 340}, {'ankunft': -1, 'nummer': 1007, 'vavg': 200, 'vist': 0, 'auf1': 0.14, 'ort': 0, 'auf3': 0.1, 'auf2': 0.3, 'besetzung': 60, 'ankunftplan': 340}, {'ankunft': -1, 'nummer': 5421, 'vavg': 40, 'vist': 5, 'auf1': 0.14, 'ort': 0, 'auf3': 0.1, 'auf2': 0.3, 'besetzung': 400, 'ankunftplan': 340}))
            logger.warning("neuesituation steht.")
            if ausgangssituation > neuesituation:
                ausgangssituation = neuesituation
                ausgangsreihe = neuereihe
                logger.debug("Verbesserung auf " + str(ausgangssituation) + " erreicht mit " + str(n) + " Tauschversuchen.")
            else:
                n += 1
 
    if modus == 3:
        print("Tausche Dreiergruppen...")
        if len(zuege) < 3:
            print("Bei weniger als drei Zügen können nicht Tripel von Zügen getauscht werden. Abbruch.")
            return null
 
        for i in range(0, tauschzahl):  # es wird n-mal getauscht
            k += 1
 
            startindex = random.randint(0,len(zuege) - 3)  # Es wird zufällig eine position gewählt von wo aus getauscht wird
            neueliste = []
            neuereihe = []
            for j in range(startindex, startindex + 3):  # Die 3 Züge ab dort werden herauskopiert
                neueliste.append(zuege[j])
 
            snippet = nfaq(neueliste, streckendaten,anschlussdaten)  # Dann wird bestimmt welche die beste Reihenfolge der 3 ist
            print("snippet fertig")
            # Mit der neuen Reihenfolge wird wieder eine komplette Zugfolge zusammengeschustert
            neuereihe.append(zuege[0 - startindex])  # Die Züge bis zur reihe
            neuereihe.extend(snippet)  # Die Reihe selbst
            neuereihe.extend(zuege[startindex + 3:])  # Der Rest
            neuereihe = copy.deepcopy(neuereihe)
            print(neuereihe)
            neuesituation = simulieren(neuereihe)#, streckendaten["abstand"], streckendaten["streckenlaenge"])
            if ausgangssituation > neuesituation:
                ausgangssituation = neuesituation
                ausgangsreihe = neuereihe
                print("Verbesserung auf " + str(ausgangssituation) + " erreicht mit " + str(n) + " Tauschversuchen.")
            else:
                n += 1
 
    print("Tauschalgorithmus: " + str(k) + " Tauschversuche durchgeführt")
    #print ausgangsreihe
    return ausgangsreihe
 
 
def tauschen(eingabe, x, y):
    list = copy.deepcopy(eingabe)
    list[x], list[y] = list[y], list[x]
    return list
ws1516/logistische_probleme/2ercode.txt · Zuletzt geändert: 2016/05/10 14:46 (Externe Bearbeitung)