Zeitliche Komplexität des Held-Karp-Algorithmus für TSP


9

Als ich " Ein dynamischer Programmieransatz für Sequenzierungsprobleme " von Michael Held und Richard M. Karp durchgesehen habe , stellte ich die folgende Frage: Warum ist die Komplexität ihres Algorithmus für TSP (S. 199), ich meine, woher nehmen sie den Faktor k ? Wenn ich richtig verstanden habe, bedeutet k-1 die Anzahl der Ergänzungen für jede Untergruppe von Städten. Dann warum jede Additionsoperation mit mir unbekannten gekoppelt k Operationen? Ich nehme an, es hängt irgendwie mit dem Minimum zusammen, aber das Rechnen des Minimums scheint nicht so viele Operationen zu erfordern.(k=2n1k(k1)(n1k))+(n1)kk1k

Der dynamische Programmieralgorithmus von Held und Karp und unabhängig von Bellman läuft wie folgt ab: Für jedes Paar (S,ci) , dh einen Pfad, der durch c1 , berechnen alle Elemente von S und enden bei ci

OPT[S,ci]=min{OPT[S{ci},cj]+d(cj,ci):cjS{ci}},

wobei d(cj,ci) die Entfernung zwischen den Städten cj und ci . Dann in der Formel aus dem Papier k bedeutet die Größe von S .

Antworten:


5

Nachtrag unten, um die k (k-1) -Begriffe zu verdeutlichen k(k1):

Wenn Sie also die Terme im Ausdruck untersuchen, können Sie sich (als Analogie) vorstellen Term eine Aufzählung aller binären Zeichenfolgen ist, die 1 enthalten und an erster Stelle eine 1 haben. Mit anderen Worten, wir lassen jede Position in der Binärzeichenfolge die Wahl darstellen, ob eine bestimmte der Städte im Problem in der genauen Teilmenge liegt, die wir zu diesem Zeitpunkt betrachten. Für 5 Städte entspricht 10101 also der Teilmenge {1,3,5}.(n1k)kn

Um also über alle Teilmengen von {1, ..., } zu berechnen , zählen wir einfach durch jede binäre Teilmenge (dh durch binäre Zeichenfolgen) der Größe = 2 (dh binäre Zeichenfolgen der Größe , die zwei enthalten) Größe = 3, dann Größe = 4, ... dann Größe = n. (Beachten Sie, dass die Teilmenge size = 1 nur die erste Stadt enthalten darf und es daher irrelevant ist, ihre Teilentfernung zu berechnen, da die Entfernung von 1 -> allen anderen Städten in der Teilmenge -> 1 genau 0 ist.)nn

Bei jeder Teilmenge mit Städten müssen bis zu kandidatenoptimale Teilpfade berücksichtigt werden. Insbesondere könnte der optimale Gesamtpfad möglicherweise durch die gegebene Teilmenge verlaufen und in einer der Städte enden , mit Ausnahme der ersten Stadt. Dann berechnen wir für jeden solchen Kandidaten-Unterpfad die optimale Tour bis zu diesem Punkt als Minimum eines der vorherigen Unterpfade der Größe = plus der Entfernung von der Terminalstadt für diesen Unterpfad zum Terminalstadt für den aktuellen Kandidaten-Unterpfad. Dies ergibt solche Vergleiche, die wir machen müssen. Die Diskrepanz zwischen meinem Term und demkk1k1k1(k1)(k2)(k1)(k2)k(k1)Der Begriff in der verknüpften Analyse ist ein Notationsunterschied (ich würde angesichts meiner Definition von über einen anderen Bereich summieren als sie). Zumindest sollte es jedoch die Komplexität dieses Terms in quadratischer Ordnung veranschaulichen.k


Wie interessant - ich habe gerade vor ein paar Minuten genau diesen Algorithmus in C ++ codiert. (Also vergib die Tangente von der reinen Theorie in eine kleine praktische Diskussion. :))

Es kostet Zeit und Raum - zumindest unter meiner Implementierung. In der Praxis werden Ihre Platzanforderungen jedoch viel schmerzhafter als die Zeitanforderungen, wenn sie so schnell wachsen. Auf meinem PC (mit 4 GB RAM) kann ich beispielsweise Instanzen mit bis zu 24 Städten lösen - mehr als das, und mir geht der Speicher aus.O(2nn2)O(2nn)

Natürlich könnte ich nur ein schlechter Programmierer sein, und Sie könnten es in der Praxis besser machen als ich. :) :)

Bearbeiten: Ein bisschen mehr Details zu einem Detail Ihrer Frage: Der Term ergibt sich aus der Tatsache, dass Sie im schlimmsten Fall den partiellen, optimalen Abstand zu den vorherigen Teilmengen berechnen müssen (es gibt höchstens von ihnen; beachten Sie, dass in der von Ihnen verknüpften Analyse über mit der aktuellen summiert wird . Dies erfordert wiederum im schlimmsten Fall -Vergleiche mit Teilmengen der Größe für insgesamt .k(k1)nknO(k)k1O(k2)

Wenn meine Erklärung nicht klar genug war, finden Sie hier einige nette Vorlesungsunterlagen von Vazirani ( PDF ). Scrollen Sie nach unten zu S. 188, um eine Diskussion über TSP zu erhalten, einschließlich einer Analyse von Held-Karp.


Ja natürlich! Ich fühle mich dumm, jetzt darüber nachzudenken; Ich werde meine Antwort aktualisieren. Ich hatte genau diesen Kommentar schon einmal gehört und ihn einfach weitergegeben, ohne darüber nachzudenken. Und ja - wenn Sie in eine Datei schreiben oder aus einer Datei lesen, können Sie die Anzahl der Städte effektiv beliebig hoch halten. ... es ist auch ein Schmerz, über den man sich keine Sorgen machen sollte, es sei denn, Sie versuchen, TSP-Instanzen für einen echten Zweck zu lösen. Meins war definitiv nicht für einen praktischen Zweck. ;)
Daniel Apon

2
Zeit, den Bjorklund-Algorithmus zu implementieren :)
Suresh Venkat

@ Suresh: Gute Idee!
Daniel Apon

@ Daniel Apon Könnten Sie bitte genau angeben, warum wir Vergleiche benötigen, wenn wir "den partiellen, optimalen Abstand" berechnen?
Oleksandr Bondarenko

@Oleksandr: Sicher, ich werde es oben in meine Antwort einfügen.
Daniel Apon

0

Hauptnotiz

Es ist wichtig zu beachten, dass wir nicht
"Entfernung des optimalen Pfades für combination of k cities",
sondern
"Entfernung des optimalen Pfads für combination of k cities UND für end-point city from this combination" berechnen und speichern .
Das Verständnis hilft bei der Bedeutung der ersten beiden Multiplikatoren in der folgenden Formel.

Erste Phase

Die Anzahl der Operationen in der ersten Phase ist:

k>=2(n1k1)choose city combinationof size = k1(k1)choose city to be the lastfrom k1 citiesin chosen combination((n1)(k1))choose citythat is not in chosen combinationto add to path

Fehlende hochgestellte Summe bedeutet for all k>=2 that is valid for binomial coefficient. Der letzte gültige Nicht-Null-Term der Summe gilt also für Dies bedeutet, dass unsere Summe nicht die letzten Auswahlmöglichkeiten erfasst der Stadt mit der ersten Stadt zu verbinden. Es gibt Städte, um eine Verbindung zur ersten Stadt herzustellen. Schließlich werden wir diesen Begriff zur Summe hinzufügen.k=n1

(n1n2)(n2)1
n1

Lassen Sie die Formel in eine Form umwandeln, die Sie auch auf der Wikipedia-Seite von Held-Karp angeben .

k>=2(n1k1)(k1)((n1)(k1))=k>=2(n1)!(k1)!(nk)!(k1)(nk)=k>=2(n1)!k!(n1k)!k(k1)=k>=2(n1k)k(k1)
Manipulieren von Binomialkoeffizienten führt zu: Also die Anzahl der Operationen in der ersten Phase ist
k>=2(n1k)k(k1)=k>=2(n1)!k!(n1k)!k(k1)=k>=2(n3)!(k2)!(n3(k2))!(n1)(n2)=(n1)(n2)k>=2(n3k2)=(n1)(n2)2n3
(n1)(n2)2n3+(n1)

Zweite Phase

In der zweiten Phase wird der optimale Pfad durch Markierungen wiederhergestellt, die wir in der ersten Phase gleichzeitig mit der Berechnung der Entfernungen vorgenommen haben.

Für jeden optimalen Pfad "für combination of k cities UND für end-point city from this combination" haben wir die vorletzte Stadt gespeichert.

Um den optimalen Pfad zurückzuverfolgen, müssen wir eine Datenstruktur anfordern, um die vorletzte Stadt "für combination of k cities UND für end-point city from this combination" zurückzugeben. Diese Datenstruktur muss also so etwas wie sein
Map<combination of k cities, Map<last city, second-to-last city>>. Als Index combination of k citieskönnen wir zum Beispiel verwenden binary_string[city id]=1 if city id is in combination. Wir müssen uns also alle Elemente von ansehen combination of k cities, um die Kombination zu identifizieren und unsere Datenstruktur zu indizieren. Dies gibt uns die Anzahl der Operationen für die zweite Phase:

k>=2n1k=(n)(n1)21

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.