a főciklus működése. ciklusfeltétel teljesül, minq nem üres, belépés a ciklusba

Post on 23-Feb-2016

23 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

- PowerPoint PPT Presentation

TRANSCRIPT

Az algoritmus elve: 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 már megismert módon a d[1..n] tömbben a távolságot, és P[1..n] tömbben a megelőző csúcsot). 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ú

( mind ) csúcsot: a) Azt mondhatjuk, hogy ez a Vv csúcs már KÉSZ, azaz ismert a hozzá vezető

legrövidebb út. b) A v-t terjesszük ki, azaz 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. 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. Ezt az eljárást szokás közelítésnek is nevezni.

d[1…n] és P[1…n] tömbök a távolság és a megelőző csúcs nyilvántartására KÉSZ halmaz azon csúcsok számára, amelyekhez már ismerjük a legrövidebb utatMinimum választó elsőbbségi sor amelyben a csúcsokat tároljuk a már felfedezett legrövidebb távolsággal

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

Az ábrán az inicializáló blokk lefutása utáni állapotot láthatjuk. A KÉSZ halmazhoz való tartozást színezéssel valósítjuk meg. A nem KÉSZ csúcsok fehérek, a KÉSZ csúcsok zöldek lesznek. A csúcsok mellé feltüntettem a címkéjét és a csúcson belüli érték jelöli az eddig talált legrövidebb távolságot. Kezdetben a szürke kezdőcsúcs értéke 0 a többi csúcs végtelen (inf) értékkel szerepel az elsőbbségi sorban (minQ).

a b c d e fminQ: 0 inf inf inf inf inf

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

A főciklus működése.Ciklusfeltétel teljesül, minQ nem üres, belépés a ciklusba

minQ: 0 inf inf inf inf inf

Első lépésben kivesszük a prioritásos sorból az a csúcsot, (mivel az ő prioritása a legkisebb).

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

minQ: inf inf inf inf inf

KÉSZ U {u}: a

Az a csúcshoz már ki van számítva a legrövidebb út , tehát ez a csúcs már elkészült , tegyük bele a KÉSZ U halmazba.

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

minQ: inf inf inf inf inf

Az a csúcs kiterjesztését végző ciklus működése.A ciklus végigmegy a gráf összes olyan elemén, amely szomszédja az u csúcsnak és nincs benne a KÉSZ halmazban. A kiterjesztés során vizsgált csúcsokat és éleket pirossal jelöltem.

KÉSZ U {u}: a

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

minQ: inf inf inf inf inf

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

KÉSZ U {u}: a

u vd: 0 inf inf inf

A legrövidebb csúcs megkeresése.A d[…] tömbbe kerülnek az u csúcsból kiinduló élek távolságai. c(u,v) jelöli az u csúcsból a v csúcsba vezető él súlyát. Behelyettesítve az értékeket : inf > 0 + 54Igaz ág hajtódik végre.

minQ: inf inf inf inf inf

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

KÉSZ U {u}: a

minQ: inf inf inf inf inf

u vd: 0 0+54 inf inf

A v csúcs távolsága legyen egyenlő az u csúcs értékével és a két csúcs közötti él súlyával (c(u,v) függvény).

minQ helyreállítása, visszatesszük a sorba d[v] értékét .

KÉSZ U {u}: a

u vd: 0 54 inf inf

minQ: 54 inf inf inf inf

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

KÉSZ U {u}: a

u vd: 0 54 inf inf

Ugrás a következő elemre

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

minQ: 54 inf inf inf inf

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

KÉSZ U {u}: a

u vd: 0 54 inf inf

d[v] = infd[u] = 0c(u,v)=62Behyelyettesítve az értékeket az igaz ág kerül végrehajtásra.

minQ: 54 inf inf inf inf

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

KÉSZ U {u}: a

u vd: 0 54 0+62 inf

minQ: 54 inf inf inf inf

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

KÉSZ U {u}: a

u vd: 0 54 62 inf

minQ: 54 62 inf inf inf

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

Ugrás a következő elemre

KÉSZ U {u}: a

u vd: 0 54 62 inf

minQ: 54 62 inf inf inf

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

d[v] = infd[u] = 0c(u,v)=37Behyelyettesítve az értékeket az igaz ág kerül végrehajtásra.

KÉSZ U {u}: a

u vd: 0 54 62 inf

minQ: 54 62 inf inf inf

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

KÉSZ U {u}: a

u vd: 0 54 62 0+37

minQ: 54 62 inf inf inf

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

KÉSZ U {u}: a

u vd: 0 54 62 37

minQ: 37 54 62 inf inf

A belső ciklus lefutása utáni állapot. A kezdőcsúcshoz tartozó három él közül az e csúcshoz vezető él a legkisebb súlyú, ez került a minQ prioritásos sor legelejére.

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

A főciklus második lefutása. minQ első elemét kivesszük, ez jelen esetben az e csúcs

KÉSZ U {u}: a

minQ: 37 54 62 inf inf

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

Kész U {u}: e a

minQ: 54 62 inf inf

Betesszük a KÉSZ U{} halmazba, melynek elemeit az ábrán zölden jelöltem.

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

A belső ciklus nem fut le mert az u-hoz tartozó szomszédsági lista üres.

Kész U {u}: e a

minQ: 54 62 inf inf

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

A főciklus harmadik lefutása. minQ első elemét kivesszük, ez jelen esetben a d csúcs és beletesszük a KÉSZ U{} halmazba.

Kész U {u}: d e a

minQ: 62 inf inf

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

Kész U {u}: d e a

minQ: 62 130 inf

A belső ciklus lefutása utáni állapot.Az f csúcshoz vezető út súlya: 54+76=130, mert a d csúcsnak csak egyetlen szomszédos eleme van, amely nincs benne a KÉSZ U{} halmazban, ennek értéke hozzáadódik a d csúcshoz vezető él súlyához.

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

A főciklus negyedik lefutása. minQ első elemét kivesszük, ez jelen esetben a b csúcs és beletesszük a KÉSZ U{} halmazba.

minQ: 130 inf

Kész U {u}: b d e a

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

b csúcs kiterjesztése utáni állapot. Mivel b-nek csak egyetlen olyan szomszédos eleme van, amely nincs benne a KÉSZ U{} halmazban, ezért a belső ciklus csak egyszer fut le. d[v] értéke 62+15=77 lesz és ezt teszi be a minQ prioritásos sorba.

minQ: 77 130

Kész U {u}: b d e a

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

A főciklus ötödik lefutása. minQ első elemét kivesszük, ez jelen esetben a c csúcs és beletesszük a KÉSZ U{} halmazba.

minQ: 130

Kész U {u}: c b d e a

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

A kiterjesztés során f csúcshoz két különbözű élsúlyú út is tartozik. Egyszer a korábbi 54+76=130 és a mostani kiterjesztés során bejárt 77+92=169 Ebben az esetbe a SKIP ág hajtódik végre, a 169 nem került bele minQ-ba.

minQ: 130

Kész U {u}: c b d e a

d[v]:=d[u]+c(u,v)Helyreállít(minQ)

P[v]:=u

d[s]:=0; P[s]:= Nilall u eleme V\ {s}

d[u]:= Végtelen; P[u]:= Nil

d[v]>d[u] + c(u,v)

SKIP

Üres(KÉSZ); Üres(minQ)Feltölt(minQ)!Üres?(minQ)

u:=KiveszMin(minQ)KÉSZ:=KÉSZ U {u}

all v eleme Szomszed(u)\ KÉSZ

Kész U {u}: f c b d e a

A főciklus utolsó lefutása utáni állapot.

top related