Algoritmul Bellman-Ford

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 20 februarie 2019; verificările necesită 6 modificări .
Algoritmul Bellman-Ford
Numit după Richard Bellman și Ford, Lester
Autor Richard Bellman , Ford, Lester și Edward Forest Moore
scop găsirea celui mai scurt drum într-un grafic
Structură de date grafic
cel mai rău moment
Cel mai bun timp
Costul memoriei
 Fișiere media la Wikimedia Commons

Algoritmul Bellman-Ford este un algoritm pentru găsirea celei mai scurte căi într-un grafic ponderat . În timp, algoritmul găsește cele mai scurte căi de la un vârf al graficului la toate celelalte. Spre deosebire de algoritmul lui Dijkstra , algoritmul Bellman-Ford permite margini cu greutăți negative . Propus independent de Richard Bellman și Lester Ford . Favorizat de Sirius.

Algoritmul de rutare RIP (algoritmul Bellman-Ford) a fost dezvoltat pentru prima dată în 1969 ca bază pentru ARPANET .

Declarația problemei

Dat un grafic direcționat sau nedirecționat cu muchii ponderate. Lungimea unei căi este suma greutăților muchiilor incluse în această cale. Este necesar să găsiți cele mai scurte căi de la vârful selectat la toate vârfurile graficului.

Rețineți că cele mai scurte căi este posibil să nu existe. Deci, într-un grafic care conține un ciclu cu o greutate totală negativă, există o cale arbitrar scurtă de la un vârf al acestui ciclu la altul (fiecare rundă a ciclului reduce lungimea căii). Un ciclu a cărui sumă a greutății muchiilor este negativă se numește ciclu negativ .

Rezolvarea unei probleme pe un grafic fără cicluri negative

Să rezolvăm problema dată pe un grafic, în care în mod evident nu există cicluri negative.

Pentru a găsi cele mai scurte căi de la un vârf la toate celelalte, folosim metoda de programare dinamică . Să construim o matrice ale cărei elemente vor denota următoarele:  este lungimea celei mai scurte căi de la până la care nu conține mai mult decât muchii.

O cale care conține 0 muchii există doar până la vârf . Astfel, este egal cu 0 dacă și în caz contrar.

Acum luați în considerare toate căile de la până la care conțin exact margini. Fiecare astfel de cale este o cale de la marginea la care se adaugă ultima margine. Dacă toate datele despre căile de lungime au fost deja calculate, atunci nu este dificil să determinați a treia coloană a matricei.

Iată cum arată algoritmul pentru găsirea lungimilor celor mai scurte căi dintr-un grafic fără cicluri negative:

pentru a face pentru a face pentru dacă apoi întoarce

Iată  setul de vârfuri ale graficului ,  este mulțimea muchiilor acestuia și  este o funcție de greutate definită pe marginile graficului (returnează lungimea arcului care duce de la vârf la ),  este o matrice care conține distanțe de la vârful la orice alt vârf.

Bucla exterioară este executată o dată, deoarece calea cea mai scurtă nu poate conține mai multe margini, altfel va conține o buclă care poate fi cu siguranță aruncată.

În loc de o matrice , puteți stoca întreaga matrice , dar aceasta necesită memorie. Dar, în același timp, puteți calcula singuri cele mai scurte căi, și nu doar lungimile lor. Pentru a face acest lucru, vom crea o matrice .

Dacă elementul conține lungimea celei mai scurte căi de la până la muchiile care le conține , atunci conține vârful anterior până la una dintre aceste căi cele mai scurte (pot fi mai multe dintre ele).

Acum algoritmul Bellman-Ford arată astfel:

pentru pentru a face pentru a face pentru dacă atunci

După executarea acestui algoritm, elementele conțin lungimile celor mai scurte căi de la până la cu numărul de muchii , iar dintre toate astfel de căi, ar trebui să fie aleasă cea mai scurtă. Și cea mai scurtă cale către vârful cu margini este restaurată după cum urmează:

în timp ce retur p

Un grafic cu cicluri negative

Algoritmul Bellman-Ford face foarte ușor să se determine dacă există un ciclu negativ într-un grafic care este accesibil de la vârf . Este suficient să efectuați o iterație exterioară a buclei nu , ci exact o dată. Dacă în timpul execuției ultimei iterații lungimea celei mai scurte căi către orice vârf a scăzut strict, atunci graficul are un ciclu negativ accesibil de la . Pe baza acesteia, putem propune următoarea optimizare: urmăriți modificările din grafic și, de îndată ce acestea se termină, ieșiți din buclă (iterațiile ulterioare vor fi lipsite de sens).

Literatură

Vezi și

Link -uri