Kortste Paden
Toepassingen Kevin Bacon getal Six degrees of separation Heeft een netwerk de small-world eigenschap? TomTom / Google Maps 2
Kortste paden Gerichte graaf G=(N,A), en een lengte L(v,w) voor elke pijl (v,w) in A. Knopen x, y in N. Probleem: gegeven G, L, x, y, wat is de afstand van x naar y? Wat is het kortste pad? Afstand: som van pijllengtes 3 d(x,y) x 3 a 2 b 5 4 3 1 c 3 d 1 y
Over de definitie Ongerichte grafen Vervang elke kant door twee pijlen en los probleem op gerichte graaf op Negatieve pijl-lengtes vaak nuttig Sommige algoritmes werken alleen als alle lengtes niet-negatief zijn Bij negatieve lengtes kunnen er negatieve cycles zijn: kortste pad hoeft niet goed gedefinieerd te zijn dan 4
Versies All pairs shortest paths Bereken voor alle paren knopen v, w de kortste afstand van v naar w Single source shortest paths Gegeven knoop v, bereken voor elke knoop w de kortste afstand van v naar w Single target shortest paths Gegeven knoop w, bereken voor elke knoop v de kortste afstand van v naar w Single pair shortest path Gegeven knopen v en w, bereken de kortste afstand van v naar w. 5
Vandaag Single Source Shortest Path Dijkstra s algoritme Bellman-Ford All-Pairs Shortest Path Floyd-Warshall Dinsdag: verder met APSP Johnson s algoritme 6
Single source algoritmen Een startknoop s: wat is de afstand van s naar v, voor elke andere knoop v? Twee algoritmes: Dijkstra: sneller, alleen bij niet-negatieve pijllengtes Bellman-Ford: trager, werkt ook bij negatieve pijl-lengtes Maar niet bij negatieve cycles Beide gebruiken zelfde principe 7
Algemeen principe: relaxatie Elke knoop heeft een waarde D[v]: een schatting van de afstand d(s,v): Initieel: D[s]= 0; voor alle andere v: D[v] = Invariant van het algoritme: D[v] >= d(s,v) Idee: Relaxatie verlaagt de schattingen terwijl we wel de invariant in stand houden 8
Relaxatie We bekijken de mogelijkheid dat het kortste pad van s naar w via v en de pijl (v,w) gaat Relax (v,w) { (v,w) is een pijl in G} If D[w] > D[v] + L(v,w) Then D[w] = D[v]+ L(v,w) Behoudt invariant s v w 9
Algemeen principe: subpad optimaliteit Stel v 0, v 1,..., v k is een kortste pad van v 0 naar v k Dan voor iedere i < j, v i... v j is een kortste pad van v i naar v j v 0 v 1 v i v j v k-1 v k Als dit een kortste pad is, dan kan ik nergens afsnijden 10
DIJKSTRA S ALGORITME 11
Dijkstra s algoritme: De Wolk Bouw langzaam een verzameling knopen u waarvoor we zeker weten dat D[u] = d(s,u) De Wolk W Greedy algoritme voegt in iedere stap knoop toe aan De Wolk Maar welke knoop? s W 12
Initialisatie D[s] = 0; W = {s}; For alle knopen w do D[w] = For alle pijlen (s,u) do D[u] = L(s,u); 13
Greedy Loop While W N do Relax(v,u) Kies een element v uit N-W waarvoor D[v] minimaal is t.o.v. de andere elementen uit N-W Stop v in W For alle pijlen (v,u) met u in N-W do If D[u] > D[v] + L(v,u) then D[u] = D[v] + L(v,u) We gaan bewijzen dat voor deze v D[v] = d(s,v) 14
Voorbeeld 15
Waarom werkt Dijkstra? Invarianten 1. Voor elke knoop u: D[u] d(s,u) 2. Voor elke knoop u in W: D[u] = d(s,u). 16
Invarianten zijn initieel geldig 1. Voor elke knoop u: D[u] d(s,u) 2. Voor elke knoop u in W: D[u] = d(s,u). D[s] = 0; W = {s}; For alle knopen w do D[w] = For alle pijlen (s,u) do D[u] = L(s,u); 17
Invarianten blijven geldig 1. Voor elke knoop u: D[u] d(s,u) Relaxatie werkt 2. Voor elke knoop u in W: D[u] = d(s,u) Voor elke knoop u die al in W zat: D[u] wordt nooit meer gewijzigd, dus D[u] = d(s,u) Dus te bewijzen dat D[v] = d(s,v) voor knoop v gekozen in algoritme 18
De Wolk werkt (1) Te bewijzen dat D[v] = d(s,v) voor knoop v gekozen in algoritme Uit invariant weten we dat D[v] d(s,v) Stel dat D[v] > d(s,v) Wat hebben we fout gedaan? Hoe loopt dat kortste pad dus echt? 19
De Wolk werkt (2) Bekijk kortste pad P van s naar v P gaat van knoop in wolk (s) naar knoop buiten de wolk (v) Bekijk eerste knoop w op P buiten de wolk Mogelijk: w = v Bewering: D[w] < D[v] 20 En dus hadden we w moeten kiezen in het algoritme s w W v
De Wolk werkt (3): D[w] < D[v] u is voorganger van w op P Dan D[w] D[u] + L(u,w) = d(s,u) + L(u,w) u zit al in wolk W = d(s,w) sub-pad optimaliteit d(s,v) Relax(u,w) al gedaan w ligt onderweg naar v, sub-pad optimaliteit en pijl-lengtes niet-negatief 21 s u w W v
De Wolk werkt (4) Bewering was: D[w] < D[v] Net bewezen: D[w] d(s,v) Aanname was: D[v] > d(s,v) Dus D[w] < D[v] Daarom hadden we w moeten kiezen ipv v Contradictie! Dus D[v] = d(s,v) 22
Dijkstra: Correctheid Invarianten zijn correct 1. Voor elke knoop u: D[u] d(s,u) 2. Voor elke knoop u in W: D[u] = d(s,u). Algoritme is klaar als N=W Dus voor alle u: D[u] = d(s,u) While W N do 23
Greedy Loop While W N do Relax(v,w) Kies een element v uit N-W waarvoor D[v] minimaal is t.o.v. de andere elementen uit N-W Stop v in W For alle pijlen (v,u) met u in N-W do If D[u] > D[v] + L(v,u) then D[u] = D[v] + L(v,u) 24
Implementatie Simpel, behalve hoe we v kiezen en D updaten Welke datastructuur? Priority queue! Extract-min: 1 keer per knoop: n keer Update: hooguit 1 keer per pijl (bij relaxatie): a keer 25
Verschillende priority queues Binaire zoekboom Goede keuze: min-heap Minimum zoeken en update: O(log n) per keer O((n+a) log n) tijd totaal Fibonnaci (of hollow) heap O(a + n log n) tijd 26
Inzichten (1): hoe hangen schattingen af van de wolk? uitgaande buren x van W alleen schatting van d(s,x) bekend Wolk D[u]=d(s,u) rest van G niets over bekend 27
Inzichten (1): hoe hangen schattingen af van de wolk? Voor iedere u in W: D[u] = d(s,u), en het kortste pad dat Dijkstra s algoritme vindt gebruikt alleen knopen die in W liggen op het moment dat u werd toegevoegd Voor elke knoop u in N-W: D[u] is de lengte van het kortste pad P(W,u) van s naar u dat alleen s, u, en knopen in W gebruikt Gevolg: knopen u niet in W en zonder uitgaande pijl vanuit W hebben D[u] = 28
Inzichten (2): waarom alleen While W N do Relax(v,w) updates in N-W? Kies een element v uit N-W waarvoor D[v] minimaal is t.o.v. de andere elementen uit N-W Stop v in W For alle pijlen (v,u) met u in N-W do If D[u] > D[v] + L(v,u) then D[u] = D[v] + L(v,u) 29
Inzichten (2): waarom alleen While W N do Relax(v,w) updates in N-W? Kies een element v uit N-W waarvoor D[v] minimaal is t.o.v. de andere elementen uit N-W Stop v in W For alle pijlen (v,u) do If D[u] > D[v] + L(v,u) then D[u] = D[v] + L(v,u) 30
Inzichten (3): Prim-Jarnik? Prim-Jarnik Ook een wolk : de deelboom B die we telkens uitbouwen Voeg kant toe die B verlaat met minimum lengte Kant naar knoop dichtste bij B Dijkstra Wolk W Voeg knoop v toe buiten W met kleinste waarde van D Knoop die geschat dichtste bij s ligt 31
Inzichten (3): Prim-Jarnik? Prim-Jarnik doet net iets anders Prim-Jarnik zou kortste pad van lengte 10 van s naar t ontdekken 5 v 5 s 8 t 32
Inzichten (4): negatieve lengtes? Waarom werkt Dijkstra niet? Volgorde hoe we aan wolk toevoegen is s, t, x, v We moeten alle afstanden weer opnieuw berekenen nadat we v zien Ihb D[t], D[x] Dat kost te veel tijd 5 v -20 s 1 t 2 x 33
Inzichten (4): negatieve lengtes? Wat nou als we gewoon een grote constante optellen bij alle lengtes? Lengte van het pad (onder L) is iets anders dan aantal pijlen op pad! -1 v -1 1 v 1 s -1 t s 1 t 34
Negatieve cycles nog steeds niet toegestaan! NEGATIEVE LENGTES: BELLMAN-FORD 35
Bellman-Ford: Algoritme Initieel: D[s] = 0; voor alle andere u: D[u] = Herhaal n-1 keer: Voor alle pijlen (v,w): Relax(v,w) Als er dan nog een pijl (v,w) is waarvoor Relax mogelijk is, dwz D[v]+L(v,w) > D[w], dan is er een negatieve cycle bereikbaar uit s Tijd: O(na) 36
Voorbeeld 37
Bellman-Ford: Correctheid (1) Stelling: Als er een pad van s naar u is met k pijlen en lengte x, dan is na k iteraties van de hoofdloop van het algoritme D[u] <= x. Bewijs: met inductie naar k Initieel waar Een kortste pad s = v 0 v k = u met k pijlen is een kortste pad s = v 0.. v k-1 met k-1 pijlen plus pijl (v k-1,v k ) Sub-pad optimaliteit 38
Bellman-Ford: Correctheid (2) Stelling: Als er een pad van s naar u is met k pijlen en lengte x, dan is na k iteraties van de hoofdloop van het algoritme D[u] <= x. Uit stelling volgt correctheid: Negatieve cycle bereikbaar uit s: relaxaties blijven altijd mogelijk Geen negatieve cycle: elk kortste pad heeft hooguit n-1 pijlen 39
Single source algoritmen Een startknoop s: wat is de afstand van s naar v, voor elke andere knoop v? Twee algoritmes: Dijkstra: O(a + n log n), alleen bij nietnegatieve pijl-lengtes Bellman-Ford: O(na), werkt ook bij negatieve pijl-lengtes Maar niet bij negatieve cycles 40
REFLECTIE OP KORTSTE PADEN (1) 41
Reflectie (1): praktijk Kijk eens naar routebepaling op wegennetwerk Europa O(n+a) is al te veel Technieken: Bidirectional search A* of goal-oriented search Gebruik van hierarchie en preprocessing 42
Reflectie (1): praktijk Highway node routing Univ. Karlsruhe Gelaagde structuur van netwerken: optimale route gebruikt lagen 1, 2, 3, r-1, r, r-1, 3, 2, 1 Partitioning using natural cuts Microsoft research Gebruikt dat er natuurlijke snedes in een wegenwerk zijn en partitioneert netwerk daarmee Snedes worden met stromingstechnieken gevonden 43