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