„PgRouting” változatai közötti eltérés

Innen: GIS Wiki
Ugrás a navigációhoz Ugrás a kereséshez
Benek (vitalap | szerkesztései)
Új oldal, tartalma: „== Algoritmusok == '''Dijkstra algoritmus''' (Shortest Path Dijkstra) A Dijkstra algoritmus egy súlyozott élű, irányított <math>G=(V,E)</math> gráf adott csúc…”
 
Benek (vitalap | szerkesztései)
Nincs szerkesztési összefoglaló
1. sor: 1. sor:
== Algoritmusok ==
== Algoritmusok ==


 
=== Dijkstra algoritmus ===
'''Dijkstra algoritmus'''
(Shortest Path Dijkstra)
 
A Dijkstra algoritmus egy súlyozott élű, irányított <math>G=(V,E)</math> gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt <math>w</math>. Az algoritmus mohó módszert használ. Legyen a kiindulási pont <math>s</math>, a célállomás pedig <math>t</math>. Az algoritmus egy <math>H</math> halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az <math>s</math>-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden <math>u</math> csúcsról nyilvántartunk az algoritmus futása során egy <math>D[u]</math> értéket, ami az <math>s</math>-ből <math>u</math>-ba vezető addig megismert legrövidebb út hossza.
A Dijkstra algoritmus egy súlyozott élű, irányított <math>G=(V,E)</math> gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt <math>w</math>. Az algoritmus mohó módszert használ. Legyen a kiindulási pont <math>s</math>, a célállomás pedig <math>t</math>. Az algoritmus egy <math>H</math> halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az <math>s</math>-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden <math>u</math> csúcsról nyilvántartunk az algoritmus futása során egy <math>D[u]</math> értéket, ami az <math>s</math>-ből <math>u</math>-ba vezető addig megismert legrövidebb út hossza.


14. sor: 11. sor:
<math>O(|E|+|V|\log |V|)</math>.
<math>O(|E|+|V|\log |V|)</math>.


 
=== Kétirányú Dijkstra algoritmus ===
'''Kétirányú Dijkstra algoritmus'''
(Bi-directional Dijkstra Shortest Path)
 
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított <math>G=(V,E)</math> gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont <math>s</math>, a célállomást pedig <math>t</math>. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy <math>v</math> csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált <math>H</math> halmazba (pontosabban a <math>H_s</math> és a <math>H_t</math> halmazba is). Egy alternatív lehetőség, hogy a <math>H_s</math> és a <math>H_t</math> halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél <math>D[x]</math> kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad <math>s</math>-ből <math>t</math>-be.
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított <math>G=(V,E)</math> gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont <math>s</math>, a célállomást pedig <math>t</math>. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy <math>v</math> csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált <math>H</math> halmazba (pontosabban a <math>H_s</math> és a <math>H_t</math> halmazba is). Egy alternatív lehetőség, hogy a <math>H_s</math> és a <math>H_t</math> halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél <math>D[x]</math> kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad <math>s</math>-ből <math>t</math>-be.


 
=== k-Dijkstra algoritmus ===
'''<math>k</math>-Dijkstra algoritmus'''
(<math>k</math>-Dijkstra, One to Many Shortest Path)
 
A <math>k</math>-Dijkstra algoritmus egy súlyozott élű, irányított <math>G=(V,E)</math> gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált <math>H</math> halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.
A <math>k</math>-Dijkstra algoritmus egy súlyozott élű, irányított <math>G=(V,E)</math> gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált <math>H</math> halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.


29. sor: 20. sor:
<math>O(|E|+|V|\log |V|)</math>.
<math>O(|E|+|V|\log |V|)</math>.


 
=== A* algoritmus ===
'''<math>A^\ast</math> algoritmus'''
(Shortest Path <math>A^\ast</math>)
 
Az <math>A^\ast</math> algoritmus egy súlyozott élű, irányított <math>G=(V,E)</math> gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az <math>A^\ast</math> algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt <math>w</math>. Az algoritmus mohó módszert használ. Legyen a kiindulási pont <math>s</math>, a célállomás pedig <math>t</math>. Az algoritmus egy <math>H</math> halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az <math>s</math>-ből hozzávezető legrövidebb út hosszát, egy <math>M</math> halmazban pedig azokat, amelyeket már elértünk <math>s</math>-ből, de az <math>s</math>-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden <math>u</math> csúcsról nyilvántartunk az algoritmus futása során három értéket: <math>D[u]</math> az <math>s</math>-ből <math>u</math>-ba vezető addig megismert legrövidebb út hossza, <math>C[u]</math> egy nem negatív heurisztikus alsó becslés az <math>u</math>-ból <math>t</math>-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az <math>u</math>-ból bármely <math>v</math> csúcsba vezető legrövidebb út hosszára  
Az <math>A^\ast</math> algoritmus egy súlyozott élű, irányított <math>G=(V,E)</math> gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az <math>A^\ast</math> algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt <math>w</math>. Az algoritmus mohó módszert használ. Legyen a kiindulási pont <math>s</math>, a célállomás pedig <math>t</math>. Az algoritmus egy <math>H</math> halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az <math>s</math>-ből hozzávezető legrövidebb út hosszát, egy <math>M</math> halmazban pedig azokat, amelyeket már elértünk <math>s</math>-ből, de az <math>s</math>-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden <math>u</math> csúcsról nyilvántartunk az algoritmus futása során három értéket: <math>D[u]</math> az <math>s</math>-ből <math>u</math>-ba vezető addig megismert legrövidebb út hossza, <math>C[u]</math> egy nem negatív heurisztikus alsó becslés az <math>u</math>-ból <math>t</math>-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az <math>u</math>-ból bármely <math>v</math> csúcsba vezető legrövidebb út hosszára  
<math>C[u]-C[v]</math> alsó korlát (például egy térkép esetén <math>u</math> és <math>t</math> légvonalban mért távolsága), végül <math>B[u]=D[u]+C[u]</math>.  
<math>C[u]-C[v]</math> alsó korlát (például egy térkép esetén <math>u</math> és <math>t</math> légvonalban mért távolsága), végül <math>B[u]=D[u]+C[u]</math>.  
44. sor: 32. sor:
A tapasztalat azt mutatja, hogy az <math>A^\ast</math> algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.
A tapasztalat azt mutatja, hogy az <math>A^\ast</math> algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.


 
=== Kétirányú <math>A^\ast</math> algoritmus ===
'''Kétirányú <math>A^\ast</math> algoritmus'''
(Bi-directional <math>A^\ast</math> Shortest Path)
 
A kétirányú <math>A^\ast</math> algoritmus egy súlyozott élű, irányított <math>G=(V,E)</math> gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont <math>s</math>, a célállomást pedig <math>t</math>. Az <math>A^\ast</math>  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy <math>v</math> csúcs mindkét irányból bekerül az <math>A^\ast</math> algoritmusnál definiált <math>H</math> halmazba (pontosabban a <math>H_s</math> és a <math>H_t</math> halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.
A kétirányú <math>A^\ast</math> algoritmus egy súlyozott élű, irányított <math>G=(V,E)</math> gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont <math>s</math>, a célállomást pedig <math>t</math>. Az <math>A^\ast</math>  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy <math>v</math> csúcs mindkét irányból bekerül az <math>A^\ast</math> algoritmusnál definiált <math>H</math> halmazba (pontosabban a <math>H_s</math> és a <math>H_t</math> halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.


 
=== Yen algoritmus ===
'''Yen algoritmus'''
(<math>k</math>-Shortest Path, Multiple Alternative Paths)
 
A Yen algoritmus egy súlyozott élű, irányított <math>G=(V,E)</math> gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, <math>k</math>-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik.  
A Yen algoritmus egy súlyozott élű, irányított <math>G=(V,E)</math> gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, <math>k</math>-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik.  


59. sor: 41. sor:
<math>O(k|V|(|E|+|V|\log |V|))</math>.
<math>O(k|V|(|E|+|V|\log |V|))</math>.


 
=== Floyd-Warshall algoritmus ===
'''Floyd-Warshall algoritmus'''
(Floyd-Warshall Algorithm, All Pairs Shortest Path)
 
A Floyd-Warshall algoritmus egy súlyozott élű, irányított <math>G=(V,E)</math> gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt <math>w</math>. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza <math>\{v_1,v_2,\ldots,v_n\}</math>. Az algoritmus minden <math>0\leqslant k\leqslant n</math> esetén meghatározza a <math>v_i</math>-ből  
A Floyd-Warshall algoritmus egy súlyozott élű, irányított <math>G=(V,E)</math> gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt <math>w</math>. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza <math>\{v_1,v_2,\ldots,v_n\}</math>. Az algoritmus minden <math>0\leqslant k\leqslant n</math> esetén meghatározza a <math>v_i</math>-ből  
<math>v_j</math>-be menő legrövidebb olyan (egyszerű) út <math>T_k[v_i,v_j]</math> hosszát, amelyen a közbülső csúcsok a <math>\{v_1,v_2,\ldots,v_k\}</math> halmazból kerülnek ki:  
<math>v_j</math>-be menő legrövidebb olyan (egyszerű) út <math>T_k[v_i,v_j]</math> hosszát, amelyen a közbülső csúcsok a <math>\{v_1,v_2,\ldots,v_k\}</math> halmazból kerülnek ki:  
69. sor: 48. sor:
Az algoritmus költsége <math>O(|V|^3)</math>.
Az algoritmus költsége <math>O(|V|^3)</math>.


 
=== Johnson algoritmus ===
'''Johnson algoritmus'''
(Johnson’s Algorithm, All Pairs Shortest Path)
 
A Johnson algoritmus egy súlyozott élű, irányított <math>G=(V,E)</math> gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt <math>w</math>. Az algoritmus ritka gráfokon teljesít igazán jól.  
A Johnson algoritmus egy súlyozott élű, irányított <math>G=(V,E)</math> gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt <math>w</math>. Az algoritmus ritka gráfokon teljesít igazán jól.  


81. sor: 57. sor:
<math>O(|V|(|E|+|V|\log |V|))</math>.
<math>O(|V|(|E|+|V|\log |V|))</math>.


 
=== Utazó ügynök probléma ===
'''Utazó ügynök probléma'''
(Traveling Sales Person)
 
Az utazó ügynök probléma a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.
Az utazó ügynök probléma a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.


 
=== Legrövidebb utak kanyarodási korlátokkal ===
'''Legrövidebb utak kanyarodási korlátokkal'''
(Turn Restriction Shortest Path (TRSP))
 
Az algoritmus egy súlyozott élű, irányított <math>G=(V,E)</math> gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az <math>A^\ast</math> algoritmus.
Az algoritmus egy súlyozott élű, irányított <math>G=(V,E)</math> gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az <math>A^\ast</math> algoritmus.


 
=== Vezetési távolság ===
'''Vezetési távolság'''
(Driving Distance)
 
Egy súlyozott élű, irányított <math>G=(V,E)</math> gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.
Egy súlyozott élű, irányított <math>G=(V,E)</math> gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.

A lap 2016. április 10., 15:51-kori változata

Algoritmusok

Dijkstra algoritmus

A Dijkstra algoritmus egy súlyozott élű, irányított G=(V,E) gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt w. Az algoritmus mohó módszert használ. Legyen a kiindulási pont s, a célállomás pedig t. Az algoritmus egy H halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az s-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden u csúcsról nyilvántartunk az algoritmus futása során egy D[u] értéket, ami az s-ből u-ba vezető addig megismert legrövidebb út hossza.

Kezdetben H üres, D[s]=0 és minden más v csúcsra D[v]=. Ezután minden iterációban kiválasztunk a VH halmazból egy olyan x csúcsot, amelyre D[x] minimális, áttesszük x-et H-ba, majd x minden olyan v szomszédjára, amely nincs H-ban frissítjük a D[v] értéket: D[v]=min{D[v],D[x]+w(x,v)}. Az algoritmus véget ér, amikor t átkerül H-ba, ekkor D[t] egy legrövidebb s-ből t-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.

Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén O(|V|2), szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva O(|E|+|V|log|V|).

Kétirányú Dijkstra algoritmus

A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított G=(V,E) gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Az algoritmus csak nem negatív élsúlyok esetén működik. Legyen a kiindulási pont s, a célállomást pedig t. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk). Akkor állunk meg, ha egy v csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált H halmazba (pontosabban a Hs és a Ht halmazba is). Egy alternatív lehetőség, hogy a Hs és a Ht halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél D[x] kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.

k-Dijkstra algoritmus

A k-Dijkstra algoritmus egy súlyozott élű, irányított G=(V,E) gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált H halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.

Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén O(|V|2), szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva O(|E|+|V|log|V|).

A* algoritmus

Az A algoritmus egy súlyozott élű, irányított G=(V,E) gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Az A algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt w. Az algoritmus mohó módszert használ. Legyen a kiindulási pont s, a célállomás pedig t. Az algoritmus egy H halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az s-ből hozzávezető legrövidebb út hosszát, egy M halmazban pedig azokat, amelyeket már elértünk s-ből, de az s-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden u csúcsról nyilvántartunk az algoritmus futása során három értéket: D[u] az s-ből u-ba vezető addig megismert legrövidebb út hossza, C[u] egy nem negatív heurisztikus alsó becslés az u-ból t-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az u-ból bármely v csúcsba vezető legrövidebb út hosszára C[u]C[v] alsó korlát (például egy térkép esetén u és t légvonalban mért távolsága), végül B[u]=D[u]+C[u].

Kezdetben H üres, M-ben csak az s csúcs van, és B[s]=0. Ezután minden iterációban kiválasztunk az M halmazból egy olyan x csúcsot, amelyre B[x] minimális, áttesszük x-et H-ba, majd x minden olyan v szomszédjára, amely nincs H-ban frissítjük először a D[v] értéket: D[v]=min{D[v],D[x]+w(x,v)}, majd a B[v] értéket: B[v]=min{B[v],D[v]+C[v]}, végül áttesszük v-t M-be. Az algoritmus véget ér, amikor t átkerül M-ből H-ba, ekkor B[t] egy legrövidebb s-ből t-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.

A tapasztalat azt mutatja, hogy az A algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.

Kétirányú A algoritmus

A kétirányú A algoritmus egy súlyozott élű, irányított G=(V,E) gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Az algoritmus csak nem negatív élsúlyok esetén működik. Legyen a kiindulási pont s, a célállomást pedig t. Az A algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk). Akkor állunk meg, ha egy v csúcs mindkét irányból bekerül az A algoritmusnál definiált H halmazba (pontosabban a Hs és a Ht halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.

Yen algoritmus

A Yen algoritmus egy súlyozott élű, irányított G=(V,E) gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, k-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik.

Az algoritmus költsége O(k|V|(|E|+|V|log|V|)).

Floyd-Warshall algoritmus

A Floyd-Warshall algoritmus egy súlyozott élű, irányított G=(V,E) gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt w. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza {v1,v2,,vn}. Az algoritmus minden 0kn esetén meghatározza a vi-ből vj-be menő legrövidebb olyan (egyszerű) út Tk[vi,vj] hosszát, amelyen a közbülső csúcsok a {v1,v2,,vk} halmazból kerülnek ki: T0[vi,vj]=w(vi,vj), és Tk[vi,vj]=min{Tk1[vi,vj],Tk1[vi,vk]+Tk1[vk,vj]} ha k>0. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.

Az algoritmus költsége O(|V|3).

Johnson algoritmus

A Johnson algoritmus egy súlyozott élű, irányított G=(V,E) gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt w. Az algoritmus ritka gráfokon teljesít igazán jól.

Vegyünk fel egy új s csúcsot, és vezessünk s-ből nulla súlyú éleket G csúcsaiba. Jelölje az így kapott gráfot G. Futtassuk le G-re a Bellman-Ford algoritmust az s kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy v csúcsára legyen D[v]. Átsúlyozzuk a G gráf éleit: legyen w(u,v)=w(u,v)+D[u]D[v] minden (u,v) élre. Most w egy nem negatív súlyfüggvény G-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a G gráf minden csúcsából. Egy legrövidebb u-ból v-be vezető út hossza ezután a kapott érték mínusz D[u]D[v]. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.

Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva O(|V|(|E|+|V|log|V|)).

Utazó ügynök probléma

Az utazó ügynök probléma a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.

Legrövidebb utak kanyarodási korlátokkal

Az algoritmus egy súlyozott élű, irányított G=(V,E) gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az A algoritmus.

Vezetési távolság

Egy súlyozott élű, irányított G=(V,E) gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.