Floyd - Warshall algoritem

Floyd - Warshall algoritem

Avtor: Sandra Selšek

Uvod

Iščemo vse najkrajše poti med vsemi pari točk. Točke so v uteženem in usmerjenem grafu.

NAJKRAJŠA POT je tista pot, ki predstavlja najmanjšo (oz. najcenejšo) vsoto povezav med vozlišči grafa.

(fw1.png)
Primer uteženega grafa.
(fw2.png)
Primer uteženega in usmerjenega grafa.

Iščemo najkrajše poti v uteženem grafu s podano funkcijo množice reanih števil. Ta funkcija določi strošek povezave (oz. vrednost uteži) med vsemi pari vozlišč (oz. točk) v grafu .

Predpostavili bomo, da ni negativnih ciklov!

NEGATIVNI CIKEL je krožna pot, katerega vsota vrednosti povezav, ki v tem ciklu nastopajo, je negativna.

POT je enostavni sprehod, v katerem se niti točke, niti povezave ne ponovijo.

Negativni cikel, si lahko ogledamo na spodnjem primeru:

(negativniCikel.jpg)

Torej: IŠČEMO VSE NAJKRAJŠE POTI MED VSEMI PARI TOČK.

Postopek, ki ga uporabljamo je Floyd-Warshallov postopek.

Floyd-Warshallov postopek lahko prikažemo s Floyd-Warshallov algoritmom, ki je primer dinamičnega programiranja.

Kratka-zgodovina

Leta 1959 je prvič objavil ta algoritem Bernard Roy. Priznan in objavljen pa je bil ponovno leta 1962, napisala sta ga Robert Floyd in Stephen Warshallov.

ALGORITEM

Floyd-Warshallov algoritem primerja vse možne poti skozi graf med vsemi pari točk.

Za najlažje reševanje si vedno graf predstavimo v matriki. V matriko vpišemo vse vrednosti povezav med vsemi pari točk.

Kot rezultat Floyd-Warshallov algoritem vrne matriko z najkrajšimi povezavami(vrednostmi) med pari točk in pomožno matriko s najkrajšimi potmi med pari točk.

Rešitev Floyd-Warshallovega algoritma (najkrajših možnih poti med vsemi pari točk) je lahko več.

Imamo graf z vozlišči V, vsako vozišče je oštevilčeno od 1 do n.

Računamo najkrajšo pot od do z uporabo točk iz nabora kot vmesno točko te poti. Naš cilj je najti najkrajšo pot od vsakega za vsak z uporablanjem točk od do .

nastopa:

ne nastopa:

Tako izračunamo vse razdalje za pare točk za .

Našli smo najkrajšo pot za vse pare z uporabo kakršnih koli vmesnih točk.

V uteženem grafu s poljubnimi utežmi c iščemo vse najkrajše poti (med vsemi pari točk). Uteži so podane v matriki ; če med točkama ni povezave, utež (element matrike) postavimo na .

Floyd-Warshall(G)


    za k=1 do |V(G)|
        za i=1 do |V(G)| //po vrsticah
            za k=1 do |V(G)| //po stolpcih

DELOVANJE FLOYD-WARSHALLOVEGA ALGORITMA NA PRIMERU

Podano imamo matriko povezav grafu:

(primerAlgoritma1.jpg)

Pričnemo z reševanjem, na začetku si podano matriko označimo s in si ustvarimo pomožno matriko .

(primerAlgoritma2a.jpg)

Števila v na mestu nam povedo, koliko je vrednost uteži direktne povezave iz točke v točko . Pri spreminjanju v , v , ... v spreminjamo vrednosti v primer, ko najdemo manjšo vrednost uteži povezave preko vmesne točke.

(primerAlgoritma2b.jpg)

V matriko smo vstavili začetne povezave.

V prvo vrstico smo napisali število ena na mesta, kjer obstaja direktna povezava iz točke ena do točke, kjer stoji števka ena.(V našem primeru iz točke ena pridemo v točko tri, pet in šest. Zato na teh mesti stoji število ena v prvi vrstici.)

Na isti način smo vpisali števiko dva v drugo vrstico, števiko tri v tretjo vrstico ...

Kjer smo napisali črtice, vemo da povezave iz točke i v točko j ni.

Pri spreminjanju števil v v , v ,... v na mestu spreminjamo pot iz točke v točko preko točke , preko katere smo našli najkrajšo pot.

1. korak:

V matriki si za lažje računanje označimi prvo vrstico in prvi stolpec.

(primerAlgoritma3.jpg)

Sedaj začenm primerjati povezave med seboj.

Najprej preverilo povezave za točko 1 (za k=1):(primerjamo povezave, ki so obkrožene oranžno)

(primerAlgoritma4a.jpg)

Ko pride do primera: podatek spremenimo. Torej spremenimo podatek, če najdemo pot, ki je krajša (oz. vrednost uteži je manjša) od direktne poti iz točke v točko . Ta pot bo potekala skozi točko .

Ko pride do primera podatek NE spremenimo. Ker je direktna pot od točke i do točke j krajša (oz. vrednost uteži je manjša), kot pot preko točke k, potdatek ne spremenimo.

(primerAlgoritma4b.jpg)

Po prvem koraku ugotovimo, da se spremnijo vrednosti povezav na in (obkroženo modro).

Direktna pot ima iz točke 3 v točko 5 vrednost 8. Vrednost poti iz točke 3 v točko 1 je 1 in vrednost poti iz točke 1 v točko 5 je 1. (1+1=2) Torej, če gremo preko točke 1 je vrednost poti 2. Zato smo spremenili vrednost v matriki na mestu . Namesto vrednosti 8 smo napisali vrednost 2.

Direktna pot ima iz točke 6 v točko 3 neskončno vrednost(oz. ta pot ne obstaja). Vrednost poti iz točke 6 v točko 1 je 24 in vrednost poti iz točke 1 v točko 5 je 1. (24+1=25) Torej, če gremo preko točke 1 je vrednost poti 25. Zato smo spremenili vrednost v matriki na mestu . Našli smo pot z vrednostjo 25.

V matriki smo preverili, če obstaja kakšna krajša pot preko točke 1. Našli smo dve takšni poti ( in ). Napisali smo novo matriko , s spremenjenimi vrednostmi v in .

(primerAlgoritma5a.jpg)

Spremenimo pa tudi matriko v matriko . Spremenile so se iste povezave ( in ) kot v . Na mesta in bomo napisali število 1, ki nam bo povedalo, da je najkrajša povezava preko točke 1.

Torej vrednost v matriki na mestu spremenimo, zato ker smo našli krajšo pot, kot pa je direktna pot od do .

(primerAlgoritma5b.jpg)

2. korak:

Preverimo povezave za točko 2 (za k=2).

Ko pride do primera: podatek spremenimo.

Ko pride do primera podatek NE spremenimo.

(primerAlgoritma6a.jpg)

Po drugem koraku ugotovimo, da se spremni vrednost povezav na .

Direktna pot ima iz točke 5 v točko 6 vrednost 8. Vrednost poti iz točke 5 v točko 2 je 1 in vrednost poti iz točke 2 v točko 6 je 1. (1+1=2) Torej, če gremo preko točke 2 je vrednost poti 2. Zato smo spremenili vrednost v matriki na mestu . Namesto vrednosti 8 smo napisali vrednost 2.

Dobimo novo matriko .

(primerAlgoritma6c.jpg)

Spremenimo pa tudi matriko v matriko . Na mestu bomo napisali število 2, ki nam bo povedalo, da je najkrajša povezava preko točke 2.

(primerAlgoritma6d.jpg)

Korak 3:

Preverimo povezave za točko 3 (za k=3).

Ko pride do primera: podatek spremenimo.

Ko pride do primera podatek NE spremenimo.

(primerAlgoritma8a.jpg)

Po tretjem koraku ugotovimo, da se spremnijo vrednosti povezav na , , , , , , , , , , , in .

  • Direktna pot ima iz točke 1 v točko 2 neskončno vrednost(oz. ta pot ne obstaja). Vrednost poti iz točke 1 v točko 3 je 7 in vrednost poti iz točke 3 v točko 2 je 12. (7+12=19) Torej, če gremo preko točke 3 je vrednost poti 19. Zato smo spremenili vrednost v matriki na mestu . Našli smo pot z vrednostjo 19.
  • Direktna pot ima iz točke 1 v točko 4 neskončno vrednost(oz. ta pot ne obstaja). Vrednost poti iz točke 1 v točko 3 je 7 in vrednost poti iz točke 3 v točko 4 je 9. (7+9=16) Torej, če gremo preko točke 3 je vrednost poti 16. Zato smo spremenili vrednost v matriki na mestu . Našli smo pot z vrednostjo 16.
  • Direktna pot ima iz točke 1 v točko 6 vrednost 18. Vrednost poti iz točke 1 v točko 3 je 7 in vrednost poti iz točke 3 v točko 6 je 9. (7+9=16) Torej, če gremo preko točke 3 je vrednost poti 16. Zato smo spremenili vrednost v matriki na mestu . Namesto vrednosti 18 smo napisali vrednost 16.

...

Dobimo novo matriko .

(primerAlgoritma8b.jpg)

Spremenimo pa tudi matriko v matriko . Na mesta , , , , , , , , , , , in bomo napisali število 3, ki nam bo povedalo, da je najkrajša povezava preko točke 3.

(primerAlgoritma8c.jpg)

Izvedemo še korak 4, 5 in 6.

Po zadnjem šestem koraku dobimo:

(primerAlgoritma9a.jpg)

V matriki so zapisane najmanjše uteži med posameznimi pari točk. Na mestu je število, ki nam pove koliko je najmanjša vrednost uteži, ki jo potrebujemo da pridemo iz točke v točko .

(primerAlgoritma9b.jpg)

V matriki pa so zapisane najkrajše povezave. Na mestu v je napisana točka preko katere poteka najkrajša pot iz točke v točko .

Matriki in sta naš rezultat.

Sedaj moramo samo še razbrati vse najkrajše poti.

Primer: Hočemo narisati graf vseh najkrajših poti iz točke 4 do vseh ostalih točk.

Vzamemo 4 vrstico iz matrike in .

Kar označimo:

(primerAlgoritma7a.jpg)

Najprej narišemo točke, med točkami narišemo povezave s pomočjo : 3 5 4 – 3 3.

Kako?

(primerAlgoritma7b.jpg)

Iz točke 4 v točko 3.

Iz točke 3 v točko 1, 5 in 6.

Iz točke 5 v točko 2.

(primerAlgoritma10a.jpg)

Nato na povezave napišemo vrednosti s pomočjo matrike ali s pomočjo d: 2 10 1 0 9 10.

Kako s pomočjo 4 vrstice v matriki ?

(primerAlgoritma7c.jpg)

Iz točke 4 v točko 3. Vrednost povezave je 1.

Iz točke 3 v točko 1. Vrednost povezave je 2-1=1.

Iz točke 3 v točko 6. Vrednost povezave je 10-1=9.

Iz točke 3 v točko 5. Vrednost povezave je 9-1=8.

Iz točke 5 v točko 2. Vrednost povezave je 10-9=1.

Kako s pomočjo matrike ?

Ko imamo že narisan graf, v matriki najdemo povezave med posameznimi točkami in jih napišemo na povezeve na grefu.

V našem primeru najdemo:

(primerAlgoritma10b.jpg) (primerAlgoritma10c.jpg)

Dobimo Graf, ki potek iz točke 4 v vse ostale točke, po najkrajših možnih poteh.

ZAHTEVNOST

ČASOVNA ZAHTEVNOST

Računamo zaporedje matrik skupno število operacij je .

Zato je zahtevnost algoritma:

PROSTORSKA ZAHTEVNOST

Pri računanju k-te matrike je dovolj poznati le (k-1)-ov matriko D. Pravzaprav lahko sproti popravljamo vrednosti v začetni matriki; pri tem potrebujemo še nekaj dodatnega prostora. Torej je prostorska zahtevnost .

Postopek reševanja

Iščemo najkrajše poti med vsemi pari točk! Razdalje med točkami so prikazane v spodnji matriki.

(podanaMatrika.jpg)

Postopek reševanja si lahko ogledate na prikazanem filmčku.

0%
0%