L'algorisme de Bellman-Ford (o algorisme de Bell-End-Ford) genera el camí més curt en un graf dirigit ponderat en què el pes de les arestes pot ser negatiu. L'algorisme de Dijkstra resol aquest mateix problema en un temps menor, però requereix que els pesos de les arestes no siguin negatius. Aquest algorisme va ser desenvolupat per Richard Bellman, Samuel End i Lester Ford.
Segons Robert Sedgewick, "Els pesos negatius no són simplement una curiositat matemàtica; [...] sorgeixen d'una manera natural en la reducció a problemes de camins més curts", i són un exemple d'una reducció del problema del camí hamiltonià que és NP-complet fins al problema de camins més curts amb pesos generals. Si un graf conté un cicle de cost total negatiu llavors aquest graf no té solució. L'algorisme és capaç de detectar aquest cas.
Si el graf conté un cicle de cost negatiu, l'algorisme ho detectés, però no trobarà el camí més curt que no repeteix cap vèrtex. La complexitat d'aquest problema és almenys la del problema del camí més llarg de complexitat NP-Complet.
L'algorisme de Bellman-Ford és, en la seva estructura bàsica, molt semblant a l'algorisme de Dijkstra, però en comptes de seleccionar voraçment el node de pes mínim fins i tot sense processar per relaxar-se, simplement relaxa totes les arestes, i ho fa |V|-1 vegades, sent |V| el nombre de vèrtexs al graf. Les repeticions permeten a les distàncies mínimes recórrer l'arbre, ja que en l'absència de cicles negatius, el camí més curt només visita cada vèrtex una vegada. A diferència de la solució voraç, la qual depèn de la suposició que els pesos siguin positius, aquesta solució s'aproxima més al cas general.
Hi ha dues versions:
BellmanFord (Graf G, node_origen s) // inicialitzar el graf. Posem distàncies a INFINIT menys el node origen que // té distància 0 For v ∈ V [G] do distància [v] = INFINIT predecessor [v] = NIL
distància [s] = 0
// relaxem cada aresta del graf tantes vegades com nombre de nodes -1 hi hagi al graf For i = 1 to |V [G] -1| do For (u, v) ∈ E [G] do If distància [v] > distància [u] + pes (u, v) then distància [v] = distància [u] + pes (u, v) predecessor [v] = u
// comprovem si hi ha cicles negatius For (u, v) ∈ E [G] do If distància [v] > distància [u] + pes (u, v) then print ("Hi ha cicle negatiu") Return FALSE Return TRUE
BellmanFord_Optimitzat (Graf G, node_origen s) // inicialitzar el graf. Posem distàncies a INFINIT menys el node origen que // té distància 0. Per això ho fem recorrent tots els vèrtexs del graf For v ∈ V [G] do distància [v] = INFINIT pare [v] = NIL distància [s] = 0 encuar (s, Q) encuat [s] = TRUE Mentre Q ! = 0 then u = extreure (Q) encuat [u] = FALSE // relaxem les arestes For v ∈ adj [u] do If distància [v] > distància [u] + pes (u, v) then distància [v] = distància [u] + pes (u, v) pare [v] = u If encuat [v] == FALSE then encuar (v, Q) encuat [v] = TRUE
La correcció de l'algorisme es pot demostrar per inducció. La demostració és la següent:
Lema. Després i repeticions del bucle for:
Demostració. Per al cas base de la inducció, considerem i = 0 i just abans el bucle for és executat per primera vegada. Després, per al vèrtex origen distància (origen) = 0, el que és cert. Per a qualsevol altre vèrtex o distància (u) = INFINIT, la qual cosa és també correcte perquè no hi ha camí des d'origen fins o amb 0 arestes.
Una variant distribuïda de l'Algorisme de Bellman-Ford s'usa en protocols d'encaminament basats en vector de distàncies, per exemple el Protocol d'encaminament d'informació (RIP). L'algorisme és distribuït perquè envolta una sèrie de nodes (routers) dins d'un Sistema autònom (AS), un conjunt de xarxes i dispositius router IP administrats típicament per un Proveïdor de Servei d'Internet (ISP). Es compon dels següents passos:
Els desavantatges principals de l'algorisme de Bellman-Ford a aquest ajust són:
El 1970 Ien va descriure una millora de l'algorisme Bellman-Ford per a un graf sense cicles amb pes negatiu. Aquesta millora primer assigna un ordre arbitrari lineal a tots els vèrtexs i després divideix el conjunt de totes les arestes en un o dos subconjunts. El primer subconjunt, Ef, conté totes les arestes (vi, vj) tals que i<j, mentre que el segon, Eb, conté arestes (vi, vj) tals que i>j. Cada vèrtex es visita amb vista v1, v₂, ..., v|v|, relaxant cada aresta sortint d'aquest vèrtex a Ef. Cada vèrtex és, després, visitat amb vista v|v|, v|v|, ..., v1, relaxant cada aresta sortint d'aquest vèrtex a Eb. La millora de Ien redueix a la meitat, de manera efectiva, el nombre de passos requerits per a la solució del camí més curt des d'una única font.