Vertiefungsaufgabe

Aus ProgrammingWiki

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:

  • Dresden
  • Berlin
  • Spröda
  • Lüneburg
  • Löbau
  • Limbach-Oberfrohna
  • Blankenheim (06528)
  • Dohna
  • Eisenach (99817)
  • Dürrhennersdorf
  • Callenberg (09337)
  • Eisenhüttenstadt
  • Pirna
  • Riesa
  • Coswig (01640)
  • Seerhausen

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.

Croxeldyffic_Adjmatrix.jpg

Ermittelte Rundreise

Croxeldyffic_Map03.jpg
mit Optimap ermittelte Tour

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.

Link zur Optimap-Webseite

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.

Croxeldyffic_Map-kreis.jpg
eine zufällig gewählte Tour

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

Das Verfahren Branch and Bound geht grundlegend von einem vollständigen Durchlauf aller Verzweigungen, also möglichen Lösungen aus, weshalb der Algorithmus auch ein exaktes Ergebnis liefert.

Die eigentliche Verbesserung zum schlichten Ausrechnen aller Möglichkeiten besteht darin, das Problem durch die Wahl geeigneter Schranken (Bound) zu begrenzen und dementsprechend zu verzweigen(Branch).

Man muss nun überlegen, wie man die Schrankenbedingungen wählt. Als erste obere Schranke bietet sich ein willkürlicher Durchlauf der Städte an, der natürlich eine gültige Lösung sein muss. Diese erste obere Schranke kann innerhalb des Algorithmus immer weiter abgesenkt werden.

Alle Zweige, die untersucht werden und diese Schranke überschreiten würden, müssen nicht weiter verfolgt werden und können somit abgeschnitten werden.

Auf diese Weise geht man alle mögliche Wege ab, bis alle besucht oder abgeschnitten wurden. Dabei wird die Startmatrix immer weiter reduziert, die Ergebnismatrix ist unten zu sehen.


Croxeldyffic_Adjmatrix-reduced.jpg
RoRied_Map-kreis.jpg
mit Branch and Bound ermittelte Tour

Je nach Anordnung der Eingabedaten ist die Laufzeit \mathcal{O}(n), sollte der erste gewählte Pfad schon die ideale Tour ergeben, bis \mathcal{O}(n!) wenn die ideale Tour erst als letzte Möglichkeit entdeckt wird.


Die Rundreise ist 1442,9 km beginnend bei Dresden

Coswig, Riesa, Seerhausen, Limbach-Oberfrohna, Callenberg, Spröda, Blankenheim, Eisenach, Lüneburg, Berlin, Eisenhüttenstadt, Löbau, Dürrhennersdorf, Pirna, Dohna, Dresden


Wir haben also unsere optimale Tour wiedergefunden.

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.

Diese Heuristik ist jedoch nur für ein metrisches TSP geeignet, d.h. die zugehörige Entfernungsmatrix ist positiv definit (Abstand 0 eines Knotens zu sich selbst, positive Abstände zwischen unterschiedlichen Knoten) sowie symmetrisch (e(v_i, v_j) = e(v_j, v_i)) und erfüllt die Dreiecksungleichung (Umweg von Stadt u nach w über v ist niemals kürzer als direkter Weg von u nach w). Sie ist also nicht immer anwendbar.

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:

  1. Bestimme einen minimalen Spannbaum T des TSP-Graphen G.
  2. Verdopple alle Kanten in T und erzeuge einen Multigraphen T_m.
  3. Bestimme einen Eulerkreis K von T_m.
  4. 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.

Croxeldyffic_Mst.png

Nach der Verdopplung aller Kanten des entstandenen Graphen kann nun ein Eulerkreis mit dem Algorithmus von Hierholzer in \mathcal{O}(|E|) konstruiert werden.

Croxeldyffic_Mst-double.png
Croxeldyffic_Map-mst.jpg
mit MST-Heuristik ermittelte Rundreise

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. Da man diese aus dem Eulerkreis beliebig wählen kann, lässt sich auch mit dieser Heuristik lediglich mit Sicherheit sagen, dass die ermittelte Rundreise höchstens doppelt so groß ist, wie der minimale Spannbaum.


Die Verdopplung aller Kanten im Spannbaum, die Bestimmung eines Eulerkreises in diesem Multigraphen und die Auswahl einer darin enthaltenen Tour besitzen jeweils die Komplexität \mathcal{O}(|E|). Ausschlaggebend für die asymptotische Aufwandsordnung der MST-Heuristik ist die Erzeugung eines minimalen Spannbaumes mit dem Algorithmus von Prim in \mathcal{O}(|V|^2) Schritten.

Die MST-Heuristik besitzt also ebenfalls die Komplexität \mathcal{O}(|V|^2).

Fazit

An dieser Stelle sollen die obigen Lösungsverfahren zusammengefasst und gegenübergestellt werden.

Zufallsroute Branch & Bound MST-Heuristik
Laufzeit \mathcal{O}(|V|) \mathcal{O}(|V|) bis \mathcal{O}(|V|!) \mathcal{O}(|V|^2)
exakte Lösung? nein ja nein
Vorteile
   
  • intuitiv
  • schnell
       
  • übersichtlich
  • exakt
  • effizient
       
  • einfach
  • schnell
  • Nachteile willkürliche Tour schlimmstenfalls exponentiell
       
  • Tour beliebig schlecht
  • nur für \DeltaTSP

  • Mittlerweile existieren jedoch Näherungsverfahren, die sehr effizient eine Lösung ermitteln, die gleichzeitig nah am Optimum liegt. Ein Beispiel hierfür ist der schnelle Ameisenalgorithmus (Ant Colony Optimization) von M. Dorigo, der sich am Schwarmverhalten von Ameisen bei der Futtersuche orientiert und auch bei vielen Städten und dynamischen TSP eine nahezu optimale Lösung ermittelt. Dieser Algorithmus wird beispielsweise auch beim Webservice Optimap angewandt und für ein exaktes Ergebnis einer zusätzlichen Postoptimierung unterworfen.