Johnson algoritmus | |
Kategória | Legrövidebb út probléma (súlyozott gráfok esetében) |
Adatstruktúra | Gráf |
Legrosszabb időbonyolultság |
Johnson algoritmusa lehetővé teszi a legrövidebb utak megtalálását az összes csúcspár között egy súlyozott élekkel rendelkező irányított gráfban . Lehetőséget ad arra, hogy egyes élek súlya negatív szám legyen, de nem lehet negatív súlyozott kör. A Bellman – Ford algoritmus segítségével működik egy olyan bemeneti gráf transzformációjának kiszámításához, amely eltávolítja az összes negatív súlyt, lehetővé téve Dijkstra algoritmusának használatát a transzformált gráfon.[1][2] Donald B. Johnson után nevezték el az algoritmust, aki 1977-ben publikálta a technikát.[3]
Hasonló újra-súlyozási technikát alkalmaznak Suurballe algoritmusában is, hogy két nem negatív élsúlyú grafikonon két minimális teljes hosszúságú és diszjunkt utat keressen ugyanazon két csúcs között.[4]
Johnson algoritmusa a következő lépésekből áll.[1][2]
Johnson algoritmusának első három szakaszát a jobb oldali ábra szemlélteti.
A kép bal oldalán látható gráfnak két negatív éle van, de nincs negatív köre. A középső gráfon látható az új q csúcs, a Bellman – Ford algoritmus által kiszámított legrövidebb útvonal fája, a q kezdő csúccsal, és a h(v) érték amely csomópontonként számolódik mégpedig aszerint, hogy mennyi a legrövidebb út távolsága a q-tól az adott csomópontig. Figyelembe kell venni, hogy ezek az értékek nem pozitívak, mivel a q-nak nulla hosszúságú éle van minden egyes csúcsnál, és a legrövidebb út nem lehet hosszabb, mint az él. A jobb oldalon látható az újra súlyozott gráf, amelyet az egyes élsúlyok kicserélésével alakítottak ki (w(u, v) => w(u,v) + h(u) − h(v))..Ezen újra súlyozott gráfban az egyik él súlya sem negatív, de bármely két csomópont közötti legrövidebb útvonal ugyanazon éleket használja, mint az eredeti grafikon két csúcsa közötti legrövidebb út. Az algoritmus úgy fejeződik be, hogy Dijkstra algoritmusát alkalmazzuk az újra súlyozott gráfokon mind a négy kezdő csomópontra.
Az újra súlyozott gráfokon az összes s és t csomópont közötti útvonal azonos h(s) − h(t) értékekkel egészül ki. Az előző állítás a következőkkel bizonyítható: Legyen p egy adott s – t útvonal. A W értéke az újrasúlyozott gráfon az alább látható kifejezés alapján számítható:
Minden megszünteti a -t az előző zárójeles kifejezésben; így a következőre változik a W számításának kifejezése:
Az zárójelezett kifejezés a p súlya. (az eredeti súlyozás alapján)
Mivel az újbóli súlyozás ugyanazt a súlyt rendeli hozzá minden s – t útvonalhoz, egy út az eredeti súlyozásban akkor számít a legrövidebb útvonalnak, és csak akkor, ha az az újra súlyozás után is a legrövidebb. Az élek súlya ami a legrövidebb útvonalhoz tartozik nulla a q-tól akármelyik csomópontig, ezért a legrövidebb út távolsága a q-tól bármelyik csomópont felé nulla lesz az újra súlyozott gráfon, azonban továbbra is a legrövidebb útnak számít. Ezért nem lehetnek negatív élek: ha az uv él negatív tömegű lesz az újbóli súlyozás után, akkor a q és u közötti nullhosszúság ezzel az éllel egy negatív hosszúságú útvonalat képez q-tól v-ig, ellentmondva annak, hogy az összes csúcs nulla távolságra van q-tól . A negatív élek hiánya biztosítja a Dijkstra algoritmusa által megtekintett útvonalak optimalitását. Az eredeti gráfban szereplő távolságok kiszámíthatók a Dijkstra algoritmusa által kiszámított távolságokból az újra súlyozott gráfon az újra súlyozási átalakítás megfordításával.[1]
Ennek az algoritmusnak az idő bonyolultsága, a Fibonacci halom felhasználásával és Dijkstra algoritmusának megvalósításában: Továbbá az algoritmus Bellman – Ford szakaszának ideje, és idő a minden példányára a Dijkstra algoritmusban. Így ha a gráf ritka, az összideje gyorsabb lehet, mint a Floyd – Warshall algoritmus, amely ugyanazt a problémát oldja meg adott idővel: .[1]