Belman-Fordov algoritam

S Vikipedije, slobodne enciklopedije
Belman-Fordov algoritam
Namena Nalaženje najkraćeg puta (za usmerene težinske grafove)
Struktura podataka Graf
Vremenska kompl.
Memorijska kompl.

Belman-Fordov algoritam je algoritam koji računa najkraći put iz jednog ka svim drugim čvorovima u težinskom digrafu.[1] Sporiji je od Dejkstrinog algoritma, ali je prilagodljiviji, zato što može da radi i sa grafovima čije su neke ivice negativnih težina. Algoritam je imenovan po svoja dva razvijaoca, Ričardu Belmanu i Lesteru Fordu Mlađem, koji su ga objavili 1958. i 1956.; međutim, Edvard F. Mur je takođe objavio isti algoritam 1957, zbog čega se algoritam ponekad naziva Belman-Ford-Murov algoritam.[1]

Ivice sa negativnim težinama se mogu naći u mnogim primenama grafova, što čini ovaj algoritam veoma korisnim.[2] Međutim, ako graf sadrži "negativni ciklus", npr., ciklus čije ivice imaju negativni zbir, onda nema najjeftinijeg puta, zato što u tom slučaju svaki put može postati jeftiniji ako se još jednom prođe kroz negativni ciklus. U takvim slučajevima, Belman-Fordov algoritam može otkriti negativne cikluse i prijaviti njihovo postojanje, ali ne može proizvesti tačan najkraći put ukoliko se do negativnog ciklusa može doći iz početnog čvora.[1][3]

Algoritam[uredi | uredi izvor]

U ovom primeru, pod pretpostavkom da je A početni čvor i da se ivice obilaze u najgorem mogućem poredku, zdesna ulevo, potrebno je punih |V|−1 ili 4 iteracija kako bi procene daljine konvergirale. Nasuprot tome, ako su ivice obrađene u najboljem mogućem redosledu, sleva udesno, algoritam konvergira u jednu iteraciju.

Kao i Dejkstrin algoritam, Belman-Fordov je osnovan na principu iterativne metode po imenu relaksacija, u kome se aproksimacija tačne udaljenosti postepeno smenjuje tačnijom vrednošću sve dok se eventualno ne dostigne optimalno rešenje. U oba algoritma, približna udaljenost do svakog čvora je uvek precenjena vrednost tačne udaljenosti, i zamenjuje se minimumom svoje stare vrednosti i dužine novootkrivenog puta. Međutim, Dejkstrin algoritam pohlepno bira čvor sa najmanjom težinom koji još uvek nije posećen, i ponavlja isti postupak na svim ostalim ivicama; u poređenju, Belman-Fordov algoritam jednostavno relaksira sve ivice, i to čini |V | − 1 puta, gde je |V | broj čvorova u grafu. U svakom novom ponavljanju, broj čvorova sa tačno izračunatom udaljenosti raste, odakle sledi da će eventualno svi čvorovi imati tačno izračunate udaljenosti. Ova metoda dopušta Belman-Fordovom algoritmu da se koristi na širu klasu ulaza od Dejkstrinog.

Belman-Ford se izvršava u vremenu O(|V|·|E|), gde su |V| i |E| brojevi čvorova i ivica.

procedure BellmanFord(list vertices, list edges, vertex source)
   // Ova implementacija prima graf, predstavljen kao lista čvorova – vertices,
   // i ivica - edges, i popunjava dva niza (udaljenost – distance,
   // prijethodnik – predecessor) informacijama o najkraćem putu

   // Korak 1: Inicijalizacija grafa
   for each vertex v in vertices:
       if v is source then distance[v] := 0
       else distance[v] := infinity
       predecessor[v] := null

   // Korak 2: Ponovljena relaksacija ivica
   for i from 1 to size(vertices)-1:
       for each edge (u, v) with weight w in edges:
           if distance[u] + w < distance[v]:
               distance[v] := distance[u] + w
               predecessor[v] := u

   // Korak 3: Provjera da li postoje ciklusi sa negativnom težinom
   for each edge (u, v) with weight w in edges:
       if distance[u] + w < distance[v]:
           error "Graph contains a negative-weight cycle"

Dokaz korektnosti[uredi | uredi izvor]

Korektnost algoritma se može pokazati matematičkom indukcijom.

Lema. Nakon i ponavljanja for petlje:

  • Ako Distance(u) nije beskonačno, onda je jednako dužini putanje od s do u;
  • Ako postoji put od s do u sa najviše i ivica, onda Distance(u) nije veće od dužine najkraćeg puta od s do u sa najviše i ivica.

Dokaz. Za bazni slučaj indukcije, razmatrajmo i = 0 i trenutak pre nego što je for petlja pokrenuta po prvi put. U tom slučaju je, za početni čvor, source.distance = 0, što je tačno. Za ostale čvorove u važi u.distance = infinity, što je takođe tačno, zato što ne postoji put iz source do u sačinjen od 0 ivica.

U induktivnom koraku, prvo dokazujemo prvi korak. Razmatrajmo trenutak kada se udaljenost čvora menja sa v.distance := u.distance + uv.weight. Po induktivnoj hipotezi, u.distance je dužina nekog puta od source do u. onda je u.distance + uv.weight dužina puta od source do v koja prati put od source do u a onda ide do v.

Što se tiče drugog koraka, razmatrajmo najkraći put od source do u sa najviše i ivica. Neka je v čvor pre u na ovom putu. Onda, deo puta od source do v je najkraći put od source do v sa najviše i-1 ivica. Po induktivnoj hipotezi, v.distance posle i−1 iteracija petlje nije veća od dužine ovog puta. Odatle sledi da uv.weight + v.distance nije veća od dužine puta od s do u. U i-toj iteraciji, u.distance se poredi sa uv.weight + v.distance, i jednaka joj je ukoliko je uv.weight + v.distance bilo manje. Dakle, posle i iteracija, u.distance nije veće od dužine najkraćeg puta od source do u sa najviše i ivica.

Ukoliko nema ciklusa sa negativnom težinom, onda svaki najkraći put poseti svaki čvor najviše jednom, tako da se u trećem koraku ne može napraviti neko poboljšanje. Nasuprot tome, pretpostavimo da se ne može napraviti poboljšanje. onda za svaki ciklus sa čvorovima v[0], ..., v[k−1] važi,

v[i].distance <= v[(i-1) mod k].distance + v[(i-1) mod k]v[i].weight

Sumiranjem oko ciklusa, v[i].distance i v[i−1 (mod k)] distance se potiru, ostavljajući 0 <= sum from 1 to k of v[i-1 (mod k)]v[i].weight

To jest, svaki ciklus ima nenegativnu vrednost.

Nalaženje negativnih ciklusa[uredi | uredi izvor]

Kada se algoritam koristi za pretragu najkraćeg puta, postojanje negativnih ciklusa je problem koji sprečava algoritam da pronađe tačan odgovor. Međutim, s obzirom da staje kada naiđe na negativni ciklus, Belman-Fordov algoritam se može koristiti u aplikacijama u kojoj je to cilj - na primer u tehnikama poništavanja ciklusa u analizi transportacionih mreža.[1]

Primena u rutiranju[uredi | uredi izvor]

Distribuirana varijanta Belman-Fordovog algoritma se koristi u protokolima rutiranja na osnovu vektora udaljenosti, na primer, u RIP-u. Algoritam je distribuiran zato što uključuje neki broj čvorova (rutera) unutar autonomnog sistema, skupa IP mreža koje su uglavnom u vlasništvu nekog ISP-a. Sastoji se iz sledećih koraka:

  1. Svaki čvor računa rastojanje između sebe i svih drugih čvorova unutar AS-a i skladišti ovu informaciju unutar tabele.
  2. Svaki čvor šalje svoju tabelu susednim čvorovima.
  3. Kada čvor primi tabelu od svojis suseda, on izračunava najkraću putanju do svih drugih čvorova i menja svoju tabelu ukoliko je došlo do nekih promena.

Glavne mane Belman-Fordovog algoritma u ovom okruženju su:

  • Skaliranje se ne vrši dobro.
  • Promene u topologiji mreže se ne odražavaju brzo, pošto se ispravke šire sa čvora na čvor.
  • Problem brojenja do beskonačnosti (ukoliko usled neke greške dođe do toga da je neki čvor nedostižan iz nekog skupa drugih čvorova, ti čvorovi mogu da povećavaju svoje procene rastojanja do nedostižnog čvora).

Unapređenja[uredi | uredi izvor]

Belman-Fordov algoritam se može unaprediti u praksi (ali ne i u najgorem slučaju) uz posmatranje da, ukoliko se iteracija glavne petlje algoritma terminira bez pravljenja nekih promena, algoritam se može istog trenutka terminira, zato što naredne iteracije neće praviti izmene. Uz ovaj uslov, glavna petlja u nekim slučajevima ima mnogo manje od |V| − 1 iteracija, iako najgori slučaj algoritma ostaje nepromenjen.

Jen (1970) opisuje još dva unapređenja Belman-Fordovog algoritma za graf bez ciklusa negativne težine; opet, iako čine algoritam brži u praksi, ne menjaju njegov najgori slučaj od O(|V|*|E|). Njegovo prvo unapređenje smanjuje broj relaksacionih koraka koji su potrebni za svaku iteraciju algoritma. Ako čvor v ima udaljenost koja se nije promenila od poslednjeg puta kada su se ivice koje idu iz v relaksirale, onda nema potrebe relaksirati ivice iz v po drugi put. Na ovaj način, kako se broj čvorova sa tačnim udaljenostima povećava, broj ivica koje trebaju da se relaksiraju u svakoj iteraciji smanjuje, što vodi do konstantnog ušteđenja vremena za guste grafove.

Jenovo drugo unapređenje prvo dodeljuje arbitrarni linearni red svim čvorovima i onda particioniše skup svih čvorova na dva podskupova. Prvi podskup, Ef, sadrži sve ivice (vi, vj) takve da je i < j; drugi podskup, Eb, sadrži ivice (vi, vj) takve da je i > j. Svaki čvor je posećen redom v1, v2, ..., v|V|, relaksirajući svaku ivicu koja ide od tog čvora iz Ef. Svaki čvor se onda posećuje redom v|V|, v|V|−1, ..., v1, relaksirajući svaku ivicu koja ide iz čvora Eb. Svaka iteracija u glavnoj petlji algoritma, posle prve, dodaje barem dve ivice u skup ivica čije se relaksirane udaljenosti poklapaju sa tačnim najkraćim putem: jedna iz Ef i jedna iz Eb. Ova modifikacija smanjuje broj iteracija glavne petlje u najgorem slučaju sa |V| − 1 na |V|/2.[4][5]

Još jedno unapređenje od strane Banistera i Epštajna (2012), zamenjuje arbitrarni linearni red čvorova korišćenih u Jenovom drugom unapređenju sa nasumičnom permutacijom. Ova promena čini da se najgori slučaj za Jenovo unapređenje (u kome čvorovi najkraćeg puta striktno alterniraju između dva podskupa Ef i Eb) veoma teško dogodi. Sa nasumičnom permutacijom redosleda čvorova, očekivana vrednost za broj iteracija potrebnih u glavnoj petnji je najviše |V|/3.[5]

Reference[uredi | uredi izvor]

  1. ^ a b v g Bang-Jensen & Gutin 2000
  2. ^ Sedgewick 2002
  3. ^ Kleinberg & Tardos 2006
  4. ^ Cormen et al., 2nd ed., Problem 24-1, pp. 614–615.
  5. ^ a b Pogledajte Sedžvikova vežbanja pod Algorithms, 4th ed., vežbanja 5 i 11 (preuzeto 2013-01-30).

Literatura[uredi | uredi izvor]

Originalni izvori[uredi | uredi izvor]

Sekundarni izvori[uredi | uredi izvor]

  • Bang-Jensen, Jørgen; Gutin, Gregory (2000). „Section 2.3.4: The Bellman-Ford-Moore algorithm”. Digraphs: Theory, Algorithms and Applications (First izd.). ISBN 978-1-84800-997-4. 
  • Introduction to Algorithms, Second Edition. . MIT Press and McGraw-Hill. 2001. ISBN 978-0-262-03293-3. .. Section 24.1: The Bellman–Ford algorithm, pp. 588-592. Problem 24-1, pp. 614-615. Third Edition. . MIT Press. 2009. ISBN 978-0-262-53305-8. . Section 24.1: The Bellman–Ford algorithm, pp. 651-655.
  • Heineman, George T.; Pollice, Gary; Selkow, Stanley (2008). „Chapter 6: Graph Algorithms”. Algorithms in a Nutshell. O'Reilly Media. str. 160—164. ISBN 978-0-596-51624-6. 
  • Kleinberg, Jon; Tardos, Éva (2006). Algorithm Design. New York: Pearson Education, Inc. 
  • Sedgewick (computer scientist), Robert (2002). „Section 21.7: Negative Edge Weights”. Algorithms in Java (3rd izd.). ISBN 978-0-201-36121-6. Arhivirano iz originala 31. 05. 2008. g. Pristupljeno 29. 05. 2013. 

Spoljašnje veze[uredi | uredi izvor]