Bellman-Fordov algoritem za iskanje najkraj²ih poti Alenka Frim 19. februar 2009 Popravek 25. februar 2009 Imamo usmerjen graf G z uteºmi na povezavah (uteº si predstavljamo npr. kot dolºino, ceno, teºo ipd.). Dolºina (ali teºa) sprehoda S = v 0 e 1 v 1... v k 1 e k v k v grafu G je c(s) := k c(e i), kjer je c(e i ) uteº povezave e i. Za pot P = v 0, v 1,... v k (pot je sprehod, v katerem se nobeno vozli² e ne ponovi), lahko kraj²e zapi²emo c(p ) = e E(P ) c(e). Iskali bomo najkraj²e poti v grafu G (tj. poti z najmanj²o teºo). Opombe. Da je pot najkraj²a, ne pomeni, da vsebuje najmanj povezav, ampak da je vsota uteºi (teºa poti) na povezavah najmanj²a. Najkraj²e poti od neke to ke do vseh ostalih to k grafa lahko predstavimo kot drevo, pravimo mu drevo najkraj²ih poti. ƒe obstaja pot med dvema to kama, potem vedno obstaja tudi najkraj²a pot med njima, ni pa nujno enoli na. 1 Dijkstrov algoritem Predpostavimo najprej, da imamo samo nenegativne uteºi, c : E(G) R + {0}. V tem primeru lahko uporabimo npr. Dijkstrov algoritem (poºre²na metoda). Ta algoritem je podoben Primovemu postopku za iskanje minimalnega vpetega drevesa v grafu, najde pa lahko najkraj²e poti iz to ke do vseh ostalih to k. Med postopkom gradimo drevo najkraj²ih poti. Za nemo z dano za etno to ko s, za katero i² emo najkraj²e poti do vseh drugih to k; tej to ki pravimo izvor (angl. source). Na vsakem koraku dodamo drevesu tisto to ko zunaj drevesa, ki je "trenutno" najbliºja to ki s (prek trenutnega drevesa in neke povezave, ki zapusti drevo in ima drugo kraji² e zunaj doslej zgrajenega drevesa). Algoritem: Dijkstrov algoritem V danem uteºenem grafu G z nenegativnimi uteºmi c poi² i vse najkraj²e poti z za etkom v s (drevo najkraj²ih poti). dijkstra(g, s) za vse u V (G) d[u] = //d je tabela z razdaljami od to ke s do drugih to k prednik[u] = null //prednik to ke v drevesu najkraj²ih poti d[s] = 0 Q = V (G) //Q je struktura, v kateri hranimo to ke iz grafa G, ki ²e niso v drevesu dokler Q u = min Q //vrne to ko, ki ima pripadajo i d najmanj²i, in jo odstrani iz Q za vse uv δ + (u) //δ + (u) je mnoºica povezav, ki imajo za etek v u e d[v] > d[u] + c(uv) potem d[v] = d[u] + c(uv) prednik[v] = u 1
Opombe. Za Q lahko vzamemo katerokoli strukturo, iz katere lahko razberemo element u z najmanj²im d[u]. Algoritem lahko uporabimo tudi na neusmerjenih uteºenih grah (povezavo zamenjamo z dvema povezavama z razli nima smerema in enakima uteºema; uteºi enaki prvotni). Dijkstrov algoritem ne deluje pravilno na grah z negativnimi uteºmi. ƒasovna zahtevnost: Za splo²ne grafe je primerna implementacija, kjer za strukturo Q uporabimo kar navadno tabelo. V tem primeru je asovna zahtevnost O( V 2 ). ƒe imamo opravka z redkimi gra, pa se nam spla a za strukturo vzeti kopico. Tedaj porabimo O( E log V ) operacij (jemanje elementa iz kopice in vzdrºevanje le-te stane O(log V ), v O( E ) pregledamo vse povezave, ostale operacije opravimo v konstantno korakih). Zgledi: http://lrv.fri.uni-lj.si/~bojank/diplome/jozica_stensak/dijkstra.html 2 Bellman-Fordov algoritem Sedaj bomo grafe posplo²ili, dovolili bomo tudi negativne uteºi. Najve ji problem pri takih grah je v primeru, e graf vsebuje negativne cikle, tj. cikle, ki imajo vsoto uteºi negativno. V tem primeru dobimo poljubno kratke "poti", ki pravzaprav niso ve poti, ampak sprehodi s ponovljenimi povezavami. ƒe negativni cikli niso dosegljivi iz za etne to ke s (ne obstaja pot od s do katerekoli to ke negativnega cikla), teºave ni. Ogledali si bomo Bellman-Fordov algoritem. Primeren je za iskanje najkraj²ih poti v grah brez negativnih ciklov; e pa graf vsebuje negativen cikel, nas na to opozori. Bellman-Fordov algoritem je v osnovi zelo podoben Dijkstrovemu algoritmu, vendar ne izbira primernih vozli² in povezav na vsakem koraku, temve izbira primerne povezave do vseh vozli² ( V (G) 1)-krat. Algoritem: Bellman-Fordov algoritem V danem uteºenem usmerjenem grafu G z uteºmi c najdi vse najkraj²e poti iz to ke s. Kot rezultat v primeru, ko v grafu ni negativnega cikla, dosegljivega iz s, vrni logi no vrednost true (pri tem izra unaj razdalje d in drevo najkraj²ih poti, podano prek tabele prednikov), sicer vrni false. bellman_ford(g, s) za vse u V (G) d[u] = prednik[u] = null d[s] = 0 //Sprostitev (S) za i = 1 do V (G) 1 za vse uv E(G) //uv je povezava iz u v v e d[v] > d[u] + c(uv) potem d[v] = d[u] + c(uv) prednik[v] = u za vse uv E(G) e d[v] > d[u] + c(uv) potem vrni false //obstaja negativen cikel, dosegljiv iz s vrni true //iz s ni dosegljiv noben negativen cikel Sprostitev nad povezavo uv preveri, ali lahko zmanj²amo teºo najkraj²e poti od s do v (d[v]) tako, da najkraj²i poti od s do u (d[u]) dodamo povezavo uv. 2
Opomba (lastnost sprostitve). ƒe je P = v 0, v 1,..., v k, s = v o, najkraj²a pot od s do v k in izvedemo relaksacijo po vrstem redu nad povezavami v 0 v 1, v 1 v 2,..., v k 1 v k, potem je kjer je δ(s, v k ) dolºina najkraj²e poti od s do v k. d[v k ] = δ(s, v k ), Dokaz: (Pravilnost algoritma) 1. del: Naj bo G = (V, E) uteºen, c : E(G) R, usmerjen graf z izvorom s, ter predpostavimo, da G ne vsebuje negativnega cikla, dosegljivega iz s. Trdimo, da po V (G) 1 ponovitvah zanke (R) za vsako to ko v V velja d[v] = δ(s, v) in algoritem vrne true. Naj bo v poljubna to ka, dosegljiva iz s, in naj bo P = v 0, v 1,... v k najkraj²a pot od s do v brez negativnega cikla (v 0 = s, v k = v). Pot P ima kve jem V (G) 1 povezav in je zato k V (G) 1. V vsaki ponovitvi zanke (S) pregledamo vse povezave. Torej smo na i-tem koraku (i = 1,..., k) izvedli sprostitev med drugim tudi nad povezavo (v i 1, v i ) in zato iz lastnosti sprostitve sledi: d[v] = d[v k ] = δ(s, v k ) = δ(s, v). ƒe v ni dosegljiva iz s, najkraj²a pot od s do v ne obstaja. Pokaºimo ²e, da algoritem vrne true. Po koncu zanke (S), za vse to ke v V velja: d[v] = δ(s, v) δ(s, u) + c(u, v) = d[u] + c(u, v), torej algoritem ne vrne false v nobeni ponovitvi zadnje zanke. 2. del: Naj bo G = (V, E) uteºen, c : E(G) R, usmerjen graf z izvorom s. Trdimo, da e graf G vsebuje negativen cikel, dosegljiv iz s, potem algoritem vrne false. Naj bo C = v o, v 1,..., v k, kjer je v 0 = v k, negativen cikel, dosegljiv iz s. Potem velja: c(v i 1, v i ) < 0. Dokaºimo trditev s protislovjem. Naj Bellman-Fordov algoritem vrne true. Torej velja za i = 1,..., k. Neena be se²tejemo in dobimo d[v i ] d[v i ] d[v i 1 ] + c(v i 1, v i ), (d[v i 1 ] + c(v i 1, v i )) = d[v i 1 ] + c(v i 1, v i ). Ker je v 0 = v k, je k d[v i] = k d[v i 1], in ker so vsi d[v i ], i = 1,..., k, kon ni (to ke na ciklu so dosegljive iz s), je tudi njihova vsota kon na. Torej velja: c(v i 1, v i ) 0 in smo pri²li v protislovje s predpostavko, da Bellman-Fordov algoritem vrne true. ƒasovna zahtevnost: Bellman-Fordovega algoritma je O( V E ). Zanka (R) porabi O( V ) operacij in primerjanje (zadnja zanka) porabi O( E ) operacij. Ostale operacije opravimo v konstantnem asu. Opomba. Ta algoritem je najhitrej²i znan algoritem za splo²ne grafe, ki problem re²i v polinomskem asu. Poznan pa ni noben algoritem, ki bi v polinomskem asu na²el najkraj²e poti tako, da bi se izognil negativnim ciklom. Algoritem ne deluje pravilno za neusmerjene grafe z negativnimi uteºmi. 3
2.1 Primer Uporaba Bellman-Fordovega algoritma. V tabeli d in prednik pi²emo samo spremembe (nesmiselno je pisati vsak korak, saj je teh ( V 1) E, v na²em primeru 40). Ob strani je ²e seznam vseh povezav z njihovimi uteºmi. Ko izvajamo algoritem, si izberemo vrstni red, v katerem pregledujemo povezave, in jih primernokrat pregledamo (mi moramo to storiti ²tirikrat). Ob povezavah je ozna eno, ali posamezni korak algoritma povzro i spremembo ( ) ali ne ( ). tabela d 0 6 11 7 2 2 4 2..... 0 2 4 7 2 tabela prednik / / / / / s t s t x y t..... / x y s t seznam povezav st 6 sy 7 tx 5 ty 8 tz 4 yx 3 yz 9. xt 2 zx 7 zs 2 Kot lahko vidimo iz desne tabele, po zadnji spremembi tabel d in prednik (ta se je zgodila, ko smo drugi "pregledali" povezavo tz) ni bilo do ponovnega "pregleda" povezave tz nobene spremembe ve, zato lahko algoritem (pred asno) zaklju imo. ƒe povezav ne bi imeli na nek na in urejenih in bi jih izbirali naklju no (vsako samo enkrat v eni ponovitvi zanke (za i)), bi morali pregledati ²e vse ostale povezave, tukaj vemo, da ne bo ve nobene spremembe. Opomba. Iz tabele prednik je videti, da tudi ko pride do spremembe, prednik to ke lahko ostane isti. To se zgodi, ker smo med dvema "pregledoma" te povezave popravili vrednost v tabeli d, ki ustreza predniku. Algoritem vrne true, saj za vsaki to ki u in v velja d[v] d[u] + c(uv). Uporaba Bellman-Fordovega algoritma na grafu z negativnim ciklom, dosegljivim iz izvorne to ke. Graf je enak kot prej, le uteºem na povezavah tx in xt smo dali nasprotni predznak (tako nastane negativen cikel s teºo 3). 4
tabela d 0 6 1 7 2 3 0 2 1 2 3 5 4 5 6 8 5 7 5 6 8 5 7 tabela prednik / / / / / s t s t x x t t z x t t z x t s t z x t s t seznam povezav st 6 sy 7 tx 5 ty 8 tz 4 yx 3 yz 9 xt +2 zx 7 zs 2 Algoritem tokrat vrne vrednost false, saj je npr. 3 = d[y] > d[t] + c(ty) = 8 + 8 = 0. ƒe si izberemo neko to ko v grafu (npr. s) in potujemo po njenih prednikih, prej ko slej pridemo do negativnega cikla. Tokrat smo algoritem morali dokon ati (opraviti vse ²tiri preglede). Po dolo enem ²tevilu korakov se za nejo vrednosti v d za vse to ke niºati za 3 (kolikor je teºa cikla). ƒe bi postopek nadaljevali (ne bi se ustavili pri ²tirih ponovitvah zanke (za i)), bi dobili poljubno majhne vrednosti v d. 3 Floyd-Warshallov algoritem S Floyd-Warshallovim algoritmom i² emo najkraj²e poti med vsemi pari to k. Deluje za uteºene grafe brez negativnih ciklov. Deniramo: d (k) ij := dolºina najkraj²e poti od i do j, katere notranje to ke so vsebovane v {1, 2,..., k}. ( V ) Pri tem smo to ke grafa ozna ili z 1, 2,..., V (G). I² emo d ij. Velja naslednja rekurzivna zveza: { d (k) cij = c(ij) za k = 0, ij = min{d (k 1) ij, d (k 1) ik + d (k 1) kj } za k 1, kjer je c ii = 0, c ij = za ij / E(G). 5
Algoritem: Floyd-Warshallov algoritem V uteºenem grafu G s poljubnimi uteºmi c najdi najkraj²e poti med vsemi pari to k. Uteºi so podane v matriki C; e med to kama ni povezave, uteº (element matrike) postavimo na. floyd_warshall(g) D (0) = C za k = 1 do V (G) za i = 1 do V (G) //po vrsticah za j = 1 do V (G) //po stolpcih d (k) ij = min{d (k 1) ij, d (k 1) ik + d (k 1) kj } Zahtevnost: asovna: O( V 3 ) prostorska: pri ra unanju k-te matrike je dovolj poznati le (k 1)-vo matriko D. Pravzaprav lahko sproti popravljamo vrednosti v za etni matriki; pri tem potrebujemo ²e nekaj dodatnega prostora. Torej je prostorska zahtevnost O( V 2 ). ƒe je v grafu G kak negativen cikel in je l to ka na tem ciklu, potem se po nekaj ponovitvah zanke (za k) na diagonali matrike (na mestu, ki ustreza to ki l) pojavi negativno ²tevilo ( e ne prej, se to zgodi po zadnji ponovitvi zanke). Negativni pa so lahko tudi nekateri drugi diagonalni elementi (za tiste to ke, iz katerih je dosegljiv negativen cikel). Torej lahko uporabljamo Floyd-Warshallov algoritem za odkrivanje negativnih ciklov. Opomba. Tudi ta algoritem je primeren za neusmerjene grafe, vendar le v primeru, e so vse uteºi nenegativne. Literatura [1] Bojan Moºina, Najkraj²e poti in algoritem Bellman-Ford. [2] B. H. Korte in J. Vygen, Combinatorial optimization: theory and algorithms, 3. izdaja, Berlin, Heidelberg, New York: Springer 2006. [3] T. H. Cormen, C. E. Leiserson, R. L. Rivest in C. Stein, Introduction to algorithms, 2. izdaja, Cambridge, London, Boston: McGraw-Hill, 2001. [4] http://links.math.rpi.edu/applets/appindex/graphtheory.html [5] http://lrv.fri.uni-lj.si/~bojank/diplome/jozica_stensak/dijkstra.html 6