O(n!) - nicolasruh

Werbung
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
Struktogramme
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
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 markieren,
einen gehen, danach ist S aus
dem Rennen
• Im verkleinerten Graphen wird
der besuchte 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
O(n2)
geschickter Implementierung: O(n x log(n))
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))
Herunterladen