Var du förvirrad när du ska välja den kortaste vägen från din plats till din destination? Då bör du känna till denna algoritm.
- Floyd-Warshalls algoritm används för att hitta de kortaste vägarna mellan alla par av hörn i en graf, där varje kant i grafen har en vikt som är positiv eller negativ.
- Den största fördelen med att använda denna algoritm är att alla de kortaste avstånden mellan två hörn kan beräknas på O(V3), där V är antalet hörn i grafen.
- Floyd-Warshalls algoritm kallas också Floyds algoritm, Roy-Floyd-algoritmen, Roy-Warshall-algoritmen eller WFI-algoritmen.
- Algoritmen följer den dynamiska programmeringsmetoden för att hitta de kortaste vägarna.
Algoritm
För en graf med N hörn:
Steg 1: Initialisera de kortaste vägarna mellan två hörn med oändlighet.
Steg 2: Hitta alla pars kortaste vägar som använder 0 mellanliggande hörn, hitta sedan de kortaste vägarna som använder 1 mellanliggande hörn och så vidare … tills du använder alla N hörn som mellanliggande noder.
Steg 3: Minimera de kortaste vägarna mellan två par i föregående steg.
Steg 4: För två hörn (i,j) bör man faktiskt minimera avstånden mellan dessa par genom att använda de första K noderna, så den kortaste vägen blir: min(dist+dist,dist).
dist representerar den kortaste vägen som endast använder de första K hörnen, dist representerar den kortaste vägen mellan paret k,j. Eftersom den kortaste vägen kommer att vara en sammanfogning av den kortaste vägen från i till k och sedan från k till j.
for(int k = 1; k <= n; k++){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
dist = min( dist, dist + dist );
}
}
}
Exempel
Låt den givna grafen vara:
Följ nedanstående steg för att hitta den kortaste vägen mellan alla hörnpar.
- Skapa en matris
A0
med dimensionenn*n
där n är antalet hörn. Raden och kolumnen indexeras som i respektive j. i och j är grafenas hörn.
Varje cell A fylls med avståndet från hörnet ith
till hörnet jth
. Om det inte finns någon väg från ith
vertex till jth
vertex lämnas cellen som oändlig.
2. Skapa nu en matris A1
med hjälp av matris A0
. Elementen i den första kolumnen och den första raden lämnas som de är. De återstående cellerna fylls på följande sätt.
Låt k vara den frysta vertexen i den kortaste vägen från källa till destination. I detta steg är k den första vertexen.A
fylls med (A + A) if (A > A + A)
.
Det vill säga, om det direkta avståndet från källan till destinationen är större än vägen genom vertexen k, fylls cellen med A + A
.
I detta steg är k vertex 1. Vi beräknar avståndet från källpunkten till destinationspunkten genom denna punkt k.
Till exempel: För A1
är det direkta avståndet från vertex 2 till 4 4 och summan av avståndet från vertex 2 till 4 genom vertex (dvs. från vertex 2 till 1 och från vertex 1 till 4) är 7. Sedan 4 < 7
fylls A0
med 4.
3. På liknande sätt skapas A2
med hjälp av A3
. Elementen i den andra kolumnen och den andra raden lämnas som de är.
I detta steg är k den andra vertexen (dvs. vertex 2). De återstående stegen är desamma som i steg 2.
4. På samma sätt skapas också A3
och A4
.