7.3.3 Kürzeste Wege (Shortest path) - inf.fu- · PDF fileHeuristik: "Kunst zu finden"....
Click here to load reader
Transcript of 7.3.3 Kürzeste Wege (Shortest path) - inf.fu- · PDF fileHeuristik: "Kunst zu finden"....
1
hs / fub – alp3-26-Graph-2 1
7.3.3 Kürzeste Wege (7.3.3 Kürzeste Wege (Shortest pathShortest path))
�Aufgabe Finde in gerichtetem, kantengewichtetem GraphenG=(V,E) , w: E -> Real, einen Weg s = x0,x2,...,xn=y von s nach y mit minimaler Summe der Kantenkosten*: d(s,y) := Σ w((xi,xi+1)) minimal unter allen Wegen p von s nach y
i=0..n-1Algorithmus auch für gerichtete und ungerichtete Graphen
geeignet.
�Viele Anwendungen:� Routenplaner�Verdrahtung von Platinen�Optimale Weg aus Labyrinth�Spiele....
* Kosten = Gewicht f
S
b
c
d
e
10
9
15
10
2
3
4
3
hs / fub – alp3-26-Graph-2 2
Kürzeste Wege: KlassifikationKürzeste Wege: Klassifikation
�Kürzester Weg s-> y (Single pair shortest path)
�Alle kürzesten Wege von s zu beliebigem Knoten x(single source shortest path)
�Alle kürzesten Wege von beliebigem Startknoten zu einem Zielknoten y (single destination shortest path)-> auf zweites Problem zurückführen: alle Richtungen umkehren!
�Alle Paare von kürzesten Wegen (all pairs shortest path)
"Kürzeste Wege" und "Alle kürzesten Wege"sind gleich aufwendig!
2
hs / fub – alp3-26-Graph-2 3
Kürzeste WegeKürzeste Wege
�Kantengewichtung ...
1.0
2.0
1.0
-4.0
s
�... sollte nicht negativ sein?!�Kürzeste-Wege-Problem nicht wohldefiniert, wenn es
einen Zyklus mit negativer Kantensumme gibt, der von s erreichbar ist�Annahme hier: positive Kantengewichte
hs / fub – alp3-26-Graph-2 4
Kürzeste PfadeKürzeste Pfade
�Eigenschaften von Wegen�Wenn kürzester Weg p zu einem Knoten
gefunden, dann auch kürzeste Wege zu allen Knoten auf p.Im Beispiel: mit (S->f) auch kürzesten Weg S -> e)
f
S
b
c
d
e
10
9
15
10
2
3
4
3
xy
zy'
�Allgemein:x-> y-> z kürzester Pfad, dann x -> y kürzester Pfadklar, sonst : wenn x->y' kürzer als x->y dann x->y'->y->z kürzer als x->y->z
∈
3
hs / fub – alp3-26-Graph-2 5
Kürzeste Wege: EigenschaftenKürzeste Wege: Eigenschaften
y'
z
� Allgemein:d(x,y') > d(x,y ) +w((y ,y'))dann ist x -> y' kein Teilpfaddes kürzesten Weges von xnach z
x
y
f
s
b
c
d
e
10
9
15
10
2
3
4
3
Teilpfade (s , d , e) von snach f mit Kosten d(s,e) = 19und (s, b, c) , Kosten d(s,c) = 13und w((c,e) + d(s,c) < d(se)⇒(s,d,e) sicher nicht Teil eines möglicherweise kürzesten Weges (s -,e, f)
� Idee für Algorithmus:Anfangsstücke p= (s,..., y') für Weg nach s finden. Stößt man auf kürzerem Weg p' auf den
gleichen Knoten y' dann ist p obsolet.
hs / fub – alp3-26-Graph-2 6
Kürzeste Wege: Kürzeste Wege: RelaxationRelaxation
� Idee für Algorithmus:Anfangsstücke wk=( x,..., k) für Weg zum Ziel finden.
Stößt man auf kürzerem Weg w = (x -> y) ->y' auf den gleichen Knoten y' zu dem Pfad w'= x -> y' bekannt ist, dann ist w' obsolet.
xyd = 7
y'd= 10
y''d=12 y'''
d=10
w'
w''w'''
w
w(y,y')=2
xy
y' y'' y'''
w'
w''w'''
w
y'd= 9
d = 7
Wird meist Relaxation ("Abschwächung") genannt
4
hs / fub – alp3-26-Graph-2 7
Kürzeste PfadeKürzeste Pfade
� Auswahl des zu verfolgenden Anfangsstücks
xy
zy' y'' y'''
w'
w''w'''
w Weg mit d(x,y'')+d(y'',y) < d(x,y) existiert nicht
f
s
b
c
d
e
10
9
15
10
2
3
4
3
Bei d oder b fortsetzen?
Bisher kürzester Weg nach d: 9d((s,b,d) = d((s,b)) + w(b,d) > 9
=> bisher gefundener kürzester Weg von s nach d ist der Kürzeste !
Allgemein: Immer den bisher kürzesten fortsetzen!
hs / fub – alp3-26-Graph-2 8
Kürzeste PfadeKürzeste Pfade
s = x->y minimal unter allen bisherigen Wegen s', s'',...., dann ist s Weg minimaler Länge von x nach y.
Also: wenn man unter den bisherigen Wegen denminimalen x->y fortsetzt (nach z), hat man den minimalen Weg s->y gefunden.
Achtung: gilt nicht, wenn negative Kantengewichte zugelassen.
Idee: kostengesteuerte Breitensuche- Menge P aller kürzesten Wege x -> y und deren Kosten
schrittweise aufbauen, jeweils kürzesten expandieren ("verlängern")
- bereits ermittelte kürzeste Pfadein Menge SP merken
5
Algorithmus von Algorithmus von DijkstraDijkstra**
Idee: Kostengesteuerte BreitensucheSP={}; P = {(a->a; 0) } // StartknotenSolange q nicht P nicht leer:
expandiere q = (x->y) mit minimale Gesamtkosten aller q' aus P hat
q = (x-> y) expandieren:für alle Nachfolger z von y {
Fall1: (x->z) nicht in P: P = P ∪ (x-> z) // Pfad nach z gefundenFall2: (x->z) in SP: weiter mit nächstem Nachbarn // kürzester
// Weg nach z schon bekannt.Fall3: p = (x -> z) in P und d(p) > d(q') + w(e,z)
P = P \ {p} ∪ {(x -> y->z) // kürzeren Pfad nach z wählen }SP= SP ∪ {(x->e, d(x,e)) // kürzesten Pfad nach x gefunden
*Edgar W. Dijkstra, berühmter holländischer Informatiker, *1930, 2002 +
a
b
c
d
e
f
10
9
15
10
2
3
4
3
Gieriger (greedy)Algorithmus
hs / fub – alp3-26-Graph-2 10
KnotenzuständeKnotenzustände
a
cd
e
f
9
15
10
2
3
4
3
10Drei Zustände derKnoten:
- bisher nicht besucht- besucht, nicht expandiert- kürzester Weg zu diesem
Knoten gefunden.
b
6
hs / fub – alp3-26-Graph-2 11
DijkstraDijkstra--Algorithmus: BeispielAlgorithmus: Beispiel
SP: hier Menge der von a ausgehendenminimalen Wege ,andere Weg in P
1. P = {(ab;10), (ad;9)} SP = {(ad;9)}
2. P = {(ab;10), (ad,e;19), (adf, 24)} SP = {(ad;9), (ab;10)}
3. P = {(abd;12),(abc;13), (ade;19), (adf; 24)}SP = {(ad;9), (ab;10) (abc;13)}
4. P = {(abce;17), (ade;19), (adf; 24)}SP = {(ad;9), (ab;10), (abc;13), (abce;17)}
5. P = {(abcef;20), (adf; 24)}SP = {(ad;9), (ab;10), (abc;13), (abce;17)}
6. P = {}SP = {(ad;9), (ab;10), (abc;13), (abce;17), (abcef;20)}
a
b
cd
e
10
9
15
10
2
3
4
3
hs / fub – alp3-26-Graph-2 12
DijkstraDijkstra--Algorithmus: BeispielAlgorithmus: Beispiel
� Pfade repräsentieren?Ausreichend, den Endknoten des bisher ermittelten Pfades p und die Kosten d(p) zu speichern.
� Im Beispiel: Po = {(a,0)}SP0 = { } P1 = {(d,9), (b,10)}SP1 = {(a,0)}P2 = { (b,10), (e,19), (f,24) }SP2 = {(a,0), (d,9)}P3 = {(c,13),(e,19), (f,24) , }SP3 = {(a,0), (d,9), (b,10)}P4 = {(e,17), (f,24) , }SP4 = {(a,0), (d,9), (b,10), (c,13)}P5 = { (f,20) }SP5 = {(a,0), (d,9), (b,10), (c,13)(e,17)}P6 = {}
SP6 = {(a,0), (d,9), (b,10), (c,13)(e,17) ,(f,20) }
a
b
cd
e
10
9
15
10
2
3
4
3
7
DijkstraDijkstra--AlgorithmusAlgorithmusBestimmung der gewichteten Weglänge x -> y für alle Knoten y
SP'={ (y, d, minimal)| y Knoten von G(V,E), y.d = ∞, minimal = false};x.d : Gewicht des bisher gewichtsminimalen Weges x -> y, boolean minimal: true wenn kürzester Weg x->y gefunden
void shortestPath(node s) {heap h = new...; // z.B.Min-heapfor all node y {h.enqueue(y);y.d = INFINITE} //s.d=0;
while (!h.empty) {y = h.dequeueMin; //node with minimal path up to nowy.minimal = true; // colour = green; min cost
// d(s,y)found
for each z = y.successor //relax
if(y.d + w((y,z)) < z.d) z.d=y.d + w((y,z));// shorter path found
} // Min cost d(s,e) for all nodes e
hs / fub – alp3-26-Graph-2 14
Kürzeste Wege (Kürzeste Wege (DijkstraDijkstra))
�Baumdarstellung
Wenn x bei Expansion gefunden wird (Blaufärbung):Vorgänger y von x merken; y durch y' ersetzen, wenn durch Relaxation kürzerer Weg über y' gefunden.
b
cd
e
10
d 9
a
b 10
f 24e 19 c 13
e 17
f 20
1 2
3 4 5
6
7
a
9
15
10
2
3
4
3
8
hs / fub – alp3-26-Graph-2 15
Kürzeste Wege (Kürzeste Wege (DijkstraDijkstra): Laufzeit): Laufzeit
�Jeder Knoten genau einmal in Prioritätsschlange: O(V*log V)�Je einmal pro Knoten Nachfolger bestimmen: O(E) für Adjazenzliste
=> O(E) + O(V*log V) + O("Verwaltung des heap bei Expansion") Schlechtester Fall: jede Verlängerung
eines Weges um Kante (x,z) liefert neue Weglänge s->z: O(E) Veränderungen
mit Aufwand O(log V) obere Schranke im schlechtesten FallO(E)+ O(V * log V)) + O(E*(log V)) = O((V+E ) * log V)
Abhängig von Implementierung der Verwaltungsdatenstrukturen!... und Graph-Implementierung.
hs / fub – alp3-26-Graph-2 16
Kürzeste Wege (Kürzeste Wege (DijkstraDijkstra): Laufzeit): Laufzeit
Abhängigkeit von Datenstrukturen� Prioritätsschlange als Feld (ungeordnet):
O(V) + V*O(V) + O(E) * O(1)
Knoten in Prio-Schlange V* Suchen des Minimumzur Expansion
Verändern derbisherigen Kosten, direkter Feldzugriff
Gesamtlaufzeit O(V2)
Beachte: Anzahl Kanten E <= V2 , also Algorithmus linear in der Anzahl Kanten.
9
hs / fub – alp3-26-Graph-2 17
Kürzeste Wege in GraphenKürzeste Wege in Graphen
� "Single source shortest path" mit Dijkstra –Alg. gelöst für positive Kantenkosten, damit auch "single pair shortest path".
�Algorithmus bekannt für beliebige Kantenkosten,Graph ohne negativen Zyklen: O(E*V).
� "All pairs" – Problem: O(V3) – Algorithmus bekannt.
Annahme bisher: - keine Zusatzinformation verfügbar- Graph liegt in expliziter Form vor
hs / fub – alp3-26-Graph-2 18
Routenplaner Graph
21
3 4
5
1 2
43
5
10
hs / fub – alp3-26-Graph-2 19
BreadthBreadth--first Search (cont’d)first Search (cont’d)(Branching Factor = 3)(Branching Factor = 3)
1020 TB1013 102450
10 MB100 sec10510
1 MB10 sec1048
100 kB1 sec1036
12 kB.1 sec1214
1 kB13 ms132
100 B1 ms10
MemoryTimeNodesDepth
Platzbedarf kritischer als Laufzeit! US-Straßenkarte: Tiefe ungefähr 3000)
Aus Artificial Intelligence: A Modern Approach, Stuart Russell and Peter Norvig,
Upper Saddle River, NJ: Prentice Hall, c. 1995
hs / fub – alp3-26-Graph-2 20
Analoges Problem: Graphrepräsentation von SpielenAnaloges Problem: Graphrepräsentation von Spielen
� n x n Puzzle
87
654
321
84
675
213
....
845
67
213
84
675
213
Viele implizite Knoten: das sind alle erlaubten Zustände.
Nachfolger: erlaubte Züge.Hier: Stein schieben
11
hs / fub – alp3-26-Graph-2 21
Kürzeste Wege: HeuristikenKürzeste Wege: Heuristiken
�Sehr große Knotenzahlen, evtl. implizit�Dijkstra – Algorithmus nicht anwendbar�Einschränkung auf "single pair shortest path"�Bringt das was?? Gleiche asymptotische Laufzeit !?�Ja: heuristische Schätzung der Entfernung vom
Zielknoten einführen
Heuristik: "Kunst zu finden".
Ziel z
Bisheriger WegLänge w(xi) mit Kosten d(s,xi)
Geschätzte Entfernung vom Ziel: h(xi,z)
x1
x2 xi xn
h(x1) h(xn)
s
hs / fub – alp3-26-Graph-2 22
Heuristische Wegsuche Heuristische Wegsuche
�A*-Algorithmus�Ziel: finde gewichts-(kosten-)minimalen Weg von Startknoten szum Zielknoten z.�Voraussetzung: für jeden Knoten x ist eine optimistische Schätzfunktion h(x,z) für den Weg x -> z gegeben.Seien d(x,t) die (unbekannten) tatsächlichen Kosten,h heißt optimistisch, wenn h(x,t) <= d(x,t) "Optimistisch: Kosten werden unterschätzt"
�Es existiert immer eine optimistische Schätzfunktion: Für alle x: h(x,t) = 0
�Ist x ein Knoten, zu dem ein Weg s -> x gefunden wurde, dann seien die (nicht notwendig minimalen) Kosten d(s,x)
12
hs / fub – alp3-26-Graph-2 23
Heuristische SucheHeuristische Suche
�A*-Algorithmus: analog Dijkstra mit Kostenfunktion
f(s,t) = d(s,x) + h(x,t) Kosten = tatsächliche des zurückgelegten Weges
plus Schätzung für den Restweg.
�Änderung Dijkstra-Algorithmus: wenn f(s,t) = d(s,x) + h(x,t) minimal, muss d(s,x)
NICHT minimal sein. Folge: auch zu Knoten, die schon expandiert wurden, kann evtl. günstigerer Weg gefunden werden. Technisch: kein Knoten darf von queue entfernt werden.
� Gefundener Weg minimal, wenn h optimistisch
hs / fub – alp3-26-Graph-2 24
Heuristische SucheHeuristische Suche
�Routenplaner�Heuristische Schätzfunktion:
Euklidische Distanz h (x,z) zum Ziel. �h ist monoton: h(x,z) <= d(x,x') + h(x',z) �monotone Schätzfunktionen
sind optimistisch.
�Weitere wichtige Heuristik:- Wegepräferenz:
"Autobahn > Landstraße"- Zeit- / Weglängenoptimierung
xx'
z
h(x,z)