Vertiefungsaufgabe
Robert Riedel: s3roried@stud.hszg.de
Bettina Sprenger: s3bespre@stud.hszg.de
Lösung des Rundreiseproblems (TSP)
Aufgabenstellung
Eine PKW-Rundreise soll durch die folgenden Städte führen und dabei jeden dieser 16 Orte genau einmal besuchen:
|
|
Ausnahme: Die Stadt, in der die Rundreise beginnt und endet, ist die einzige zweimal besuchte Stadt.
Gesucht ist die kürzeste Rundreise.
Entfernungsmatrix
Unser TSP umfasst also 16 Städte und 120 Entfernungen. Der daraus konstruierte Graph besitzt demnach Knotenanzahl |V| = 16 und Kantenanzahl |E| = 120. Daraus resultiert folgende symmetrische Entfernungsmatrix.
Ermittelte Rundreise
Im Internet existieren zahlreichen Dienste und Programme, die für einen Graphen auf Basis einer Karte mit Entfernungsdaten (Quelle ist meistens Google Maps) die optimale Rundreise ermitteln. So berechnet auch der Roundtrip Solver Optimap von GEBWEG für unser TSP eine optimale Tour von 1443 km Länge.
Starten wir beispielsweise in Dresden, so führt uns diese Rundreise folgenden Weg entlang, bis wir wieder an unserem Startpunkt ankommen:
Dresden, Dohna, Pirna, Dürrhennersdorf, Löbau, Eisenhüttenstadt, Berlin, Lüneburg, Eisenach, Blankenheim, Spröda, Callenberg, Limbach-Oberfrohna, Seerhausen, Riesa, Coswig, Dresden.
Intuitiver Algorithmus
Um das Rundreiseproblem mit Sicherheit lösen zu können, benötigt man das Minimum aller möglichen Touren. Die Anzahl aller dieser Touren wächst jedoch exponentiell mit der Knotenanzahl n, d.h. es müssen zunächst (n-1)!/2 Rundreisen bestimmt werden. Auf unser konkretes Beispiel mit 16 Städten bezogen sind das über 600 Milliarden Touren.
Wir suchen also nach effizienteren Lösungsverfahren für dieses schwierige Problem.
Als erster Lösungversuch bietet sich daher eine zufällige gültige Tour an. Da wir mit einer Karte arbeiten, wählen wir am besten einen Kreis, um den Überblick über alle Städte zu behalten.
Die so ermittelte Tour besitzt ebenfalls eine Länge von 1443 km, wir haben also auf diese Weise die optimale Tour gefunden. Normalerweise ergibt jedoch ein derart zufälliges Verfahren eine beliebig schlechte Tour.
Da wir zu unserer Route bei jedem Schritt einen neuen Knoten hinzufügen, d.h. dass wir bei jedem Schritt eine neue Stadt besuchen, terminiert der Zufallsalgorithmus nach \mathcal{O}(|V|) und liefert eine mögliche Lösung des TSP.
Zwar besitzen wir jetzt eine in Linearzeit ermittelte Lösung, jedoch können wir keine Aussage über deren Güte treffen, wenn wir die optimale Tour nicht kennen.
Lösungsverfahren Branch & Bound
Näherungslösung MST-Heuristik
Nun soll für einen weiteren Lösungsversuch des TSP die bekannte MST-Heuristik verwendet werden, ein Näherungsalgorithmus, der auf der Konstruktion eines minimalen Spannbaumes (MST) und Eulertouren beruht.
Der Zusammenhang zwischen einem TSP-Graphen und seinem minimalen Spannbaum besteht darin, dass eine Rundreise durch Wegfallen einer beliebigen Kante einen Hamiltonpfad ergibt, der gleichzeitig einen speziellen Spannbaum darstellt. Es gilt demnach w(MST) \leq w(TSP) mit w als Gewichtsfunktion. Die Konstruktion eines MST wird daher benutzt, um eine untere Schranke (Relaxation) für die optimale Tour angeben zu können.
Der Algorithmus (tree algorithm) lässt sich nun wie folgt formulieren:
- Bestimme einen minimalen Spannbaum T des TSP-Graphen G.
- Verdopple alle Kanten in T und erzeuge einen Multigraphen T_m.
- Bestimme einen Eulerkreis K von T_m.
- Wähle eine in K enthaltene Tour.
Wenden wir nun diesen Algorithmus auf das gegebene TSP mit Knotenanzahl |V| = 16 und Kantenanzahl |E| = 120 an.
Die Konstruktion des MST kann mit dem Algorithmus von Prim in \mathcal{O}(|V|^2) Schritten durchgeführt werden und liefert den unten dargestellten Baum mit dem Gewicht w(MST) = 1058,7 km. Die optimale Tour ist demnach mindestens 1058,7 km lang.
Nach der Verdopplung aller Kanten des entstandenen Graphen kann nun ein Eulerkreis mit dem Algorithmus von Hierholzer in \mathcal{O}(|E|) konstruiert werden.
Ein möglicher Eulerkreis ist zum Beispiel:
Dresden, Dohna, Pirna, Dürrhennersdorf, Löbau, Eisenhüttenstadt, Berlin, Eisenhüttenstadt, Löbau, Dürrhennersdorf, Pirna, Dohna, Dresden, Coswig, Seerhausen, Riesa, Seerhausen, Limbach, Callenberg, Limbach, Seerhausen, Spröda, Blankenheim, Lüneburg, Blankenheim, Eisenach, Blankenheim, Spröda, Seerhausen, Coswig, Dresden
Aus diesem Eulerschen Kreis ergibt sich eine mögliche Rundreise, wenn alle im Kreis doppelt auftretenden Städte mit Ausnahme des Zielpunktes gestrichen werden. So erhalten wir aus obigem Eulerkreis folgende Tour:
Dresden, Dohna, Pirna, Dürrhennersdorf, Löbau, Eisenhüttenstadt, Berlin, Coswig, Seerhausen, Riesa, Limbach, Callenberg, Spröda, Blankenheim, Lüneburg, Eisenach, Dresden
Diese Rundreise hat die Länge 1753,7 km.





