Travelling Salesman Problem
Die Klasse Node
bietet einen Wrapper für die Koordinaten und abstrahiert die Ausgabe im Plot und als Text.
Des weiteren wurden einige Funktionen abstrahiert um die Lesbarkeit zu verbessern:
-
distance()
ermittelt den Abstand zwischen zwei Punkten. -
total_distance
bildet die Summe aller Abstände entlang der Punkte in der übergebenen Liste. Der Parametercircle
schließt den Kreis von letzter zu ersterNode
. -
plot_path()
undplot_route()
abstrahieren die Interkation mitplt
. -
get_closest_node()
ermittelt die nahgeliegensteNode
zucurrent_node
. Istcurrent_node
innodes
enthalten wird sich der Abstand 0 ergeben. Entsprechend sollte diese vor dem Aufruf entfernt werden. -
parse_data_file()
liest Dateien im Format vontsp01.data
und erstellt eine entsprechende Liste vonNode
s.
Brute Force
Hier werden alle möglichen Kombinationen der Nodes überprüft.
Dafür kommt die Funktion itertools.permutations()
zum Einsatz.
Sie erlaubt das durchlaufen aller Möglichkeiten in einer for-Schleife und so einen sehr klaren Algorithmus:
Für jede mögliche Route merke Kombination und Länge, falls diese kürzer als die bislang kürzeste Route ist.
Zuletzt wird die Kürzeste ausgegeben.
Nearest Neighbour
Durch diese Heuristik können erheblich mehr Punkte in die Berechnung einbezogen werden, allerdings weist das Ergebnis meist sehr lange Sprünge und Wegkreuzungen auf.
- Es wird eine Liste aller noch nicht verbundenen, übrigen Nodes erstellt.
- Als Startpunkt wird das erste Element der Route hinzugefügt.
- Der selbe Punkt wird aus den übrigen Nodes entfernt.
- Solange noch Nodes übrig sind:
- Ermittle die nächste Node zur zuletzt verbundenen,
- füge sie der Route hinzu und
- entferne sie aus den übrigen Nodes.
- Gib die entstandene Route aus.
2-opt
Der 2-opt-Heuristik soll Kreuzungen finden und sie durch geschicktes Vertauschen die Nodes eliminieren. So wird das Ergebnis der Nearest-Neighbour-Heuristik erheblich verbessert.
Ich konnte nicht die Ruhe finden das ordentlich umzusetzen. Die auftretenden Fehler haben sehr wahrscheinlich mit den Zugriffen auf die einzelnen Elemente und deren erneute Zuweisung zu tun.