Rechnerische Komplexität

Werbung
Proseminar „Effiziente Algorithmen“ SS 2002
Rechnerische Komplexität
Ulrike Krönert (34180)
0. Inhalt
1. Einführung
2. Algorithmen und Komplexität
2.1. Algorithmen
2.2. Laufzeitabschätzung
2.3. Polynomialzeit
3. Die Klassen P und NP
3.1. Entscheidungsprobleme
3.2. Charakterisierung der Klassen P und NP
4. Literatur
1. Einführung
In den letzten Jahrzehnten wurden Methoden in Hinsicht auf kombinatorische Optimierung
entwickelt, um Algorithmen zu bewerten und Probleme entweder als „schwer“ oder „leicht“
einzuordnen. Das TSP (Travelling Salesman Problem) ist dabei eines der bedeutendsten
Probleme, an dem jeder neue erdenkliche Algorithmus ausprobiert wurde, und das als eines
der ersten Optimierungsprobleme als „schwer“ eingestuft wurde.
2. Algorithmen und Komplexität
2.1. Algorithmen
Ein Algorithmus ist eine Prozedur, bei der Schritt für Schritt ein Problem gelöst wird. Er kann
entweder in einer Programmiersprache formuliert sein, aber ebenso auch informell.
Zum Beispiel sei folgendes TSP gegeben: Es gibt n Städte, und eine n×n Distanzmatrix C ist
gegeben. Die Frage sei, welches der kürzeste Reiseweg für diese n Städte ist. Man kann dies
auch folgendermaßen schreiben:
TSP
INSTANZ: ganze Zahl n = 3 und eine n×n Matrix C = (c ij ), wobei jedes c ij eine nichtnegative ganze Zahl ist (Bem.: jede rationale Zahl kann durch Multiplikation zu
einer ganzen Zahl umgewandelt werden).
FRAGE: Welche zyklische Permutation p der ganzen Zahlen von 1 bis n minimiert die
Summe ∑ni=1 c ip(i) ?
1
Zur Lösung dieses Problems gibt es einen Algorithmus, hier zur Unterscheidung für spätere
Algorithmen ALGORITHMUS A genannt. Er generiert alle möglichen Reisewege, bewertet
jeden und bestimmt den besten. Da er nicht sehr effizient arbeitet, wird er auch als „rohe
Gewalt-Technik“ bezeichnet.
ALGORITHMUS A
Input: Eine ganze Zahl n = 3 und eine n×n Distanzmatrix C besetzt mit nicht-negativen ganzen Zahlen.
Output: Ein kürzester Reiseweg durch die n Städte.
BEGIN
min :=8 ;
FOR alle zyklischen Permutationen p von {1,2,...,n} DO
BEGIN
cost := ∑ni=1 c ip(i);
IF cost < min THEN
BEGIN
min := cost;
besttour := p
END
END
OUTPUT besttour
END
Ein besserer Algorithmus ist ALGORITHMUS B. Dieser findet für jedes i den kürzesten Weg
von Stadt 1 zu Stadt i, der alle anderen Knoten in {2,3,...,n} besucht. Sobald einmal diese
Wege gefunden sind, ist es einfach, den kürzesten Reiseweg zu finden.
ALGORITHMUS B
Input: Eine ganze Zahl n = 3 und eine n×n Distanzmatrix C besetzt mit nicht-negativen ganzen Zahlen
Output: Ein kürzester Reiseweg durch die n Städte
BEGIN
FOR i := 2 TO n DO
BEGIN
cost [{i},i] := c 1i ;
bestpath[{i},i] := (1,i);
END;
FOR j := 2 TO n-1 DO
FOR EACH S ⊆ {2,3,…,n} mit |S| = j DO
FOR EACH i∈S DO
BEGIN
cost [S,i] := min k∈S-{i}{cost[S-{i},k ]+cki};
k soll die Stadt sein, die dieses Minimum erreicht;
bestpath[S,i] := bestpath[S-{i},k] concat (i);
END;
mincost := min k≠1 {cost[{2,3,…,n},k ]+c k1 };
k soll die Stadt sein, die dieses Minimum erreicht;
besttour := bestpath[{2,3,...,n},k ];
OUTPUT besttour;
END
Dabei geht der Algorithmus wie folgt vor: Um diese kürzesten Reisewege zu finden, löst der
Algorithmus ein allgemeineres Problem. S sei eine Untermenge der Stadtmenge, die alle
Städte bis auf Stadt 1 enthält, und i sei der Index einer Stadt dieser Menge. Für jedes S und
2
i soll ein (S,i)- Weg ein Weg sein, der bei Stadt 1 anfängt, jede Stadt in S genau einmal und
keine andere besucht, und bei Stadt i endet. cost[S,i] steht für die Länge eines kürzesten
(S, i)- Weges. ALGORITHMUS B baut also die Werte für cost[S,i] für immer größer werdende
Mengen S auf, bis cost[{2,3,...,n},i] erreicht wird für i = 2,3,...,n. Das Feld bestpat h wird
benutzt, um für jedes S und i einen Weg zu speichern, der cost[S,i] liefert.
Diese Technik, immer größer werdende Unterproblemlösungen zusammenzufügen, ist
weitverbreitet und wird als dynamisches Programmieren bezeichnet.
Ein verwandtes Problem zu TSP ist auch das folgende:
KÜRZESTER WEG
INSTANZ: ganze Zahl n = 3 und eine n×n Matrix C = (c ij ), wobei jedes c ij eine nichtnegative ganze Zahl ist (Bem.: jede rationale Zahl kann durch Multiplikation zu
einer ganzen Zahl umgewandelt werden).
FRAGE: Was ist ein kürzester Weg von Stadt 1 zu Stadt n?
ALGORITHMUS C
Input: Eine ganze Zahl n = 3 und eine n×n Distanzmatrix C besetzt mit nicht-negativen ganzen Zahlen.
Output: Ein kürzester Reiseweg von Stadt 1 zu Stadt n.
BEGIN
FOR i := 2 TO n DO
BEGIN
cost[i,1] := c 1i ;
bestpath[i,1] := (1,i )
END;
FOR j := 2 TO n DO
FOR i := 2 TO n DO
BEGIN
cost[i,j] := min k≠1,i {cost[k ,j-1]+c ki};
k soll die Stadt sein, die dieses Minimum erreicht;
bestpath[i,j] := bestpath[k ,j-1] concat (i);
IF cost[i,j-1] < cost[i,j] THEN
BEGIN
cost[i,j] := cost[i,j-1];
bestpath[i,j] := bestpath[i,j-1]
END
END;
OUTPUT bestpath[n,n-1]
END
ALGORITHMUS C erlaubt, dass Städte (außer Stadt 1 und n) besucht werden dürfen. Hier
wird cost[i,j] (für jede Stadt i ≠ 1 und j ≥ 1) definiert als die Länge des kürzesten Weges von
Stadt 1 zu i. Dabei enthält dieser Weg durch Ausschluss von wegverlängernden Städten
maximal j Kanten.
2.2. Laufzeitabschätzung
Um Algorithmen analysieren zu können, empfiehlt es sich, ihre Laufzeit durch eine Funktion
zu beschreiben, die die einzelnen Schritte zählt. Die sogenannte O- Notation drückt die
Laufzeitfunktion aus.
3
ALGORITHMUS A besitzt eine Laufzeit von O(n!), da die Hauptschleife (n-1)! Mal für jede
zyklische Permutation durchlaufen wird, und jede Schleife nochmals eine Laufzeit von O(n)
besitzt, um den nächsten Reiseweg zu generieren. Durch Multiplikation ergibt sich O(n!).
Im Vergleich zu ALGORITHMUS A hat sich die Laufzeit von ALGORITHMUS B stark verbessert
auf O(n²2n ).
In ALGORITHMUS C wird die innere Schleife, die eine Laufzeit von O(n) besitzt, (n-1)²- mal
durchlaufen. Daraus erhält ma n eine Laufzeit von O(n³).
2.4. Polynomialzeit
Um Algorithmen zu bewerten, hat es sich durchgesetzt, ihn als „gut“ zu bezeichnen, wenn
seine worst- case- Komplexität durch ein Polynom in n begrenzt ist. Das heißt, dass die
Laufzeit des Algorithmus für den ungünstigsten Fall nur O(nKonstante ) betragen darf.
ALGORITHMUS C erfüllt diese Bedingung und wird daher als „gut“ bezeichnet,
ALGORITHMUS A sowie ALGORITHMUS B dagegen nicht. Deren Laufzeit ist exponentiell.
Weswegen darin unterschieden wird, sollte durch folgendes klar werden: Für eine gegebene
exponentielle Funktion und eine polynomiale Funktion gibt es immer ein N, so dass für alle
n ≥ N die polynomiale Funktion besser abschneidet als die exponentielle Funktion, obwohl für
kleine n die Situation für die exponentielle Funktion besser ausgesehen haben mag. Auch
können Polynomialzeit- Algorithmen besser von der Computergeschwindigkeitsentwicklung
profitieren. Angenommen, ein Computer kann je ein Problem für n = 100 mit den zwei
Algorithmen mit den Laufzeitverhalten O( n³) und O(2n) in je einer Stunde lösen. Dann
könnte zum Beispiel ein neuer Computer, der doppelt so schnell arbeitet, in einer Stunde mit
dem Polynomialzeit- Algorithmus das Problem mit n = 126 lösen, hingegen mit dem
Exponentialzeit-Algorithmus nur mit n = 101. Der Beweis: 1003 ˜ (126 3 )/2 und
2100 = (2101)/2.
3. Die Klassen P und NP
3.1. Entscheidungsprobleme
Genauso wie man Algorithmen als „gut“ oder „schlecht“ bewerten kann abhängig davon, ob
ihr Laufzeitverhalten polynomiell begrenzt ist oder nicht, kann man ein Problem als „leicht“
oder „schwer“ einstufen abhängig davon, ob es einen Algorithmus gibt, der das Problem in
polynomieller Zeit lösen kann oder nicht.
Diese Theorie beschränkt sich auf Entscheidungsprobleme, d. h. Probleme, deren Antwort
entweder ein „ja“ oder „nein“ ist. Ein solches Entscheidungsproblem ist zum Beispiel das
graphentheoretische Hamilton-Kreis- Problem.
HAMILTON- KREIS
INSTANZ: Ein Graph G = (V,E).
FRAGE: Gibt es einen Kreis (eine geschlossene Sequenz von Kanten) in G, der durch
jeden Knoten in V genau einmal hindurch geht?
Das TSP selbst ist kein Entscheidungsproblem, kann aber einfach durch die Umformulierung
der Frage und die Einführung einer oberen Grenze B für die maximale Rundreiselänge darin
umgewandelt werden.
4
TSP ENTSCHEIDUNG
INSTANZ: Gegeben ist eine ganze Zahl n = 3 und eine n×n Matrix C = (c ij ), wobei
jedes c ij eine nicht - negative ganze Zahl ist.
FRAGE: Gibt es eine zyklische Permutation p der ganzen Zahlen von 1 bis n, so dass
∑ni=1 c ip(i) ≤ B ist?
Klar ist, wenn es für das TSP einen Polynomialzeit- Algorithmus gibt, dann gibt es auch einen
Polynomialzeit- Algorithmus für TSP ENTSCHEIDUNG gibt.
Der Algorithmus TSPTOUR generiert einen optimalen Reiseweg für jede TSP- Instanz, solange
das von ihm aufgerufene Unterprogramm TSPDECISION mit den Parametern n, C, B das
Problem TSP Entscheidung löst.
ALGORITHMUS TSPTOUR
Input: Eine ganze Zahl n = 3 und eine n×n Distanzmatrix C besetzt mit nicht-negativen ganzen Zahlen.
Output: Eine neue Matrix C, in der alle bis auf n Einträge erhöht wurden auf n maxi,j {c ij } + 1. Die n
belassenen Einträge liefern die Kanten, die in dem optimalen Reiseweg enthalten sind.
BEGIN
low := 0;
high := n maxi,j {c ij } + 1;
WHILE low ≠ high DO
IF tspdecision (n, C, (low + high) / 2) = ‘ja’
THEN high := (low + high) / 2)
ELSE low := (low + high) / 2) + 1;
COMMENT Nun sind low = high und ihr Wert entspricht den Kosten des optimalen Reiseweges;
optimum := high;
FOR i := 1 TO n DO
FOR j := 1 TO n DO
BEGIN
remember := c ij ;
c ij := n maxi,j {cij} + 1;
IF tspdecision(n, C, optimum) = ‘nein’
THEN cij := remember
END
END
Im ersten Teil von TSPTOUR wird mit Hilfe der binären Suche die Länge des optimalen
Reiseweges ermittelt, der länger als 0 und kürzer als n ⋅ maxi,j {c ij } + 1 ist. Die Anzahl der
Iterationsschritte beträgt maximal log2 (nc max ). Anschließend ist bekannt, wie lang der
optimale Reiseweg ist, aber nicht, wie er verläuft.
Im zweiten Teil wird die Länge jeder Stadtverbindungstrecke c ij zwischengespeichert und
danach auf n ⋅ maxi,j {c ij } + 1 erhöht. Sollte es an diesem Punkt immer noch einen Reiseweg
geben, der die optimale Länge besitzt, kann man davon ausgehen, dass das veränderte c ij
nicht zum optimalen Reiseweg gehört. Andernfalls setzt man veränderte c ij wieder auf den
zwischengespeicherten Wert zurück.
Am Ende erhält man die veränderte Distanzmatrix. Die n Einträge c ij, die unverändert
blieben, ergeben nun den optimalen Reiseweg.
5
Die Laufzeit von TSPTOUR ist abhängig von TSPDECISION, welches log2 (ncmax ) + n²
aufgerufen wird. Dies ist eine polynomiale Funktion. Daraus kann man folgern: Für TSPTOUR
gibt es einen Polynomialzeit- Algorithmus, wenn und nur genau dann wenn es für
TSPDECISION einen Polynomialzeit- Algorithmus gibt.
3.2. Charakterisierung der Klassen P und N P
Eine der beiden Klassen de r Entscheidungsprobleme ist die Klasse P. Diese Klasse enthält all
jene Entscheidungsprobleme, für die ein Polynomialzeit - Algorithmus existiert.
Eine andere Klasse ist NP (steht für Nichtdeterministische Polynomialzeit). Man kann die
Charakteristiken eines Problems in drei verschiedenen aber äquivalenten Formulierungen
darstellen, zwei davon sollen hier von Bedeutung sein.
Die erste Definition beschäftigt sich mit der Eigenschaft des prägnanten Zertifikats. Jede
„Ja“- Instanz eines Problems (z.B. ein Graph hat einen Hamilton- Kreis; eine Distanzmatrix,
deren optimale Weglänge geringer ist als eine gegebene obere Grenze B) hat eine solche
Eigenschaft, d.h. es gibt ein Zertifikat, das jene Instanz als eine „Ja-Instanz“ bestätigt. Es
muss einen Polynomialzeit- Algorithmus geben, der das Zertifikat auf seine Richtigkeit
überprüft. Alle „Ja“- Instanzen müssen zumindest ein solches Zertifikat besitzen, aber nie
eine „Nein“-Instanz.
Eine zweite Definition enthält das Konzept eines nichtdeterministischen Algorithmus, der
„unrealistisch“ aber trotzdem hilfreich ist. Im Vergleich zu einem normalen Algorithmus
unterscheidet er sich nur durch den zusätzlichen Befehl
go to both label_1, label_2.
Wie auf der folgenden Grafik ersichtlich, können sich Berechnungen an jeder Stelle in zwei
parallele Prozesse (label_1 und label_2) aufteilen, so dass sich eine Baumform ergibt.
Sobald eine der Verzweigungen ein „Ja“ zurückgibt, dann antwortet der gesamte
nichtdeterministische Algorithmus mit „Ja“. Analog ist die Antwort ein „Nein“, wenn keiner
der Verzweigungen ein „Ja“ zurückgibt.
6
Ein nichtdeterministischer Algorithmus löst ein Problem in polynomieller Zeit, wenn er (1) für
jede Instanz die korrekte Antwort gibt und (2) die Schrittanzahl, die die erste der
Verzweigungen braucht, um ein „Ja“ zurückzugeben, polynomiell begrenzt wird (siehe auch
Grafik).
Bedeutend ist zudem, ob P = NP gilt, denn offensichtlich ist P ⊆ NP. Es erscheint ziemlich
unwahrscheinlich, dass man deterministisch einen nichtdeterministischen Algorithmus
simulieren kann, ohne mehr als eine polynomielle Zeit zu investieren: Die Simulation selbst
erfordert zunächst eine exponentielle Zeit, da ein nichtdeterministischer Algorithmus bereits
nach einer polynomialen Anzahl von nichtdeterministischen Schritten eine exponentielle
Anzahl von parallelen Berechnungen hat. Zudem haben sich Forscher über Jahre hinweg
damit beschäftigt, Polynomialzeit- Algorithmen für bestimmte Probleme in NP wie das TSP zu
finden. Man wäre sehr überrascht, wenn P = NP gelten würde. So geht man heute davon
aus, dass P ≠ NP ist, obwohl man noch keinen Beweis dafür gefunden hat.
Da TSP ENTSCHEIDUNG und viele andere Spezialfälle und Verallgemeinerungen von TSP in
NP liegen, ist nicht davon auszugehen, dass TSP in polynomieller Zeit lösbar ist und TSP
daher „schwer“ ist.
4. Literatur
•
•
E. L. Lawler, J. K. Lenstra, A. H. G. Rinnooy Kann, D. B. Shmoys (1985). The
Traveling Salesman Problem. John Wiley & Sons Ltd. 1- 15, 37- 84
Internet (http://users.forthnet.gr/ath/kimon/CC/CCC1b.htm, Part A - D)
7
Herunterladen