Dijkstra algoritmus

Post on 15-Jan-2016

48 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Dijkstra algoritmus. Készítette: Lakos Péter. Adott egy élsúlyozott , véges gráf Negatív élsúlyokat nem tartalmaz Lehet irányított vagy irányítatlan Továbbá adott egy s kezdőcsúcs Határozzuk meg minden csúcsra az s-ből odavezető legrövidebb utat és annak hosszát!. Feladat:. - PowerPoint PPT Presentation

Transcript

Készítette: Lakos PéterDijkstra algoritmus

Adott egy élsúlyozott, véges gráf

Negatív élsúlyokat nem tartalmaz

Lehet irányított vagy irányítatlan

Továbbá adott egy s kezdőcsúcs

Határozzuk meg minden csúcsra az s-ből odavezető legrövidebb utat és

annak hosszát!

Feladat:

Minden lépésben tartsuk nyilván az összes csúcsra a forrástól az illető

csúcsba vezető, eddig talált legrövidebb utat

a d[1..n] tömbben a távolságot

a P[1..n] tömbben a megelőző csúcsot

Az algoritmus elve:

1) Kezdetben a távolság legyen a kezdőcsúcsra 0, a többi csúcsra ∞

2) Minden lépésben a nem KÉSZ csúcsok közül tekintsük az egyik

legkisebb távolságú csúcsot

a) Azt mondhatjuk, hogy ez a v csúcs már KÉSZ, azaz ismert a hozzá vezető

legrövidebb út.

b) A v-t terjesszük ki, azaz a v csúcs szomszédaira számítsuk ki a (már ismert)

v-be vezető, és onnan egy kimenő éllel meghosszabbított út hosszát.

c) Amennyiben ez jobb (kisebb), mint az illető szomszédba eddig talált

legrövidebb út, akkor innentől kezdve ezt az utat tekintsük az adott

szomszédba vezető, eddig talált legrövidebb útnak.

Az algoritmus elve:

Az algoritmus:

A d[1..n] és P[1..n] tömböket a távolság és a megelőző csúcs nyilvántartására használjuk.

inicializálás

Az algoritmus:

A KÉSZ halmazba rakjuk azokat a csúcsokat, amelyekhez már ismerjük az egyik legrövidebb utat.

inicializálás

Az algoritmus:

Ezen kívül használunk egy minimum választó prioritásos sort (minQ)

inicializálás

Ebben a csúcsokat tároljuk a már felfedezett, legrövidebb d (s -> u) távolsággal, mint kulcs értékkel.

Az algoritmus működése:

minQ

Csúcs Kulcs

A (s)

B

C

D

E

F

G

H

KÉSZ:H

C

F

D

A

B

G

E

10

50

30 20

2090

20

80

40 1050

20

10Legyen A a kezdőcsúcs

(s:=A)

A (s) B C D E F G H

d:

P:

A (s) B C D E F G H

d: 0

P: NIL

A (s) B C D E F G H

d: 0 ∞ ∞ ∞ ∞ ∞ ∞ ∞

P: NIL NIL NIL NIL NIL NIL NIL NIL

minQ

Csúcs Kulcs

A (s) 0B ∞

C ∞

D ∞

E ∞

F ∞

G ∞

H ∞

A (s) B C D E F G H

d: 0 ∞ ∞ ∞ ∞ ∞ ∞ ∞

P: NIL NIL NIL NIL NIL NIL NIL NIL

minQ

Csúcs Kulcs

A (s) 0B ∞

C ∞

D ∞

E ∞

F ∞

G ∞

H ∞

Az algoritmus működése:

KÉSZ:H

C

F

D

A

B

G

E

10

50

30 20

2090

20

80

40 1050

20

10

u

minQ

Csúcs Kulcs

B ∞

C ∞

D ∞

E ∞

F ∞

G ∞

H ∞

A

v

A (s) B C D E F G H

d: 0 20 ∞ ∞ ∞ ∞ ∞ ∞

P: NIL NIL NIL NIL NIL NIL NIL NIL

minQ

Csúcs Kulcs

B 20

C ∞

D ∞

E ∞

F ∞

G ∞

H ∞

A (s) B C D E F G H

d: 0 20 ∞ ∞ ∞ ∞ ∞ ∞

P: NIL A NIL NIL NIL NIL NIL NIL

v

A (s) B C D E F G H

d: 0 20 ∞ 80 ∞ ∞ ∞ ∞

P: NIL A NIL NIL NIL NIL NIL NIL

minQ

Csúcs Kulcs

B 20

C ∞

D 80E ∞

F ∞

G ∞

H ∞

A (s) B C D E F G H

d: 0 20 ∞ 80 ∞ ∞ ∞ ∞

P: NIL A NIL A NIL NIL NIL NIL

v

A (s) B C D E F G H

d: 0 20 ∞ 80 ∞ ∞ 90 ∞

P: NIL A NIL A NIL NIL NIL NIL

minQ

Csúcs Kulcs

B 20

C ∞

D 80E ∞

F ∞

G 90H ∞

A (s) B C D E F G H

d: 0 20 ∞ 80 ∞ ∞ 90 ∞

P: NIL A NIL A NIL NIL A NIL

Nincs több ilyen csúcs,kilépünk a belső ciklusból.

A (s) B C D E F G H

d: 0 20 ∞ 80 ∞ ∞ 90 ∞

P: NIL A NIL A NIL NIL A NIL

minQ

Csúcs Kulcs

B 20

C ∞

D 80E ∞

F ∞

G 90H ∞

Az algoritmus működése:

KÉSZ:H

C

F

D

A

B

G

E

10

50

30 20

2090

20

80

40 1050

20

10

A

Az előző lépés mintájárafolytatjuk az algoritmust,amíg ki nem ürül a minQ.

minQ

Csúcs Kulcs

C ∞

D 80E ∞

F ∞

G 90H ∞

u

B

v

A (s) B C D E F G H

d: 0 20 ∞ 80 ∞ 30 90 ∞

P: NIL A NIL A NIL B A NIL

minQ

Csúcs Kulcs

C ∞

D 80E ∞

F 30

G 90H ∞

A (s) B C D E F G H

d: 0 20 ∞ 80 ∞ 30 90 ∞

P: NIL A NIL A NIL B A NIL

minQ

Csúcs Kulcs

C ∞

D 80E ∞

F 30

G 90H ∞

Az algoritmus működése:

KÉSZ:H

C

F

D

A

B

G

E

10

50

30 20

2090

20

80

40 1050

20

10

A

u

B

v

minQ

Csúcs Kulcs

C ∞

D 80E ∞

G 90H ∞

FA (s) B C D E F G H

d: 0 20 40 80 ∞ 30 90 ∞

P: NIL A F A NIL B A NIL

minQ

Csúcs Kulcs

C 40

D 80E ∞

G 90H ∞

v

A (s) B C D E F G H

d: 0 20 40 70 ∞ 30 90 ∞

P: NIL A F F NIL B A NIL

minQ

Csúcs Kulcs

C 40

D 70E ∞

G 90H ∞

A (s) B C D E F G H

d: 0 20 40 70 ∞ 30 90 ∞

P: NIL A F F NIL B A NIL

minQ

Csúcs Kulcs

C 40

D 70E ∞

G 90H ∞

Az algoritmus működése:

KÉSZ:H

C

F

D

A

B

G

E

10

50

30 20

2090

20

80

40 1050

20

10

A

u

Bv

F

v

minQ

Csúcs Kulcs

D 70E ∞

G 90H ∞

CA (s) B C D E F G H

d: 0 20 40 50 ∞ 30 90 ∞

P: NIL A F C NIL B A NIL

minQ

Csúcs Kulcs

D 50E ∞

G 90H ∞

A (s) B C D E F G H

d: 0 20 40 50 ∞ 30 90 60

P: NIL A F C NIL B A C

minQ

Csúcs Kulcs

D 50E ∞

G 90H 60

C-nek F is szomszédja, de azmár benne van a KÉSZ halmazban.

A (s) B C D E F G H

d: 0 20 40 50 ∞ 30 90 60P: NIL A F C NIL B A C

minQ

Csúcs Kulcs

D 50E ∞

G 90H 60

Az algoritmus működése:

KÉSZ:H

C

F

D

A

B

G

E

10

50

30 20

2090

20

80

40 1050

20

10

A

u

B

F

v

C

minQ

Csúcs Kulcs

E ∞

G 90H 60

D

A (s) B C D E F G H

d: 0 20 40 50 ∞ 30 70 60

P: NIL A F C NIL B D C

minQ

Csúcs Kulcs

E ∞

G 70H 60

A (s) B C D E F G H

d: 0 20 40 50 ∞ 30 70 60P: NIL A F C NIL B D C

minQ

Csúcs Kulcs

E ∞

G 70H 60

Az algoritmus működése:

KÉSZ:H

C

F

D

A

B

G

E

10

50

30 20

2090

20

80

40 1050

20

10

A

uB

F

C

D

minQ

Csúcs Kulcs

E ∞

G 70

H

A H csúcsnak nincs egy szomszédja sem,így be sem lépünk a belső ciklusba.

A (s) B C D E F G H

d: 0 20 40 50 ∞ 30 70 60P: NIL A F C NIL B D C

minQ

Csúcs Kulcs

E ∞

G 70

Az algoritmus működése:

KÉSZ:H

C

F

D

A

B

G

E

10

50

30 20

2090

20

80

40 1050

20

10

A

u

B

F

C

D

H

minQ

Csúcs Kulcs

E ∞

G

minQ

Csúcs Kulcs

E ∞

A (s) B C D E F G H

d: 0 20 40 50 ∞ 30 70 60P: NIL A F C NIL B D C

Az algoritmus működése:

KÉSZ:H

C

F

D

A

B

G

E

10

50

30 20

2090

20

80

40 1050

20

10

A

u

B

F

C

D

H

G

minQ

Csúcs Kulcs

E

A (s) B C D E F G H

d: 0 20 40 50 ∞ 30 70 60P: NIL A F C NIL B D C

Az eredmény:

H

C

F

D

A

B

G

E

10

50

30 20

2090

20

80

40 1050

20

10

Az elkészült d és P tömbök segítségével

minden csúcsról leolvasható az s-ből

odavezető legrövidebb út és annak

hossza

Pl.: a D csúcsba vezető leghatékonyabb

út 50 költségű

D-be C-n keresztül jutottunk

C-be F-ből jöttünk

F-be B-ből

B-be pedig A-ból (kezdőcsúcs)

Vegyük észre, hogy az E-be vezető út

költsége végtelen, vagyis ebbe a

csúcsba nem lehet eljutni

A (s) B C D E F G H

d: 0 20 40 50 ∞ 30 70 60P: NIL A F C NIL B D C

Az eredmény:

H

C

F

D

A

B

G

E

10

50

30 20

2090

20

80

40 1050

20

10

Ha berajzoljuk a kezdőcsúcsból az összes többi csúcsba vezető legjobb utat, megkapjuk a legrövidebb utak fáját.

A (s) B C D E F G H

d: 0 20 40 50 ∞ 30 70 60P: NIL A F C NIL B D C

Az eredmény: Ha berajzoljuk a kezdőcsúcsból

az összes többi csúcsba vezető legjobb utat, megkapjuk a legrövidebb utak fáját.

H

C

F

D

A

B

G

E

10

50

30 20

2090

20

80

40 1050

20

10

H

C

F

D

A

B

G

10

20

20

10

20

10

Megjegyzés:

További információk, példa: http://people.inf.elte.hu/fekete/docs_2/grafalg/grafalg.pdf25 - 30. oldal

top related