diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..6869c6e2b17a74e3873328ef50151ffb1e29c435 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# 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 Parameter `circle` schließt den Kreis von letzter zu erster `Node`. +- `plot_path()` und `plot_route()` abstrahieren die Interkation mit `plt`. +- `get_closest_node()` ermittelt die nahgeliegenste `Node` zu `current_node`. Ist `current_node` in `nodes` enthalten wird sich der Abstand 0 ergeben. Entsprechend sollte diese vor dem Aufruf entfernt werden. +- `parse_data_file()` liest Dateien im Format von `tsp01.data` und erstellt eine entsprechende Liste von `Node`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. +1. Es wird eine Liste aller noch nicht verbundenen, übrigen Nodes erstellt. +2. Als Startpunkt wird das erste Element der Route hinzugefügt. +3. Der selbe Punkt wird aus den übrigen Nodes entfernt. +4. Solange noch Nodes übrig sind: + 1. Ermittle die nächste Node zur zuletzt verbundenen, + 2. füge sie der Route hinzu und + 3. entferne sie aus den übrigen Nodes. +5. 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.