Förstå alla par kortaste vägproblem
Problemet med alla par kortaste vägen (APSP) söker det kortaste avståndet mellan varje par vertiker i en viktad graf. Det är en grundläggande utmaning i grafteori med direkta konsekvenser för nätverksdesign, trafikflödesoptimering, socialt nätverksanalys och logistik. Till skillnad från kortaste källkodsproblem kräver lösning av APSP att beräkna avstånd från varje vertex till alla andra, som skalar kvadratiskt med antalet noder.
Vanliga metoder tar itu med detta problem men möter avvägningar. Floyd-Warshall, en dynamisk programmeringsalgoritm, fungerar på täta grafer men körs i ]O (V]3 ] tid och kan inte hantera negativa viktcykler. Dijkstra algoritm, när de körs från varje vertex, uppnår O (E + V log V)
Jämförelse av gemensamma algoritmer
För att uppskatta Johnsons algoritm, hjälper det att kontrastera de mest använda APSP-lösare:
- Floyd-Warshall - Enkelt att genomföra, använder en 2D-avståndsmatris, uppdateringar via trippelslingor. Arbetar på negativa kanter men inte negativa cykler. Impractical för grafer med tusentals vertikaler på grund av kubiktid.
- Upprepad Dijkstra[ - Kör Dijkstra från varje vertex. Snabbt på glesa grafer (]]]]O(V E log V)] med hjälp av Fibonacci-högar), men begränsas till icke-negativa vikter.
- ]]Bellman-Ford (upprepad) – Hanterar negativa kanter men går i ]]]O(V]]]2 ]], vilket är långsammare än båda alternativen.
- ]Johnsons Algoritm - Reweights the graph så att alla kanter blir icke-negativa, sedan tillämpar upprepade Dijkstra. Det ger O(V E + V ]]]] 2 ]] log V)] med en binär hög, vilket gör det till det föredragna valet för gles grafer med negativa vikter.
Hur Johnsons algoritm fungerar
Johnsons algoritm omvandlar smart en graf som innehåller negativa kanter till en med endast icke-negativa kantvikter, bevara strukturen av kortaste vägar. Denna transformation bygger på en potentiella funktion ] som härrör från en enda körning av Bellman-Ford. När den är omväxlad kan Dijkstras algoritm användas från varje nod säkert. Algoritmen består av fyra steg.
Steg 1: Lägga till en Super Source Node
En ny vertex s läggs till i grafen, ansluten till varje befintlig vertex med en kant av vikt 0. Denna extra nod ändrar inte kortaste vägavstånd eftersom någon väg som använder ]s kan appended utan kostnad.
Steg 2: Beräkning av potentiella funktioner med Bellman-Ford
Om du har en säregenskap (FLT:0) ]. Eftersom ]]s]] har nollviktskanter till alla vertiker, beräknar algoritmen det kortaste avståndet ]]] h(v)]] från ]]]]]]] till varje vertex [[[[[[[[[[[[[[[[[[[[[[[[[[FL]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]][[[[[[[[[[[[[[[[[[[[[[[[[[[[[
Steg 3: Växa över Grafen
Med hjälp av potentialen ]]h(v)], är varje kant ](u, v)]]] med originalvikt ] w(u, v) reweighted to:
w'(u, v)= w(u, v)+ h(u) – h(v)[]]]
Denna omvandling garanterar att varje viktad kant är icke-negativ. Beviset bygger på triangel ojämlikhet: eftersom ]h(v) ≤ h(u) + w(u, v)]] (från Bellman-Fords utgång), följer det att ]] w(u, v) ≥ 0 . Dessutom beställningen av vägar bevaras: den kortaste vägen mellan alla två vertika i den ursprungliga grafen grafen |
Steg 4: Kör Dijkstras Algoritm från varje Vertex
Med den omväxlade grafen som endast innehåller icke-negativa kanter, Dijkstra algoritm drivs en gång från varje vertex. Varje körning beräknar de kortaste avstånden till alla andra vertikaler. De resulterande avstånden omvandlas sedan tillbaka till ursprungliga kantvikter med hjälp av formeln:
]][[]]] original[(u, v)= dist ]]]]]]]][](u, v) - h(u) + h(v)[]]]]]]]]]]]]
Detta sista steg säkerställer att de rapporterade avstånden är korrekta för den ursprungliga grafen.
Komplexitet och prestandaanalys
Johnsons algoritm uppnår en total tidskomplexitet av O (VE + V ]2 ]] log V) när den genomförs med en binär hög prioritetskö. Bellman-Ford steg går i ]O(V E) och den efterföljande
Med hjälp av en Fibonacci-hög kan minska Dijkstras del till O (V E + V ]]] 2 ]] log V)] amorterad, men i praktiken är binära högar enklare och ofta tillräckligt snabba. Minnesfotavtrycket är ]]O(V 2 för distansmatrisen, men detta kan förbättras medförhöjning.
Praktiska tillämpningar
Johnsons algoritm är anställd på domäner där grafkanter kan bära negativa kostnader och kortaste avstånd från hela talet krävs. Real-world exempel inkluderar:
- Nätverksruttning: Internetleverantörer och telenätverk använder distribuerade routingprotokoll som måste anpassas för att beräkna den billigaste vägen mellan två routrar, även när kopplingskostnaderna fluktuerar eller blir negativa (t.ex. på grund av överbelastning eller policyrabatter).
- Urban transportplanering: Kartläggning och logistikföretag (t.ex. Google Maps, OpenStreetMap routing engines) beräkna kortaste vägar mellan många ursprungsdestinationspar för flotta optimering. Negativa vikter kan modellera subventioner eller tidsbaserade rabatter.
- Supply chain cost minimization: ] I multistegsproduktionsnätverk kan kostnader från en nod till en annan vara negativa (t.ex. rabatter). Johnsons algoritm finner de mest lönsamma rutterna över hela försörjningskedjan.
- ] Social nätverksanalys:[]] Mätning av centrala närhet eller mellanhets centralitet kräver alla paravstånd. Negativa kanter kan representera "vän-of-a-vän" rabatt länkar eller motsatta relationer.
- ]Ekonomiska ingångsutgångsmodeller: Leontief-modeller och flödesanalyser involverar ofta negativa koefficienter; Johnsons algoritm beräknar nettoeffekten av att föröka förändringar genom en sammankopplad ekonomi.
För vidare läsning på matematiska grunder, se ] Wikipedias detaljerade inträde ] och det ursprungliga papperet av Donald B. Johnson (1977) . Ett praktiskt genomförande i Python kan hittas på ]NetworkXs GitHub repository ], som inkluderar Johnsons algoritm som en standardfunktion. För en djupare förståelse av den omväxande tekniken, CPtoritting
Slutsats
Johnsons algoritm framstår som en elegant och praktisk lösning på alla par kortaste vägen problem när negativa kantvikter är närvarande. Genom att kombinera robustheten av Bellman-Ford (för att upptäcka negativa cykler och datorer potentialer) med hastigheten på Dijkstra (för icke-negativa grafer), uppnår den utmärkt prestanda på glesa nätverk. Den omvälvande tekniken själv är en vacker tillämpning av potentiella funktioner - ett koncept som sträcker sig långt utöver kortaste vägar i områden som minsta flöde och algoritmisk spel teori.
När man står inför ett verkligt APSP-problem där grafer är glesa och kan innehålla negativa kanter, bör Johnsons algoritm vara den första övervägande. Dess teoretiska garantier och utbredd implementering i bibliotek (t.ex. NetworkX ], ]]]Boost Graph Library ) gör det praktiskt att anta.