150 likes | 233 Views
Dijkstra algoritmusa. Gubicza József (GUJQAAI.ELTE). Jellemzők. Cél: Adott egyszerű gráfban a legrövidebb (vagy min. költségű) út meghatározása. Algoritmikus szinten: 3 tömb feltöltése; - d [1..n] a csúcsokhoz tartozó min. költségek ill. - π ( parent ) a csúcsokhoz tartozó szülők meghat.
E N D
Dijkstra algoritmusa Gubicza József (GUJQAAI.ELTE)
Jellemzők • Cél: Adott egyszerű gráfban a legrövidebb (vagy min. költségű) út meghatározása. • Algoritmikus szinten: 3 tömb feltöltése; - d[1..n] a csúcsokhoz tartozó min. költségek ill. - π (parent) a csúcsokhoz tartozó szülők meghat. - a kész[1..n] segédtömb segítségével, amely azt mutatja, vizsgáltuk-e már az adott csúcsot. • A gráf élcímkéi pozitív értékeket vehetnek fel, a csúcscímkék pozitív, ill. végtelent.
Az algoritmus A minimum keresés a d tömbbeli min. értékre vonatkozik a legkisebb költségű csúcs, ami még nincs kész.
∞ ∞ 8 2 6 5 4 2 7 ∞ ∞ ∞ 4 1 7 8 7 s = 3 5 8 9 4 3 5 ∞ ∞ Kezdőállapot: minden csúcsot ∞-el címkézünk, szüleiket NIL-re állítjuk, valamint a Kész értékeket 0-kra, és kijelöljük a kezdőcsúcsot.
∞ ∞ 8 2 6 5 4 2 7 0 ∞ ∞ 4 1 7 8 7 s = 3 5 8 9 4 3 5 ∞ ∞ A kezdőcsúcs értékét 0-ra állítjuk, így a FeltMinker(d[1..n], u, Kész[j] = 0) őt fogja megtalálni először. Ezt a csúcsot készre állítjuk.
szülő jelölése 5 ∞ 8 2 6 5 4 2 7 0 ∞ ∞ 4 1 7 8 7 s = 3 5 8 9 4 3 5 ∞ ∞ A csúcs minden szomszédjára megnézzük (amelyek még nincsenek Kész, 5 és 3), hogy: d[u] + c(u,v) < d[v] Tehát az él, javít e a költségen? Ha igen, d[v] = d[u] + c(u,v), ill. π[v] := u
5 ∞ 8 2 6 5 4 2 7 0 ∞ ∞ 4 1 7 8 7 s = 3 5 8 9 4 3 5 8 ∞ Ha végeztünk az összes szomszéd vizsgálatával….
13 5 8 2 6 5 4 2 7 0 ∞ ∞ 4 1 7 8 7 s = 3 5 8 9 4 3 5 8 ∞ Iterálunk még egyet, a legkisebb költségű még nem kész elem a 2-es csúcs (d. 5), még nem kész szomszédai: 6, 4, 3
5 13 8 2 6 5 4 2 7 9 0 ∞ 4 1 7 8 7 s = 3 5 8 9 4 3 5 8 ∞ Mivel a 3-as csúcsba érés nem javítana a költségen 5+7 < 8 => HAMIS, így tovább iterálunk.
5 13 8 2 6 5 4 2 7 0 9 ∞ 4 1 7 8 7 s = 3 5 8 9 4 3 5 12 8 A 3-as csúcs még nem kész szomszédai: 4, 5.. ezek közül csak az 5-össel érünk el javulást
11 5 8 2 6 5 4 2 7 0 9 ∞ 4 1 7 8 7 s = 3 5 8 9 4 3 5 8 12 A 4-es csúcs javít a 6-os-ba érés költségén, és figyeljünk rá, hogy a 6-os szülője így felülíródik!
5 11 8 2 6 5 4 2 7 18 0 9 4 1 7 8 7 s = 3 5 8 9 4 3 5 8 12 Figyelem: A 6-os csúccsal folytatjuk! Neki kisebb a költsége a még nem kész csúcsok közül
5 11 8 2 6 5 4 2 7 0 9 18 4 1 7 8 7 s = 3 5 8 9 4 3 5 8 12 Most pedig az 5-ös csúcsot vesszük először, és látjuk, hogy a 7-es költségén ő nem javít…
5 11 8 2 6 5 4 2 7 0 9 18 4 1 7 8 7 s = 3 5 8 9 4 3 5 8 12 Így, az iteráció ráugrik az utolsó csúcsra, késznek jelöli. Mivel az összes csúcs kész van, az algoritmus leáll.
5 11 8 2 6 5 4 2 7 0 9 18 4 1 7 8 7 s = 3 5 8 9 4 3 5 8 12 Végül minden csúcsra megkapjuk, hogy mennyi a hozzá vezető minimális költségű út. (7-es 18, 5-ös 12) Megj.: a gráf irányításától eltekinthetünk ezen a szinten.