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