Routenplanung & Komplexität Lernziele • Sie haben den Dijkstra-Algorithmus nachvollzogen. • Sie haben das Konzept der Komplexität eines Algorithmus verstanden. • Sie haben die Komplexität des DijkstraAlgorithmus abgeschätzt. • Sie können auch für andere Probleme die Komplexität (in O-Notation) abschätzen Routenplanung Es geht darum, anhand einer Strassenkarte den kürzesten Weg zwischen zwei Orten zu finden Edsger Dijkstra fand schon 1956 eine effiziente Lösung für dieses Problem, die auch heute noch in den meisten Navigationsgeräten Anwendung findet Was ist ein Algorithmus? (= Reduzierung des Problems auf das Wesentliche) Schritt 1: Abstraktion Schritt 2: Lösung?! • Es gibt eine sehr simple, aber nicht besonders schlaue Lösung für das Problem mit dem kürzesten Weg: Brute Force • Diese Methode funktioniert übrigens bei vielen Problemen, und wird doch fast nie angewandt – später sehen wir, warum Es gibt bessere Lösungen • ... aber wie? • Idee??? Schritt 2: Grundidee Ameisen bewegen sich mit konstanter Geschwindigkeit entlang des Graphen und markieren dabei ihren Weg •Ausgehend vom Startort •Aufspaltung an jeder Kreuzung •Bereits markierte Wege werden verworfen •Wer zuerst den Zielort erreicht hat den kürzesten Weg gefunden Dijkstras Algorithmus • ... ist eine Variante der Ameisenidee • Warum Variante? – weil Computer seriell arbeiten – weil man noch ein kleines bisschen optimieren kann • Wie genau es funktioniert? – routeplanner_3.pdf – mit Stift nachvollziehen Ergebnis: allerdings mit einem Fehler! Schritt 3: Formalisieren Beispielsweise als •Flow Chart •Pseudocode •Struktogramm – s. Arbeitsblätter Aufgabe Schauen Sie sich den Algorithmus nochmals an. Welche Werte müssen Sie sich von jedem Knoten aufschreiben, wenn Sie bei der Lösung des Algorithmus nicht auf die vorliegende Karte schreiben dürfen? Aufgabe: 1.Bestimmen sie eines der Hotels (gelbe Knoten) als Startpunkt 2.Erstellen Sie eine Distanztabelle für die Strecken zu allen anderen Hotels (Lösungen für A, G & K im pdf) Schritt 4: Analysieren • Ist das ein guter Algorithmus? • Ist er besser als ein Anderer? – Immer? – In speziellen Fällen? • Lohnt es sich, ihn zu implementieren? Komplexität & Big-O-Notation Das Problem des Handlungsreisenden (travelling salesman): Berechne die kürzeste Strecke, die durch mehrere vorgegebene Orte führt Komplexitätsabschätzung Es geht um asymptotische Laufzeit (Speicherbedarf) Abschätzen, wie sich der Rechenaufwand eines Algorithmus im ungünstigsten Fall mit immer grösser werdenden Eingaben verändert Laufzeitabschätzung Wir betrachten, wie viele Schritte im Algorithmus abgearbeitet werden müssen - abhängig von der Menge der Eingabedaten. Beispiel 1: Wir haben eine Namensliste und wollen wissen, ob ein bestimmter Name darin vorkommt. UND JETZT? Kerim Alexandra Lorenz Julian Samuel Niruban Aymar Joël Slavko Manuel Nathanael Anselm Niko Laufzeitabschätzung 1) Lösung (Algorithmus) finden 2) Für den ungünstigsten Fall (worst case) durchspielen 3) Laufzeit abschätzen (O-Notation) Kerim Alexandra Lorenz Julian Samuel Niruban Aymar Joël Slavko Manuel Nathanael Anselm Niko Algorithmus Lineare Suche • Worst case? • Laufzeit – – – – n = 10? n = 20? n = 100? allgemein? O(n) (n verdoppeln verdoppelt Laufzeit) Laufzeitabschätzung Wir betrachten, wie viele Schritte im Algorithmus abgearbeitet werden müssen - abhängig von der Menge der Eingabedaten. Beispiel 2: Wir haben eine Namensliste und wollen wissen, ob ein Name darin doppelt vorkommt. Allgemeine Laufzeit? Kerim Alexandra Lorenz Julian Samuel Niruban Aymar Joël Slavko Manuel Nathanael Anselm Niko O-Notation Wir betrachten, wie sich die Schrittanzahl im Algorithmus für eine sehr grosse Anzahl von Eingabedaten verhält („obere Schranke“ für Worst Case). Beispiel Namensliste: Für n Eingabedaten brauchen wir sicher nicht mehr als n (n 1) (n-1)+(n-2)+…+(1) = Schritte. 2 Schreibweise: Laufzeit_Namensliste = O(n2) O-Notation Vereinfachungsregeln: Addition f(n) = n + 3 ⇒ O(n) f(n) = n2 + 3n ⇒ O(n2) Multiplikation f(n) = 3n ⇒ O(n) f(n) = n2 * 3n ⇒ O(n3) Konstante Summanden werden vernachlässigt Es zählt der Summand mit dem stärkeren Wachstum Konstante Faktoren werden vernachlässigt Es zählt die Summe der Exponenten Aufgaben (s. ABKomplexität1.doc) 1. Wir wollen einen quadratischen Rasen mähen, die Länge einer Seite ist n. Zu welcher Komplexitätsklasse gehört das Rasenmähen? 2. Wir wollen eine n-stöckige Pyramide aus GetränkeKisten bauen. Wie lautet die Laufzeit in O-Notation? 3. Sie haben das Bier für die Party schon gekauft, n ist die Anzahl der Gäste. Saufzeit in O-Notation? Turm von Hanoi (original mit 64 Scheiben) Anzahl Züge: 3 Scheiben 7 Züge n Scheiben 2n-1 Züge Komplexitätsabschätzung Wie verhält sich die asymptotische Laufzeit für folgende Algorithmen? (wie ändert sich die Anzahl der Rechenschritte, wenn man die Anzahl der Elemente im Array verdoppelt) 1.Suchen eines Elements im Array 2.Sortieren der Elemente des Arrays 3.Alle möglichen Permutationen ausgeben Komplexitätsabschätzung Es geht um asymptotische Laufzeit (Speicherbedarf) Abschätzen, wie sich der Rechenaufwand eines Algorithmus im ungünstigsten Fall mit immer grösser werdenden Eingaben verändert Berechenbarkeit von Algorithmen Ein Computer ist eine universelle Rechenmaschine, er kann alles berechnen, was berechenbar ist. prinzipiell 1. Gibt es auch Probleme, nicht berechenbar die nicht berechenbar sind? prinzipiell 2. Kann alles, was berechenbar, praktisch theoretisch berechenbar nicht ist, auch tatsächlich berechnet werden? was heisst hier „praktisch“? praktisch berechenbar Komplexitätsklassen 3000 2500 2000 O(1) - konstant O(log(n)) - logarithmisch O(n) - linear O(n*log(n)) - loglinear O(n^2) - quadratisch O(n^k) - polinomial O(k^n) - exponenziell O(n!) - fakultät 1500 1000 500 0 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 n Komplexitätsklassen 1000000 O(1) - konstant O(log(n)) - logarithmisch O(n) - linear O(n*log(n)) - loglinear O(n^2) - quadratisch O(n^k) - polinomial O(k^n) - exponenziell O(n!) - fakultät 900000 800000 700000 600000 500000 noch praktikabel nicht mehr praktikabel 400000 300000 200000 100000 0 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 n Berechenbarkeit von Algorithmen Die nicht-polinomialen Algorithmen (NP): Sind praktisch nicht lösbar, prinzipiell für etwas grössere n. nicht berechenbar 1. Gibt es keine schnellere Lösung, oder haben wir NP-h NP-v nur noch keine gefunden? Und: Für die grosse Familie der NP-vollständigen Probleme muss diese Frage nur an einem einzige Beispiel beantwortet werden! NP? ... P NP-vollständige Probleme nicht berechen bar NP P • Sie sind entscheidbar (=berechenbar). • Sie besitzen Lösungen in exponentieller Zeit. • Für keines dieser Problem wurde je ein Algorithmus mit Polynomialzeit gefunden. • Niemand konnte bisher beweisen, ob sie exponentielle Zeit benötigen müssen. • Alle diese Probleme sind miteinander verwandt: – Sollte jemals für ein einziges Problem ein Algorithmus mit Polynomialzeit gefunden werden, dann ergäben sich sofort Polynomialzeit-Algorithmen für alle anderen Probleme. – Umgekehrt gilt das allerdings auch (Beweis, dass NP≠P) http://en.wikipedia.org/wiki/List_of_NP-complete_problems P == NP ? Das P-NP-Problem gilt als eines der wichtigsten offenen Probleme der Informatik und wurde vom Clay Mathematics Institute in die Liste der Millennium-Probleme aufgenommen – auf seine Lösung ist eine Preis von 1 Million $ ausgesetzt. Frage: Rein finanziell gesehen wäre man bescheuert, den Preis in Anspruch zu nehmen, falls man einen Beweis für die Vermutung P == NP gefunden hätte. Warum? Verstanden? • Formulieren Sie mit eigenen Worten: 1. Wie ist die Problemklasse P definiert? 2. Wie ist die Problemklasse NP definiert? Verstehen sie den Witz jetzt besser? Das Problem des Handlungsreisenden (travelling salesman) http://en.wikipedia.org/wiki/List_of_NP-complete_problems Komplexitätsabschätzung Es geht um asymptotische Laufzeit (Speicherbedarf) Abschätzen, wie sich der Rechenaufwand eines Algorithmus im ungünstigsten Fall mit immer grösser werdenden Eingaben verändert Vollständige Wege in Graphen 30 Wege von S aus: 2 Wege (2 x 2 Schritte) 1. Sag' mir wohin ... Wenn Sie versucht haben, die Lösung zeichnerisch zu bestimmen, werden Sie bereits gemerkt haben, wie viel länger die Suche dauert, wenn auch nur ein Knoten hinzukommt. Man kann die Anzahl der Möglichkeiten auch rechnerisch bestimmen: Für den Graphen mit vier Knoten gilt, dass man ihn aus zwei Komponenten zusammensetzen kann: ein einzelner Knoten ( S ) plus ein Graph mit drei Knoten. (leer) kann dann mit dem Graphen verbunden werden, wie in Abbildung 1.27 dargestellt. 3 Wege in den 3er-Graphenvon: 3 x 2 Wege (6 x 3 Schr.) Abbildung 1.27 ( S ) kann auf drei Arten mit dem vorhandenen Graphen verbunden werden Möglichkeiten bei noch mehr Knoten: 3 x 2 Wege (x 3) 4 x 6 Wege (x 4) 5 x 24 Wege (x 5) 6 x 102 Wege (x 6) (n-1)(n-1)! Schritte = O(n!) Da der „bekannte" Graph drei Knoten besitzt, kann vom „neuen Knoten ( S )" auf drei Arten ein Weg zum bekannten Graphen begonnen werden, nämlich jeweils zu einem der Knoten. Stellen Sie sich vor, dass im 3er-Graphen dann auf die bereits ermittelte Weise ein Weg gesucht wird. Daher ist die Anzahl möglicher Wege im 4er-Graphen 3 - 2 = 6. Für den 5er-Graphen gibt es also vier Möglichkeiten, Wege vom neuen Knoten zum 4er-Graphen zu beginnen. Die Anzahl der Wege insgesamt beträgt daher 4 • 6 = 24. Auf diese Weise kann man ableiten, dass in einem vollständigen Graphen mit n Knoten (n-1)! verschiedene Wege von einem gesetzten Startpunkt ausgehen. Da für jeden der Wege n-1 Streckenabschnitte eingerechnet werden müssen, bedarf es für den Brute-Force-Algorithmus ungefähr (n-l)(n-l)! Berechnungen, um den kürzesten Weg zu finden. Die folgende Tabelle enthält die Anzahlen für ein paar Problemgrössen. # Knoten Schritte 3 4 4 18 5 96 6 600 # Knoten Schritte 9 322’560 10 3'265’920 15 1'220'496'076’800 20 2'311'256'907'767'808’000 In diesem Fall wächst der Aufwand zur Lösung exponentiell an, das bedeutet, wen n die Problemgrösse ist, kann man den Aufwand nur noch mit xn nach oben h abschätzen (mit einem beliebigen x). Dijkstra: keine doppelten Wege Optimal wäre ein linearer Aufwand, das bedeutet, dass zur Lösung eines Problem der Grösse n der Aufwand x • n beträgt (mit konstantem x). Leider gibt es kau Algorithmen, die so gut sind. Betrachten wir einmal den von Dijkstra: Vom Startknoten aus werden alle benachbarten Knoten (also die, zu denen ei Verbindung besteht) betrachtet. Bei einem vollständigen Graphen mit n Knot sind das (n-1). Ein Beispiel mit 7 Knoten sehen Sie in Abbildung 1.29. • Alle Wege von S aus, danach ist S aus dem Rennen • Im verkleinerten Graphen wird der näheste Knoten zu S und das Ganze von vorn... (n-1) + (n-2) + (n-3) + ... + 1 n2/2 Bei nicht vollständig verknüpften Graphen und geschickter Implementierung: O(n x log(n)) O(n2) Danach ist der Startknoten vollständig „aus dem Rennen", er wird nicht me betrachtet. Nun wird der Knoten mit der kleinsten Markierung gesucht un von dort geht es wiederum zu allen benachbarten Knoten - das sind (n-2). D nach ist auch dieser „aus dem Rennen". Dies setzt sich fort. Daher ist der Aufwand für den Dijkstra-Algorithmus (n -1 ) + (n -2) + ( n-3) + .. . + (1 ) Wir können dies wiederum in einer Tabelle dokumentieren. # Knoten Schritte 3 3 4 6 5 10 6 15 7 21 # Knoten Schritte 9 36 10 45 15 105 20 190 50 4'950 Welche Komplexität hat Routenplanung ... • mit „brute force“? O(n!), also NP • mit dem Dijkstra Algorithmus? O(n2), also P genauer: O(n2/2), wenn der Graph nicht voll verbunden und der Algorithmus geschickter implementiert ist sogar nur O(n*log(n)) Binäre Suche; O(log(n))