Dijkstras algoritme Spørsmål

Like dokumenter
Øvingsforelesning 7. Dijkstras algoritme. Foiler: Fredrik Ludvigsen Foreleser: Jon Marius Venstad 10/4/09 1

Dijkstras algoritme. Her finnes det også (minst) en riktig rekkefølge for Relax, men den må vi oppdage litt etter hvert.

Teoriøving 7 + litt om Ford-Fulkerson. Magnus Lie Hetland

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

KORTESTE STI. Vektede Grafer. Korteste Sti. Dijkstra s Algoritme. Vektet Urettet Graf

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Øvingsforelesning Korteste vei: Alle til alle

Dijkstras algoritme. Her finnes det også (minst) en riktig rekkefølge for Relax, men den må vi oppdage litt etter hvert.

Minimum Spenntrær - Kruskal & Prim

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

INF1020 Algoritmer og datastrukturer GRAFER

INF Algoritmer og datastrukturer

Søk i tilstandsrom. Backtracking (Kap. 10) Branch-and-bound (Kap. 10) Iterativ fordypning. Dijkstras korteste sti-algoritme A*-søk (Kap.

Grunnleggende Grafalgoritmer

INF Algoritmer og datastrukturer

IN Algoritmer og datastrukturer

Algdat - Øvingsforelesning. Maks flyt

GRAFER. Korteste vei i en vektet graf uten negative kanter. Korteste vei, en-til-alle, for: Minimale spenntrær

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

ALGORITMER OG DATASTRUKTURER

Korteste Vei I. Lars Vidar Magnusson Kapittel 24 Hvordan finne korteste vei Egenskaper ved korteste vei

Korteste Vei II. Lars Vidar Magnusson Kapittel 24 Bellman-Ford algoritmen Dijkstra algoritmen

Grunnleggende Grafteori

Vi skal se på grafalgoritmer for:

Løsningsforslag - Korteste vei

INF Algoritmer og datastrukturer

MAT1030 Forelesning 25

PG4200 Algoritmer og datastrukturer Forelesning 10

Oppgave 1. Sekvenser (20%)

Forelesning 25. MAT1030 Diskret Matematikk. Litt repetisjon. Litt repetisjon. Forelesning 25: Trær. Dag Normann

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

MAT1030 Diskret Matematikk

Algdat Eksamensforelesning. Nils Barlaug

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Algdat Redux. Fjortende forelesning. Repetisjon av utvalgte emner.

INF Algoritmer og datastrukturer

Prioritetskøer. Prioritetskøer. Binære heaper (vanligst) Prioritetskøer

ALGORITMER OG DATASTRUKTURER

Repetisjon og mer motivasjon. MAT1030 Diskret matematikk. Repetisjon og mer motivasjon

Høgskoleni østfold EKSAMEN. 4 dobbeltsidige ark med notater Lars Magnusson

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

TMA4140 Diskret Matematikk Høst 2016

Grafteori. MAT1030 Diskret Matematikk. Repetisjon og mer motivasjon. Repetisjon og mer motivasjon. Forelesning 23: Grafteori.

MAT1030 Diskret Matematikk

MAT1030 Forelesning 23

Forelesning 23. MAT1030 Diskret Matematikk. Repetisjon og mer motivasjon. Repetisjon og mer motivasjon. Forelesning 23: Grafteori.

Grunnleggende Grafalgoritmer II

Prioritetskøer. Binære heaper Venstrevridde heaper (Leftist) Binomialheaper Fibonacciheaper

Dagens plan: INF Algoritmer og datastrukturer. Grafer vi har sett allerede. Det første grafteoretiske problem: Broene i Königsberg

O, what a tangled. Fjerde forelesning. Robot-eksemplet som ikke ble gjennomgått sist blir frivillig selvstudium (ut fra foilene :-)

Alle mot alle. Åttende forelesning. (eller eller Bellman-Ford, eller BFS, alt ettersom) fra alle noder.

Forelesning 30: Kompleksitetsteori

Løsningsforslag for utvalgte oppgaver fra kapittel 9

INF2220: Time 4 - Heap, Huffmann

EKSAMEN med løsningsforslag

Øvingsforelesning 4. Topologisk sortering, Strongly Connected Components og Minimale spenntrær. Magnus Botnan

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Forelesning 24. Grafer og trær. Dag Normann april Vektede grafer. En kommunegraf

Løsnings forslag i java In115, Våren 1996

Vektede grafer. MAT1030 Diskret matematikk. En kommunegraf. En kommunegraf. Oppgave

INF Algoritmer og datastrukturer

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

IN Algoritmer og datastrukturer

Korteste vei i en vektet graf uten negative kanter

Heap og prioritetskø. Marjory the Trash Heap fra Fraggle Rock

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Øvingsforelesning 6. Sorteringsalgoritmer. Kristian Veøy

SIF8010 ALGORITMER OG DATASTRUKTURER

Løsningsforslag for eksamen i fag TDT4120 Algoritmer og datastrukturer Tirsdag 9. desember 2003, kl

MAT1030 Forelesning 22

MAT1030 Forelesning 25

Introduksjon. MAT1030 Diskret matematikk. Søkealgoritmer for grafer. En graf

MAT1030 Diskret matematikk

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Introduksjon. MAT1030 Diskret Matematikk. Introduksjon. En graf. Forelesning 22: Grafteori. Roger Antonsen

MAT1030 Forelesning 22

Kombinatorikk. MAT1030 Diskret Matematikk. Oppsummering av regneprinsipper

MAT1030 Diskret Matematikk

Først litt praktisk info. Sorteringsmetoder. Nordisk mesterskap i programmering (NCPC) Agenda

Algdat - øvingsforelesning

Det første grafteoretiske problem: Broene i Königsberg

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

Forelesning 25. MAT1030 Diskret Matematikk. Litt repetisjon. Litt repetisjon. Forelesning 25: Trær. Roger Antonsen

Forelesning 23. Grafteori. Dag Normann april Oppsummering. Oppsummering. Oppsummering. Digresjon: Firefarveproblemet

INF1020 Algoritmer og datastrukturer GRAFER

Korteste vei problemet (seksjon 15.3)

Uretta grafar (1) Mengde nodar Mengde kantar som er eit uordna par av nodar

MAT1030 Diskret matematikk

Oppsummering. MAT1030 Diskret matematikk. Oppsummering. Oppsummering. Forelesning 23: Grafteori

Algoritmer og datastrukturer Kapittel 11 Delkapittel 11.2

Transkript:

:: Forside s algoritme Åsmund Eldhuset asmunde *at* stud.ntnu.no folk.ntnu.no/asmunde/algdat/dijkstra.pdf

:: Vi er ofte interessert i å finne korteste, raskeste eller billigste vei mellom to punkter Gods- og persontransport GPS-kartsystemer Ruting av internettrafikk Kart og nettverk kan modelleres som vektede grafer, der hver kant har en lengde, pris eller tid Gitt en vektet graf og en startnode, finn de korteste stiene fra startnoden til hver av de andre nodene

:: i uvektede grafer I uvektede grafer har alle kanter samme lengde I vil da noder komme inn i (og ut av) køen i stigende rekkefølge mhp. avstand Startnoden (avstand 0) vil legge til alle nodene med avstand Hver node med avstand vil legge til naboer som har avstand 2, osv. Derfor fungerer til å finne korteste vei fra ett punkt til alle andre, fordi ALLE noder med avstand d er funnet før fjernere noder

:: i vektede grafer Prøver vi på en vektet graf, får vi problemer På grunn av de ulike vektene vil nodene komme inn i køen i feil rekkefølge Når vi tar ut en node v og legger til naboene dens, kan det hende at det egentlig fantes en kortere vei til v

:: Forside i vektede grafer Kø: A (0), B (2), C (4) E 7 5 F B 2 C C ble lagt inn i køen med avstand 4, men B kan tilby en kortere vei Når vi behandler C vil D legges til før F, selv om F har den korteste veien A 4 D

:: av Problem nr. : Vi risikerer å behandle noder som vi ikke har funnet den korteste veien til Idé nr. : i stedet for å ta ut den første noden fra køen, hva med å ta ut den noden med kortest avstand?

:: av Problem nr. 2: underveis kan vi finne kortere veier til noen noder, men da er nodene allerede markert som besøkt Idé nr. 2: hva med å tillate at man finner bedre avstander underveis? Må ikke markere noder som besøkt før man tar dem ut av køen Avstandene vi finner underveis, er ikke endelige de er bare estimater helt frem til vi er sikre på at vi har den korteste stien Når kan vi være sikre på at vi har funnet den korteste stien?

:: s algoritme Hvis vi modifiserer slik, får vi s algoritme Vi bruker en prioritetskø slik at vi raskt kan finne den korteste ubesøkte noden (den med kortest estimat) En prioritetskø kan lages slik: Et array som man holder sortert når man setter noe inn (treigt å sette inn, raskt å hente ut) Et array som man søker gjennom hver gang man skal ta noe ut (raskt å sette inn, treigt å hente ut) En heap ( haug ) (begge deler går temmelig raskt)

:: Pseudokode S er en tom liste Q er en prioritetskø sett alle estimater til sett startnodens estimat til 0 legg alle noder inn i Q så lenge Q ikke er tom: sett u til den "korteste" noden i Q fjern u fra Q legg u til de kjente nodene for hver nabo v av u: hvis u kan tilby en kortere sti til v: oppdater v sitt estimat sett u som v sin forgjenger

:: Sammenl. med koden i boka sett alle estimater til sett startnodens estimat til 0 S er en tom liste Q er en prioritetskø legg alle noder inn i Q så lenge Q ikke er tom: sett u til den "korteste" noden i Q fjern u fra Q legg u til de kjente nodene for hver nabo v av u: hvis u kan tilby en kortere sti til v: oppdater v sitt estimat og forgjenger INITIALIZE-SINGLE-SOURCE(G, s) S Q V[G] while Q do u EXTRACT-MIN(Q) S S {u} for each vertex v Adj[u] do RELAX(u, v, w)

:: Sammenl. med koden i boka sett alle estimater til sett startnodens estimat til 0 S er en tom liste Q er en prioritetskø legg alle noder inn i Q så lenge Q ikke er tom: sett u til den "korteste" noden i Q fjern u fra Q legg u til de kjente nodene for hver nabo v av u: hvis u kan tilby en kortere sti til v: oppdater v sitt estimat og forgjenger INITIALIZE-SINGLE-SOURCE(G, s) S Q V[G] while Q do u EXTRACT-MIN(Q) S S {u} for each vertex v Adj[u] do RELAX(u, v, w)

:: Sammenl. med koden i boka sett alle estimater til sett startnodens estimat til 0 S er en tom liste Q er en prioritetskø legg alle noder inn i Q så lenge Q ikke er tom: sett u til den "korteste" noden i Q fjern u fra Q legg u til de kjente nodene for hver nabo v av u: hvis u kan tilby en kortere sti til v: oppdater v sitt estimat og forgjenger INITIALIZE-SINGLE-SOURCE(G, s) S Q V[G] while Q do u EXTRACT-MIN(Q) S S {u} for each vertex v Adj[u] do RELAX(u, v, w)

:: Sammenl. med koden i boka sett alle estimater til sett startnodens estimat til 0 S er en tom liste Q er en prioritetskø legg alle noder inn i Q så lenge Q ikke er tom: sett u til den "korteste" noden i Q fjern u fra Q legg u til de kjente nodene for hver nabo v av u: hvis u kan tilby en kortere sti til v: oppdater v sitt estimat og forgjenger INITIALIZE-SINGLE-SOURCE(G, s) S Q V[G] while Q do u EXTRACT-MIN(Q) S S {u} for each vertex v Adj[u] do RELAX(u, v, w)

:: Sammenl. med koden i boka sett alle estimater til sett startnodens estimat til 0 S er en tom liste Q er en prioritetskø legg alle noder inn i Q så lenge Q ikke er tom: sett u til den "korteste" noden i Q fjern u fra Q legg u til de kjente nodene for hver nabo v av u: hvis u kan tilby en kortere sti til v: oppdater v sitt estimat og forgjenger INITIALIZE-SINGLE-SOURCE(G, s) S Q V[G] while Q do u EXTRACT-MIN(Q) S S {u} for each vertex v Adj[u] do RELAX(u, v, w)

:: Sammenl. med koden i boka sett alle estimater til sett startnodens estimat til 0 S er en tom liste Q er en prioritetskø legg alle noder inn i Q så lenge Q ikke er tom: sett u til den "korteste" noden i Q fjern u fra Q legg u til de kjente nodene for hver nabo v av u: hvis u kan tilby en kortere sti til v: oppdater v sitt estimat og forgjenger INITIALIZE-SINGLE-SOURCE(G, s) S Q V[G] while Q do u EXTRACT-MIN(Q) S S {u} for each vertex v Adj[u] do RELAX(u, v, w)

:: Sammenl. med koden i boka sett alle estimater til sett startnodens estimat til 0 S er en tom liste Q er en prioritetskø legg alle noder inn i Q så lenge Q ikke er tom: sett u til den "korteste" noden i Q fjern u fra Q legg u til de kjente nodene for hver nabo v av u: hvis u kan tilby en kortere sti til v: oppdater v sitt estimat og forgjenger INITIALIZE-SINGLE-SOURCE(G, s) S Q V[G] while Q do u EXTRACT-MIN(Q) S S {u} for each vertex v Adj[u] do RELAX(u, v, w)

:: Sammenl. med koden i boka sett alle estimater til sett startnodens estimat til 0 S er en tom liste Q er en prioritetskø legg alle noder inn i Q så lenge Q ikke er tom: sett u til den "korteste" noden i Q fjern u fra Q legg u til de kjente nodene for hver nabo v av u: hvis u kan tilby en kortere sti til v: oppdater v sitt estimat og forgjenger INITIALIZE-SINGLE-SOURCE(G, s) S Q V[G] while Q do u EXTRACT-MIN(Q) S S {u} for each vertex v Adj[u] do RELAX(u, v, w)

:: Sammenl. med koden i boka sett alle estimater til sett startnodens estimat til 0 S er en tom liste Q er en prioritetskø legg alle noder inn i Q så lenge Q ikke er tom: sett u til den "korteste" noden i Q fjern u fra Q legg u til de kjente nodene for hver nabo v av u: hvis u kan tilby en kortere sti til v: oppdater v sitt estimat og forgjenger INITIALIZE-SINGLE-SOURCE(G, s) S Q V[G] while Q do u EXTRACT-MIN(Q) S S {u} for each vertex v Adj[u] do RELAX(u, v, w)

:: 7 E 5 B F 2 C A 4 D

:: B 7 E 5 F Nodeavstander <A: 0 (-)> B:? (-) C:? (-) D:? (-) E:? (-) F:? (-) 2 C A 4 D

:: B 7 E 5 F Nodeavstander <A: 0 (-)> B: 2 (A) C: 4 (A) D:? (-) E:? (-) F:? (-) 2 C A 4 D

:: B 7 E 5 F Nodeavstander A: 0 (-) <B: 2 (A)> C: 4 (A) D:? (-) E:? (-) F:? (-) 2 C A 4 D

:: B 7 E 5 F Nodeavstander A: 0 (-) <B: 2 (A)> C: (B) D:? (-) E: 9 (B) F:? (-) 2 C A 4 D

:: B 7 E 5 F Nodeavstander A: 0 (-) B: 2 (A) <C: (B)> D:? (-) E: 9 (B) F:? (-) 2 C A 4 D

:: B 7 E 5 F Nodeavstander A: 0 (-) B: 2 (A) <C: (B)> D: 6 (C) E: 9 (B) F: 4 (C) 2 C A 4 D

:: B 7 E 5 F Nodeavstander A: 0 (-) B: 2 (A) C: (B) D: 6 (C) E: 9 (B) <F: 4 (C)> 2 C A 4 D

:: B 7 E 5 F Nodeavstander A: 0 (-) B: 2 (A) C: (B) D: 5 (F) E: 9 (F) <F: 4 (C)> 2 C A 4 D

:: B 7 E 5 F Nodeavstander A: 0 (-) B: 2 (A) C: (B) <D: 5 (F)> E: 9 (F) F: 4 (C) 2 C A 4 D

:: B 7 E 5 F Nodeavstander A: 0 (-) B: 2 (A) C: (B) <D: 5 (F)> E: 8 (D) F: 4 (C) 2 C A 4 D

:: B 7 E 5 F Nodeavstander A: 0 (-) B: 2 (A) C: (B) D: 5 (F) <E: 8 (D)> F: 4 (C) 2 C A 4 D

:: B 7 E 5 F Nodeavstander A: 0 (-) B: 2 (A) C: (B) D: 5 (F) <E: 8 (D)> F: 4 (C) 2 C A 4 D

:: B 7 E 5 F Nodeavstander A: 0 (-) B: 2 (A) C: (B) D: 5 (F) E: 8 (D) F: 4 (C) 2 C A 4 D

:: B 7 E 5 F Nodeavstander A: 0 (-) B: 2 (A) C: (B) D: 5 (F) E: 8 (D) F: 4 (C) 2 C A 4 D

:: -tre B 2 A 2 4 E C 8 2 5 D F I forrige eksempel lå alle nodene etter hverandre på den korteste stien Som regel vil man heller få et tre av korteste stier Et eksempel vises til høyre (grafen har andre vekter enn i sted) Merk at vi nå også har funnet korteste stier mellom alle noder i samme gren (B ~> E, B ~> F, E ~> F, B ~> C, B ~> D og C ~> D), men ikke mellom noder i forskjellige greiner (f.eks. E ~> C)

:: Vi må vise at når vi tar ut en node fra prioritetskøen, er estimatet til noden faktisk den korteste distansen Er det mulig å finne kortere veier? Når vi tar ut en node u fra prioritetskøen, vet vi at vi har undersøkt alle stier som har kortere lengde enn u sitt estimat Dersom det fantes kortere stier, måtte de ha begynt fra en node x med kortere distanse Men hvis x hadde kortere distanse enn u, ville x ha blitt tatt ut av prioritetskøen før u, og da ville den kortere veien ha blitt funnet

:: Illustrasjon av korrekthet u a s b x La oss tenke oss at gjør en tabbe på et tidspunkt, ved å legge en node u til de kjente nodene uten at estimatet til u faktisk er kortest. La oss se på situasjonen der vi tar ut u fra prioritetskøen og skal til å legge den til de kjente nodene. Vi vil bevise at det faktisk ikke er mulig at det finnes en annen vei som er kortere. - Dersom det finnes en kortere vei fra s til u, kan vi spore den veien til det punktet hvor den går fra en kjent node b til en ukjent node x - x ligger i prioritetskøen siden den er ukjent - b er en kjent node, med korrekt korteste avstand (siden u er den første noden der vi gjorde en tabbe) -Da b ble lagt til, oppdaterte vi estimatet til alle nabonodene, deriblant x. Dermed har x også riktig estimat, siden b -> x ligger på en korteste vei - Dersom alle kantvektene er positive, må x ha et estimat som er kortere enn u sitt - Men da skulle x ha blitt tatt ut fra prioritetskøen FØR u! - Vi har altså en selvmotsigelse, så det er ikke mulig at det finnes kortere stier når vi tar ut en node

Negative kantvekter :: Merk argumentet på forrige slide: "Dersom alle kantvektene er positive..." Essensen er at noder på den korteste veien til u må ha kortere estimat enn u Dersom det finnes negative kanter, gjelder ikke beviset lenger! Det blir da mulig å gå fra en node med estimat d, følge en negativ kant, og ende opp med en distanse som er mindre enn d Konklusjon: s algoritme fungerer ikke når grafen inneholder negative kanter!

:: INITIALIZE-SINGLE-SOURCE(G, s) 2 S Q V[G] 4 while Q 5 do u EXTRACT-MIN(Q) 6 S S {u} 7 for each vertex v Adj[u] 8 do RELAX(u, v, w) Konstruksjon av Q med V elementer () While-løkka kjøres V ganger Ett uttak fra Q hver gang (5) For-løkka kjøres totalt E ganger (7) I verste fall én oppdatering i Q hver gang (8)

Valg av prioritetskø-struktur :: Med n elementer i prioritetskøen har vi følgende kompleksiteter: Usortert array Konstruksjon: O(V) Uttak: O(n) Oppdatering: O() Heap Konstruksjon: O(V) Uttak: O(lg n) Oppdatering: O(lg n)

Valg av prioritetskø-struktur :: Vi hadde altså konstruksjon, V uttak og E oppdateringer Usortert array: totalt O(V + V 2 + E) = O(V 2 ) Konstruksjon: O(V) Uttak: O(V 2 ) Oppdatering: O(E) Heap: totalt O(V + V lg V + E lg V) = O(E lg V) Konstruksjon: O(V) Uttak: O(V lg V) Oppdatering: O(E lg V)

Valg av prioritetskø-struktur :: Dersom heap skal lønne seg, må E lg V = o(v 2 ) (altså E lg V < V 2 ) Generelt sett kan vi ikke si noe annet enn at E = O(V 2 ) (maksimalt én kant mellom hvert par av noder) Hvis vi vet hvor mange noder og kanter en bestemt graf har, kan vi finne tettheten (formelen fra øving 5): T = E / V 2 Dersom T < / lg V, lønner det seg åbruke heap

8: Mumien :: Her går det ut på å finne "mest sannsynlige vei" Hver node har en viss sannsynlighet Hint: Sannsynligheten til en kant er lik sannsynligheten til noden kanten går til Problem: Finne en vei der produktet av sannsynlighetene er størst mulig Klarer vi å transformere dette til et problem om å finne en vei der en sum skal være minst mulig?

::?