Korteste vei problemet (seksjon 15.3) Skal studere et grunnleggende kombinatorisk problem, men først: En (rettet) vandring i en rettet graf D = (V, E) er en følge P = (v 0, e 1, v 1, e 2,..., e k, v k ) der k 0, v i V (0 i k) og a i = (v i 1, v i ) (i k). Sier at P går fra v 0 til v k, og kaller P en v 0 v k -vandring. En (rettet) vei er en vandring P der v 0, v 1,..., v k er distinkte; kalles en v 0 v k -vei. Forskjellen er at en vandring kan inneholde sykler (flertall av syklus, altså ikke noe man sykler på!) Korteste vei problemet: gitt en rettet graf D = (V, E) med et gitt ikkenegativt tall (lengde) c ij for hver kant (i, j), samt to noder s og r, finn en korteste vei P fra s til r. Her er lengden til en vei P summen av c ij -ene for kantene i P. 1 / 10
Problemet har direkte anvendelser i de fleste typer nettverk (kjørerute bil (GPS), fly,..) eller i dynamiske optimeringsproblemer f.eks. i økonomi/finans. Er også et delproblem i mange ulike, mer komplekse problemer. Ofte vil vi finne korteste vei mellom flere par av noder; algoritmene under gjør dette fra felles startnode s til enhver annen node. Eksempel: dynamisk programmering (dynamiske systemer med sekvensielle beslutningsproblemer): tar det til slutt! 2 / 10
Nettverk strøm formulering Korteste vei problemet er et spesialtilfelle av MKS (minimum kost strøm) problemet: min{c T x : Ax = b, x O}. Her er A node-kant indikator matrisen til grafen, c kostnadsvektoren (lengdene), og b = (b v : v V ) er vektoren gitt ved b s = 1, b r = 1 og b v = 0 ellers. Dette går greit fordi vi har en heltallig optimal løsning, og den må inneholde en vei fra s til r: x ij = 1 for alle kanter i veien, og x ij = 0 ellers. Tenk gjennom detaljene! Følgelig kan vi løse korteste vei problemet som MKS problem ved hjelp av nettverk simpleks algoritmen. Faktisk kan vi ved å endre b (og innføre kantkapasiteter på 1) finne korteste vei fra enhver v V til r ved å løse et MKS problem! Skal se på enda raskere og enklere algoritmer! 3 / 10
Bellman-Ford algoritmen For v V og k 0 (heltall), defineres d k (v) som minimum lengde av en sv-vandring med høyst k kanter. Hvis det ikke finnes noen slik vandring, lar vi d k (v) =. Hvordan kan vi beregne disse avstandsfunksjonene? Bellman-Ford s algoritme: la d 0 (s) = 0 og d 0 (v) = for hver v s. Beregn funksjonene d 1, d 2,..., d n ved for alle v V. d k+1 (v) = min{d k (v), min (d k(u) + c uv )} (1) u:(u,v) E Teorem: Bellman-Ford algoritmen finner virkelig de korrekte avstandene, dvs. d k (v) blir minimum lengde av en sv-vandring med høyst k kanter. Spesielt er d n 1 (v) lengden av korteste sv-vei (her er n antall noder i grafen). 4 / 10
Bevis: En korteste sv-vei med høyst k + 1 kanter har enten (i) høyst k kanter eller (ii) den har k + 1 kanter og inneholder en kant (u, v) som siste kant. Men i tilfelle (ii) må delveien fram til u være en korteste su-vei med høyst k kanter (for ellers kunne vi velge en annen vei dit, og forbedre sv-veien). Likningen (1) for beregning av d k+1 ut fra d k kalles Bellman s likning. Den brukes også i liknende problemer i (diskret) dynamisk programmering og i en mer generell (kontinuerlig) utgave som kalles Hamilton-Jacobi-Bellman (HJB) likningen i optimal kontrollteori. BF-algoritmen har kompleksitet (antall regneoperasjoner) O(nm) der grafen har n noder og m kanter. Algoritmen har en viktig annen egenskap: den kan brukes også hvis det er negative kantlengder i følgende betydning. BF vil da oppdage om det finnes en syklus med negativ (total-)lengde som kan nåes fra s; da er d n (v) < d n 1 (v). Hvis dette ikke skjer, finner BF en korteste sv-vei. 5 / 10
Dijkstra s algoritme Dette er også en algoritme for Korteste vei problemet. Den virker bare for ikkenegative kantlengder (som er mest vanlig!) Dijkstra s algoritme er raskere enn Bellman-Ford algoritmen. (Vår beskrivelse er litt forskjellig fra bokas: vi starter i s og går forover langs kanter; Vanderbei går baklengs!) som vanlig betegner n antall noder 6 / 10
Algoritmen har n iterasjoner, i hver iterasjon føyes én ny node til en viss mengde F og noen beregninger gjøres. Ved starten er F =. Man har en verdi (en label) d i, for hver node i: d i er en øvre skranke på (korteste) avstand fra s til i. Ved starten er: d s = 0, og d i = ellers. F består av de nodene man allerede har funnet korteste vei til, så for disse nodene er d i lik avstanden fra s til i. I hver iterasjon: 1. velg en i F med d i minst mulig ( nærmeste node ), og oppdater F := F {i}. 2. for hver kant (i, j) E der j F, sett d j = min{d j, d i + c ij } og, hvis d j ble redusert, sett en peker prev(j) = i. 7 / 10
Dette betyr at, ved starten av hver iterasjon, er d(v) lik lengden av en korteste sv-vei som bare bruker noder i F. Vi har (uten å gi beviset, selv om det er et relativt enkelt induksjonsbevis): Teorem: Dijkstra s algoritmen finner en korteste vei, og tilhørende avstand d v, fra s til hver node v. Kompleksiteten er O(n 2 ). Eksempel: bruk Dijkstra (og Bellman-Ford) her u 3 v 1 5 2 s 7 r 8 / 10
Eksempel: dynamisk programmering I dynamisk programmering (DP) har man en diskret dynamisk prosess som man vil kontrollere best mulig ved å påvirke prosessen ved hvert diskret tidspunkt t i (i m). Prosessen beskrives ved funksjoner f i der s i+1 = f i (s i, x i ) (i m) (2) der s i er tilstanden ved tidspunkt t i og x i er en variabel som vi kaller kontrollen ved tid t i. Vi antar at alt her er diskret (faktisk endelig), så kontrollen x i X og tilstanden s i S der X og S er endelige. Videre er f i : S X S. Det er også gitt kostfunksjoner g i (s i, x i ) som angir kostnaden ved å velge kontrollen x i ved tilstand s i i tidspunkt t i (i m). Problemet i DP er å finne en kontroll x 1, x 2,..., x m som minimerer totalkostnad m g i (s i, x i ) i=1 under kravene (2) og s i = s, s m+1 = s der s og s er gitt start- og slutt-tilstander. 9 / 10
Lag en rettet graf D med noder (t i, s j ) for hvert tidspunkt t i (i m) og hver tilstand s j S. Videre lager vi en kant fra (t i, s j ) til (t i+1, s k ) hvis det fins en kontroll x i slik at s k = f i (s i, x i ), og la denne kanten ha kostnad lik g i (s i, x i ) (den laveste, hvis det er flere mulige kontroller som gir denne tilstanden). Legg merke til at grafen D får noder som et rutenett, der kantene går mot høyre mellom noder (t i, ) og noder (t i+1, ). Den inneholder derfor ingen rettet syklus. Vi kan løse DP ved å finne en korteste vei i D fra noden (s, t 1 ) til noden (s, t m+1 )!!! Enkelt og greit! Til tross for at DP er en meget generell problemstilling, med mange anvendelser! Vi kan derfor løse DP ved f.eks. Bellman-Ford algoritmen i denne grafen. (Varianten av DP der slutt-tilstand er fri: går nokså likt.) Mer kompliserte varianter av dette oppsettet: stokastisk modell (Markov modell), kontinuerlig tid. Dette krever mer avanserte metoder. 10 / 10