Table of Contents
Înțelegerea problemei celei mai scurte căi a tuturor perechilor
Problema tuturor perechilor (APSP) caută cea mai scurtă distanță între fiecare pereche de vertice într-un grafic ponderat. Este o provocare fundamentală în teoria grafică cu implicații directe pentru proiectarea rețelei, optimizarea fluxului de trafic, analiza rețelei sociale și logistică. Spre deosebire de problemele de cale cu cea mai scurtă sursă, rezolvarea APSP necesită distanțe de calcul de la fiecare vertex la toate celelalte, care se scalează cvadrat cu numărul de noduri.
Abordările comune abordează această problemă, dar se confruntă cu compromisuri. Floyd-Warshall, un algoritm de programare dinamică, funcționează pe grafice dense, dar rulează în O(V3]] timp și nu poate gestiona cicluri de greutate negativă. Dijkstra intermediul algoritmului, atunci când rulează de la fiecare vertex, realizează O(V (E + V log V) ]]] cu un morman binar, dar nu reușește pe grafice cu greutăți negative. Pentru graficele de bază, Johnson algoritmul de poduri acest decalaj prin combinarea celor mai bune dintre cele două metode în timp ce manipularea greutăți negative nu există cicluri negative.
Compararea algelor comune
Pentru a aprecia algoritmul Johnson . Acesta ajută la contrast cele mai frecvent utilizate rezolvatoare APSP:
- Floyd-Warshall
- Repeted Dijkstra
- Bellman-Ford (repetat)
- Johnsons Algorithm
Cum funcționează Johnson ?
Johnson algoritmul se transformă inteligent un grafic care conține margini negative într-unul cu doar greutăți de margine non-negative, păstrând structura de căi mai scurte. Această transformare se bazează pe o funcție potențial] derivat dintr-un singur termen de Bellman-Ford. Odată repondered, algoritmul Dijkstrassras poate fi utilizat de la fiecare nod în condiții de siguranță. Algoritmul constă din patru pași.
Pasul 1: Adăugarea unui nod super-sursa
Un vertex nou s se adaugă în grafic, conectat la fiecare vertex existent cu o margine de greutate 0. Acest nod suplimentar nu modifică distanțele de cale cele mai scurte, deoarece orice cale care utilizează s poate fi anexată fără costuri.
Pasul 2: Calcularea funcțiilor potențiale cu Bellman-Ford
Rulați algoritmul Bellman-Ford de la super-sursa s[.Pentru că s are margini de zero-greutate la toate verticele, algoritmul calculează cea mai scurtă distanță h(v]]s] la fiecare vertex v. Această distanță servește ca o funcție potențială. Dacă un ciclu negativ este detectat în timpul acestei curse, graficul original conține un ciclu negativ, iar algoritmul Johnsons raportează că nu există un set valid de căimituri mai mici.
Pasul 3: Reîngrădirea graficului
Utilizarea potențialului h(v), fiecare margine [(u, v] cu greutatea inițială w(u, v]] este redistribuită la:
w' [u, v) = w(u, v) + h(u)
Această transformare garantează că fiecare greutate de margine reevaluată este non-negativă. Dovada se bazează pe inegalitatea triunghiului: deoarece [h(v) ≤ h(u) + w(u, v) (din Bellman-Ford
Pasul 4: Rularea Dijkstra
Cu graficul reponderat care conține doar margini non-negative, algoritmul Dijkstra
dist[original[(u, v) = distreponder (u, v)
Acest ultim pas asigură că distanţele raportate sunt exacte pentru graficul original.
Analiza complexității și a performanțelor
Algoritmul Johnson O[V + V[2[ log V]] V Dijkstra rulează fiecare coadă prioritară binară O(E + V log V)]] pe graficele dense. Pentru graficele dense []E 2], pentru graficele dense O]]] algoritmul este mai eficient.
Folosind un morman de Fibonacci se poate reduce partea Dijkstra
Aplicații practice
Algoritmul Johnson este utilizat în domenii în care marginile grafice pot transporta costuri negative și toate-pere distanţe scurte sunt necesare. Exemple din lumea reală includ:
- Tratamentul de rețea: Furnizorii de servicii de internet și rețelele de telecomunicații utilizează protocoale de rutare distribuite care trebuie să calculeze în mod adaptabil calea cea mai ieftină dintre oricare două rute, chiar și atunci când costurile de legătură fluctuează sau devin negative (de exemplu, din cauza congestionării sau a reducerii politicilor).
- Planificarea transportului urban: Mapping și companii logistice (de exemplu, Google Maps, motoare de rutare OpenStreetMap) calculează cele mai scurte căi între multe perechi de destinație de origine pentru optimizarea flotei. Greutăți negative pot modela subvenții sau reduceri bazate pe timp.
- Minimizarea costurilor lanțului de aprovizionare:[ În rețelele de producție în mai multe etape, costurile de la un nod la altul ar putea fi negative (de exemplu, zz/ll). Algoritmul Johnson se găsește pe cele mai profitabile rute din întregul lanț de aprovizionare.
- Analiza rețelei sociale: Măsurarea centralității de apropiere sau a interdependenței necesită distanțele de orice pereche. Marginile negative pot reprezenta linkuri de reducere sau relații adversariale.
- Modelele economice de intrare-ieșire:Modelele Leontief și analizele fluxurilor implică adesea coeficienți negativi; algoritmul Johnson face calculul efectului net al modificărilor de propagare printr-o economie interconectată.
Pentru a citi mai departe pe bazele matematice, a se vedea Wikipedia
Concluzie
Johnson . Algoritmul Johnson se remarcă ca o soluție elegantă și practică la problema tuturor-perechilor cel mai scurt drum atunci când sunt prezente greutățile negative margine. Prin combinarea robustețea Bellman-Ford (pentru detectarea ciclurilor negative și a potențialului de calcul) cu viteza de Dijkstra (pentru grafice non-negative), acesta atinge performanțe excelente pe rețele neatinse. Tehnica de reîncărcare în sine este o aplicare frumoasă a funcțiilor potențiale. Conceptul care se extinde mult peste cele mai scurte căi în domenii, cum ar fi fluxul minim-cost și teoria jocului algoritmic.
Atunci când se confruntă cu o problemă APSP din lumea reală în care graficele sunt rare și pot conține margini negative, algoritmul Johnson