Legrövidebb útkereső algoritmusok



Hasonló dokumentumok
Algoritmuselmélet. Legrövidebb utak, Bellmann-Ford, Dijkstra. Katona Gyula Y.

26. MINIMÁLIS KÖLTSÉGŰ UTAK MINDEN CSÚCSPÁRRA

Algoritmuselmélet. Gráfok megadása, szélességi bejárás, összefüggőség, párosítás. Katona Gyula Y.

Gráfok 2. Legrövidebb utak, feszítőfák. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor

Gráfalgoritmusok ismétlés ősz

Algoritmusok bonyolultsága

22. GRÁFOK ÁBRÁZOLÁSA

Algoritmuselmélet. Mélységi keresés és alkalmazásai. Katona Gyula Y.

5/1. tétel: Optimalis feszítőfák, Prim és Kruskal algorithmusa. Legrövidebb utak graphokban, negatív súlyú élek, Dijkstra és Bellman Ford algorithmus.

Példa Hajtsuk végre az 1 pontból a Dijkstra algoritmust az alábbi gráfra. (A mátrixban a c i j érték az (i, j) él hossza, ha nincs él.

30. ERŐSEN ÜSSZEFÜGGŐ KOMPONENSEK

Algoritmuselmélet 7. előadás

Diszkrét matematika 2.C szakirány

Gráfelméleti feladatok. c f

Melykeres(G) for(u in V) {szin(u):=feher Apa(u):=0} for(u in V) {if szin(u)=feher then MBejar(u)}

Diszkrét matematika 2.C szakirány

Dijkstra algoritmusa

Példa Hajtsuk végre az 1 pontból a Dijkstra algoritmust az alábbi gráfra. (A mátrixban a c i j érték az (i, j) él hossza, ha nincs él.

Diszkrét matematika 2.C szakirány

Diszkrét matematika 2. estis képzés

HAMILTON KÖR: minden csúcson PONTOSAN egyszer áthaladó kör. Forrás: (

KOVÁCS BÉLA, MATEMATIKA I.

Diszkrét matematika 2. estis képzés

Diszkrét matematika 2. estis képzés

Gráfok, definíciók. Gráfok ábrázolása. Az adott probléma megoldásához ténylegesen mely műveletek szükségesek. Ábrázolások. Példa:

Adatszerkezetek 2. Dr. Iványi Péter

angolul: greedy algorithms, románul: algoritmi greedy

24. MINIMÁLIS KÖLTSÉGŰ UTAK I.

Algoritmuselmélet 2. előadás

A számítástudomány alapjai. Katona Gyula Y. Számítástudományi és Információelméleti Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem

Diszkrét matematika 2.

23. SZÉLESSÉGI BEJÁRÁS

HAMILTON ÚT: minden csúcson PONTOSAN egyszer áthaladó út

A számítástudomány alapjai

Diszkrét matematika 2.C szakirány

Minimális feszítőfák Legyen G = (V,E,c), c : E R + egy súlyozott irányítatlan gráf. Terjesszük ki a súlyfüggvényt a T E élhalmazokra:

Melykeres(G) for(u in V) {szin(u):=feher Apa(u):=0} for(u in V) {if szin(u)=feher then MBejar(u)}

Az optimális megoldást adó algoritmusok

Gráfok 1. Tárolási módok, bejárások. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor

Diszkrét matematika 2.

A gráffogalom fejlődése

Adatszerkezetek. Nevezetes algoritmusok (Keresések, rendezések)

bármely másikra el lehessen jutni. A vállalat tudja, hogy tetszőlegesen adott

19. AZ ÖSSZEHASONLÍTÁSOS RENDEZÉSEK MŰVELETIGÉNYÉNEK ALSÓ KORLÁTJAI

Kupac adatszerkezet. A[i] bal fia A[2i] A[i] jobb fia A[2i + 1]

KOVÁCS BÉLA, MATEMATIKA I.

Általános algoritmustervezési módszerek

Adatszerkezetek II. 1. előadás

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Algoritmuselmélet 11. előadás

Diszkrét matematika 2.C szakirány

1: Bevezetés: Internet, rétegmodell Alapok: aszimptótika, gráfok. HálózatokII, 2007

GRÁFELMÉLET. 7. előadás. Javító utak, javító utak keresése, Edmonds-algoritmus

Algoritmusok és adatszerkezetek gyakorlat 07

Diszkrét matematika 2. estis képzés

Gráfelméleti alapfogalmak

Minimális feszítőfák Legyen G = (V,E,c), c : E R + egy súlyozott irányítatlan gráf. Terjesszük ki a súlyfüggvényt a T E élhalmazokra:

Gráfalgoritmusok és hatékony adatszerkezetek szemléltetése

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

Programozási módszertan. Mohó algoritmusok

Gráfelméleti alapfogalmak-1

Adatszerkezetek Adatszerkezet fogalma. Az értékhalmaz struktúrája

Előfeltétel: legalább elégséges jegy Diszkrét matematika II. (GEMAK122B) tárgyból

Gráfok. Programozás II. előadás. Szénási Sándor.

Gráf-algoritmusok Legrövidebb utak

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda IRT- 4. kurzus. 3. Előadás: A mohó algoritmus

Diszkrét matematika 1. estis képzés

Kiegészítő részelőadás 1. Az algoritmusok hatékonyságának mérése

A félév során előkerülő témakörök

Diszkrét matematika 2.C szakirány

Adatszerkezetek II. 2. előadás

Gráfelmélet. I. Előadás jegyzet (2010.szeptember 9.) 1.A gráf fogalma

Amortizációs költségelemzés

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Melykeres(G) for(u in V) {szin(u):=feher Apa(u):=0} for(u in V) {if szin(u)=feher then MBejar(u)}

Algoritmizálás. Horváth Gyula Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Adatszerkezetek 7a. Dr. IványiPéter

Algoritmusok és adatszerkezetek 2.

Algoritmuselmélet 1. előadás

Algoritmuselmélet 18. előadás

BBTE Matek-Infó verseny mintatételsor Informatika írásbeli vizsga

Alap fatranszformátorok II

Branch-and-Bound. 1. Az egészértéketű programozás. a korlátozás és szétválasztás módszere Bevezető Definíció. 11.

Számítógép hálózatok, osztott rendszerek 2009

III. Gráfok. 1. Irányítatlan gráfok:

9. előadás. Programozás-elmélet. Programozási tételek Elemi prog. Sorozatszámítás Eldöntés Kiválasztás Lin. keresés Megszámolás Maximum.

Algoritmusok bonyolultsága

Gráfok bejárása. Szlávi Péter, Zsakó László: Gráfok II :17

Diszkrét matematika 1. estis képzés

Chomsky-féle hierarchia

Programozási segédlet

Felvételi tematika INFORMATIKA

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

Adatszerkezetek I. 7. előadás. (Horváth Gyula anyagai felhasználásával)

... fi. ... fk. 6. Fabejáró algoritmusok Rekurzív preorder bejárás (elsőfiú-testvér ábrázolásra)

Intelligens Rendszerek Elmélete IRE 4/32/1

Elemi matematika szakkör

Algoritmuselmélet. Katona Gyula Y. Számítástudományi és Információelméleti Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem. 13.

Programozás alapjai II. (7. ea) C++

További forgalomirányítási és szervezési játékok. 1. Nematomi forgalomirányítási játék

Átírás:

EÖTVÖS LÓRÁND TUDOMÁNYEGYETEM TERMÉSZETTUDOMÁNYI KAR Legrövidebb útkereső algoritmusok A diplomamunkát készítette: Podobni Katalin Matematika Bsc Matematikai elemző szakirány Témavezető: Nagy Adrienn PhD hallgató Eötvös Lóránd Tudományegyetem Természettudományi kar Operációkutatási tanszék Budapest, 2009

Tartalomjegyzék Tartalomjegyzék 1 Bevezetés... 2 2 Gráfelméleti fogalmak, jelölések... 3 2.1 Gráfok ábrázolási módjai... 5 3 Legrövidebb út? Mit jelent ez?... 7 4 Az algoritmusok... 9 4.1 Egy kezdőpontból az összes többi pontba vezető legrövidebb út... 9 4.1.1 Szélességi keresés... 9 4.1.2 A Dijkstra algoritmus... 12 4.1.3 A Bellman-Ford-algoritmus... 21 4.2 Két adott csúcs közötti legrövidebb út... 26 4.3 Egy adott csúcsba érkező legrövidebb utak... 28 4.4 Legrövidebb utak minden csúcspárra... 28 4.4.1 Floyd algoritmusa... 28 4.4.2 Warshall algoritmusa... 32 4.4.3 Johnson algoritmusa... 34 5 A matematikában kevésbé ismert módszerek... 38 5.1 Informált keresési stratégiák... 38 5.1.1 A mohó legjobbat-először keresés... 38 5.1.2 Az A* algoritmus... 40 6 Összefoglalás... 43 7 Irodalomjegyzék... 44 8 Köszönetnyilvánítás... 45 1

1. Bevezetés 1 Bevezetés A gráfok rendkívül gyakran használt struktúrák és a gráfokkal foglalkozó algoritmusok alapvető szerepet játszanak a számítástudományban. Számos érdekes probléma fogalmazható meg gráfok segítségével. Ezek közül talán az egyik legjelentősebb a legrövidebb utak problémája. A legkézenfekvőbb példa: hogyan jutunk el a leggyorsabban A városból a B városba? De számos más kérdés is megoldható vele, mint például az ütemezéselmélet témakörébe tartozó J n 2 C probléma, vagy az informatikában a mesterséges intelligencia max területén előforduló nehézségek. A probléma sokszínűsége miatt megoldására számos algoritmus született. A szakdolgozat legfőbb célja, hogy bemutassa ezen eljárások legnépszerűbbjeit, rámutatva előnyeikre, hátrányaikra valamint a közöttük lévő különbségekre, hasonlóságokra. A dolgozat végén bemutatjuk a már fent említett mesterséges intelligencia területén használt két alapvető módszert is, amelyek a matematikai algoritmusokhoz képest már jelentősebb változtatásokat mutatnak. Elsőként alapvető, a szakdolgozat megértéséhez elengedhetetlen gráfelméletbeli fogalmakról esik szó, utána pedig magát a problémát definiáljuk. Ezek után következik az algoritmusok részletes elemzése, melyeket aszerint csoportosítunk, hogy a probléma mely altípusát oldják meg. Természetesen sok példa és ábra is segíti érthetőbbé tenni a témát, illetve hangsúlyozni annak fontosságát. Ezen kívül, a túlzott matematikai ( száraz ) jelleg elkerülése végett a dolgozatban helyet kap a történelmi háttér, valamint az algoritmusok szülőatyjainak főbb életmozzanatai, egyéb szerepük a matematikában. Néhány helyen az algoritmus létrehozóitól vett idézetekkel díszítjük a leírásokat, hogy megismerhessük az ő véleményüket is. 2

2. Gráfelméleti fogalmak, jelölések 2 Gráfelméleti fogalmak, jelölések Ebben a fejezetben foglaljuk össze azokat a jelöléseket és fogalmakat, amelyekre elengedhetetlenül szükségünk van a téma kifejtéséhez, és amelyeket a szakdolgozatban használni fogunk. Definíció (gráf): Egy G gráf két halmazból áll: a csúcsok vagy pontok V halmazából, mely egy véges, nem üres halmaz; és az élek E halmazából, melynek elemei bizonyos V-beli párok. Jelölések: - H : egy H halmaz elemszámát jelöli. Az egyszerűség kedvéért legyen most n az adott gráf csúcshalmazának száma. - e vel az élhalmazának elemszámát jelöljük. Tehát G = (V, E) gráf esetében n = V és e = E. Egy gráf nagyon sok probléma szemléltetésére szolgálhat, a legegyszerűbb például az úthálózat, telefonhálózat, de akár terület-felosztási illetve házassági problémát is ábrázolhatunk vele. A gráfokat többféle szempontból is szokás csoportosítani. A legjelentősebb szempont az irányítottság. Definíció (irányított gráf): Az irányított gráfban minden él irányított (másképp fogalmazva a csúcsok rendezettek). Az irányítást nyilak segítségével jelöljük. Az (u, v) irányított él jelölésére használni fogjuk a u v változatot is. 1. ábra: Irányított gráf 3

2. Gráfelméleti fogalmak, jelölések Amennyiben nincs irányításunk, vagy ha minden él oda és vissza is irányítva van, akkor irányítatlan gráfról beszélünk. Ekkor nem teszünk különbséget az (u, v) és a (v, u) élpár között. 2. ábra: Irányítatlan gráf Mint ahogy már fentebb utaltunk rá, az objektumok (csúcsok) közötti kapcsolat sokszor jelentheti út létezését vagy kommunikáció lehetőségét. Ilyenkor gyakran költségek vagy súlyok tartoznak az élekhez, amelyek az út esetében időt vagy akár pénzt is jelenthetnek (gondoljunk csak az autópályákra, amelyek használatáért fizetni kell). Ezt a kapcsolatot egy valós értékű függvénnyel fogjuk leírni, melynek értelmezési tartománya a gráf élhalmaza, az érték készlete pedig a valós számok halmaza és k-val, a költség szó kezdőbetűjével jelöljük, tehát k: E R. A súlyokat az élekre szokás írni. 3. ábra: Súlyozott gráf Definíció (út): Egy út akár irányított, akár irányítatlan gráfban csúcsok olyan v 1,, v k sorozata (lehet egyelemű is), melyben minden (v i, v i+1 ) éle (1 i k 1) a gráfnak. Irányított gráfoknál az u-ból v-be menő útra u v jelöléssel is fogunk utalni. Definíció (út hossza): Legyen adott egy G = (V, E) irányított vagy irányítatlan gráf a k(f), f E élsúlyokkal. A G gráf egy u-ból v-be menő útjának hossza az úton szereplő élek súlyának összege. 4

2. Gráfelméleti fogalmak, jelölések 2.1 Gráfok ábrázolási módjai Két módszert szokás alkalmazni egy G = (V, E) gráf ábrázolására. Az első az éllistás ábrázolási mód. Definíció (éllista): A gráf minden csúcsához egy lista tartozik. Az iv csúcs listájában tároljuk az i -ből kimenő éleket, és (amennyiben vannak) a súlyukat is. A listák összességét egy tömbben tároljuk. Legyen a tömb neve Szomszéd. Vagyis Szomszéd [ i ] elemei az i csúcs G-beli szomszédjai. Ha G irányított, akkor a szomszédsági listák hosszainak összege E, hiszen egy ( iv, ) élt úgy ábrázolunk, hogy v -t felvesszük a Szomszéd [ i ] listába. Ha G irányítatlan, akkor az összeg 2 E mert ( iv, ) irányítatlan él ábrázolása során i -t beletesszük a Szomszéd [ v ]-be, míg v -t a Szomszéd [ i ]-be. Akár irányított, akár irányítatlan a gráfunk, a szomszédsági listás ábrázoláshoz szükséges tárterület mérete O(max( V, E)) O( V E). Az éllistás ábrázolás legjobban a ritka gráfok esetében alkalmazható. V 2. Definíció (ritka gráf): Egy gráfot ritkának nevezünk, ha E sokkal kisebb, mint (Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, 2001) 4. ábra: Súlyozott irányítatlan gráf és a hozzá tartozó éllisták 5

2. Gráfelméleti fogalmak, jelölések 5. ábra: Irányított gráf és a hozzátartozó éllisták A második módszer, a szomszédsági (adjacencia)-mátrix. Definíció (szomszédsági mátrix): A G = (V, E) gráf szomszédsági-mátrixa a következő - a V elemivel indexelt nn-es mátrix: A i, j 0 1 ( i, j) E ( i, j) E. Irányítatlan gráfok esetén a szomszédsági mátrix szimmetrikus lesz (azaz A i, j A j, i teljesül minden i, jcsúcspárra). Ha az élekhez még költségeket is nyilván kell tartani, akkor egy olyan K mátrixot szokás használni, amelyben K i, j 0, ha i j, K i, j k( i, j), ha i jés ( i, j) éle G-nek, K i, j egyéb esetben. Tulajdonképpen a jelzi egy él nemlétét. Ezek alapján a fentebb látható 4. ábra adjacencia-mátrixai: 0 1 1 1 0 1 0 0 0 0 A 1 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 3 10 6 * 3 0 * * * K 10 * 0 5 12 6 * 5 0 * * * 12 * 0 Az éllisták együttesen aszimptotikusan kevesebb tárterületet igényelnek, mint a csúcsmátrix, azonban a használat során a hatékonyságban ugyanennyivel elmaradnak attól, így ha a gráf nem túl nagy, szerencsésebb szomszédsági mátrixszal ábrázolni. Ha a gráf nem súlyozott, akkor az adjacencia mátrixos leírás tovább javítható. Ebben az esetben a mátrix elemei lehetnek bitek, így jelentősen csökkenthető a szükséges tárterület mérete. 6

3. Legrövidebb út? Mit jelent ez? 3 Legrövidebb út? Mit jelent ez? Definíció (legrövidebb út): Legrövidebb út alatt a gráfelméletben egy minimális hosszúságú utat értünk egy gráf két különböző u és v csúcsa között. Amennyiben a gráfunk éleihez nem tartoznak súlyok, akkor ez egyet jelent egy olyan úttal u és v csúcs között, amelyben a legkevesebb él szerepel. Ha vannak súlyok a gráf élein, akkor pedig olyan útról beszélünk, amelynek élein szereplő súlyok összege minimális. Vagyis ha adott egy G = (V, E) gráf a k(f), f E élsúlyokkal, akkor ahol P út u és v között. d ( u, v ) min k ( f ) f P Egyes könyvekben ez a definíciója az u és v csúcsok közötti távolságnak, illetve a legrövidebb út súlyának, ha u 0, ha nincs út u és v között, akkor. v, ha u v akkor ez a távolság, illetve súly Az alábbi változatokra osztható a probléma (és a továbbiakban ez alapján csoportosítjuk az algoritmusokat): 1. Legrövidebb út egy kiinduló pont és az összes többi pont között: meg szeretnénk találni az összes vv csúcshoz egy adott sv kezdőcsúcsból odavezető legrövidebb utat. 2. Legrövidebb út két különböző csúcs között: keressük egy adott u csúcsból egy adott v csúcsba vezető egyik legrövidebb utat. 3. Legrövidebb út egy végpont és az összes többi pont között (ez az 1. megfordítása). 4. Legrövidebb út az összes csúcspár között: keressük az összes u és v csúcspárra egy u -ból a v csúcsba vezető legrövidebb utat. Természetesen akadhat olyan legrövidebb út probléma, amelyben előfordulnak negatív élek. Definíció (negatív kör): A G = (V, E) irányított gráf olyan köre, amelyben az élek súlyának összege negatív. Amennyiben nincs a gráfban negatív kör bármelyik vv csúcs esetén a legrövidebb út súlya jóldefiniált marad. Ha vannak u -ból elérhető negatív körök, 7

3. Legrövidebb út? Mit jelent ez? akkor viszont a legrövidebb út súlya definiálatlan lesz, ugyanis ilyen esetben mindig van kisebb súlyú rövidebb út, ha a feltételezett legrövidebbhez hozzávesszük a negatív kör egy bejárását. Ilyen esetekben ezt a távolságot -nek definiáljuk. (Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, 2001) 8

4 Az algoritmusok 4.1 Egy kezdőpontból az összes többi pontba vezető legrövidebb út 4.1.1 Szélességi keresés A szélességi keresés az egyik legegyszerűbb gráfbejáró algoritmus, ezen alapul sok fontos gráf algoritmus, többek között Dijkstra algoritmusa is. Ez az eljárás az egységnyi súlyokkal ellátott gráf esetén keresi meg az uv kezdőpontból az összes többi pontba vezető legrövidebb utakat (ebben az esetben a legrövidebb út alatt a legkevesebb élből álló utat értjük) úgy, hogy G éleit szisztematikusan megvizsgálja és kiszámítja az elérhető csúcsok távolságát (legkevesebb él) u -tól. Elnevezése onnan ered, hogy az algoritmus az u -tól k távolságra lévő csúcsokat még azelőtt eléri, mielőtt egy k 1 távolságra levőt elérne, szemléletesen: egy egyre szélesedő körben vizsgálódik. A továbbiakban feltesszük, hogy a G = (V, E) gráfot éllistásan ábrázoljuk. Egyszerű szavakkal megfogalmazva az eljárás a következő: meglátogatjuk az első csúcsot, majd ennek a csúcsnak az összes szomszédját. Azután ezen szomszédok összes olyan szomszédját, ahol még nem jártunk, és így tovább. A legjobb ismert módszer ennek megszervezésére egy sort alkalmaz. Először beletesszük a kezdőcsúcsot, majd meglátogatottsági sorrend szerint annak az összes szomszédját, majd a kezdőcsúcs elsőként meglátogatott szomszédjának összes szomszédját, majd a kezdőcsúcs másodikként meglátogatott szomszédjának összes szomszédját és így tovább. Definíció (sor): A sor adatszerkezet alapja egy elemekből álló kettős láncolt lista. Két alapművelet van: sorba ( vq, ) a v elemet a Q sor végére illeszti; első ( vq, ) pedig visszaadja és kitörli Q -ból annak első elemét. A sort szokás még FIFO-listának (first in, first out) is nevezni. A módszer általános lépéseinek lényege, hogy vesszük a sor elején levő u csúcsot. Ezt töröljük a sorból, meglátogatjuk azokat a v szomszédjait, amelyeket 9

eddig még nem láttunk, majd ezeket a v csúcsokat a sor végére tesszük. Jelentse Dv a v csúcsnak az u -tól való távolságát. BEJÁR ( Gu, ) eljárás 1. procedure bejár 2. begin 3. for s 1 to n do 4. bejárvas :=HAMIS 5. for s : 1 to n do 6. if bejárvas =HAMIS then 7. szb () s 8. end 9. procedure szb () s 10. var 11. Q :csúcsokból álló sor 12. uv:csúcsok, 13. begin 14. bejárvas :=IGAZ 15. sorba ( sq, ) 16. while Q nem üres do 17. begin 18. u :=első ( Q ) 19. for minden u v E élre do 20. if bejárvav =hamis then 21. begin 22. bejárvav :=IGAZ 23. sorba ( vq, ) 24. Dv Du 1 25. end 26. end 27. end A bejárás során felépíthetjük a gráf egy szélességi feszítő erdejét. E fákban osztályozhatjuk az éleket: Definíció (éltípusok): Tekintsük a G irányított gráf egy szélességi bejárásaként kapott T szélességi erdőt, G egy u faél, ha u v éle T -nek, v éle: előreél, ha u v nem faél, v leszármazottja u -nak T -ben, és u v; visszaél, ha u leszármazottja v -nek T -ben, 10

keresztél, ha u és v nem leszármazottai egymásnak. Az alábbi 6. ábra szemlélteti az éltípusokat: 6. ábra: e-előreél, f-faél, k-keresztél, v-visszaél A szélességi bejárás költsége O( n e), mert minden csúcsot pontosan egyszer teszünk be a sorba, és minden irányított élet egyszer vizsgálunk meg (amikor a kezdőpontja kikerül a sorból). A szélességi bejárás segítségével a d( u, v ) távolságok lineáris időben meghatározhatók, ugyanis a következők teljesülnek: Tétel: Legyen u x1, x2,..., xn a csúcsoknak a szélességi bejárás szerinti sorrendje. Ekkor 1. Dx Dx Dx 2. Ha u v 1 2... n 3. Dv d( u, v) éle G-nek, akkor Dv Du 1. teljesül minden v V csúcsra. Bizonyítás: 1. Könnyen látható, hogy a csúcsok az u x1, x2,..., xn sorrendben kerülnek bele a Q sorba, tehát így is kerülnek ki. Tehát ha egy xi u csúcs előbb van mint xi 1, akkor x szülője is megelőzi xi 1 szülőjét a sorban, ebből könnyen látszik, hogy Dx1,..., Dx n számsorozat nem csökkenő. Indukció alapján ez könnyen belátható a gyökérre és a fiaira, később pedig Dx Dszülő x i ( ) 1 és i 11

Dszülő x D x ( ) 1, ha az apák különbözők, akkor i1 i1 D szülő ( x ) D szülő ( x ) D x D x. Amennyiben a szülők i i1 i i1 megegyeznek, akkor Dx i D x. i 1 2. Vizsgáljuk meg, mi történik, ha v kikerül a Q sorból, és tekintsük ( uv, ) élet. Ha bejárva u = hamis, akkor u szülője v, tehát Du Dv 1. Ha u -t már korábban láttuk, akkor nyilván u szülője előbb van a sorban, mint v, vagyis az előző alapján: Dszülő ( u) Dv. Ebből pedig világosan látszik a bizonyítani kívánt egyenlőtlenség, csak mindkét oldalhoz egyet kell hozzáadni. 3. Nyilvánvaló, hogy Dv d( u, v) érvényes minden v V csúcsra, elég tehát a fordított egyenlőtlenséget igazolni. Legyen u y0, y1,..., yk v egy minimális hosszúságú G-beli irányított s -ből v -be vezető út. Ennek éleire sorra alkalmazzuk a tétel előzőleg már bebizonyított 2. állítását és láthatjuk, hogy ez az állítás is helyénvaló. 4.1.2 A Dijkstra algoritmus Dijkstra algoritmusa egy adott kezdőcsúcsból az összes többi csúcsba vezető legrövidebb utak problémáját egy súlyozott, irányított G = (V, E) gráfban, abban az esetben oldja meg, ha a nincsenek negatív súlyok az éleken, vagyis ha minden u v élre k( u, v) 0 teljesül. Az algoritmust Edsger Wybe Dijkstra, holland matematikus és informatikus alkotta meg 1956-ban. 4.1.2.1 Edsger Wybe Dijkstra 7. ábra: Edsger Wybe Dijkstra 12

Edsger Wybe Dijkstra 1930-ban született a hollandiai Rotterdamban. Szülei elismerten jó végzettségű értelmiségiek voltak, édesapja kémikus, édesanyja matematikus volt. 1942-ben, 12 éves korában bekerült egy igen magas színvonalú gimnáziumba, az Erasminium Gimnáziumba, ahova kivételes tehetségek jártak. Dijkstra sok különböző tárgyat tanult, mint például: görög, latin, francia, német és angol nyelv, valamint biológia, matematika és kémia. 1945-ben még jogi pályára készült, hogy utána képviselőként dolgozzon. Azonban abból kifolyólag, hogy kémiából, biológiából és matematikából jó eredményei voltak, úgy döntött, hogy a leideni egyetemen folytatja tanulmányait és elméleti pszichológiát hallgat. 1951 nyarán a cambridge-i egyetemen ismerkedett meg először a programozással. 1952 márciusától részmunkaidőben dolgozott egy amsterdami matematikai központnál, ekkor kezdte el igazán érdekelni az informatika. Amilyen gyorsan csak lehetett befejezte a pszichológiai tanulmányait és elkezdett hódolni ennek az új szenvedélyének. Miután 1957-ben megházasodott, folytatta munkáját a matematikai központban, miközben az 1970-es évek elején az egyesült államokbeli Borroughs Corporation kutatási tagja is volt. 1972-ben megkapta az ACM Turing Díjat, 1974- ben az AFIPS Harry Good Memorial Díjat. Az 1980-as évek elején a texasi Austinba költözött, majd 1984-ben állást is kapott az Informatikai Tudományok Egyetemén, ahol 69 éves koráig dolgozott. 1999-ben lett professor emeritus. Rákban halt meg nueneni otthonában 2002. augusztus 6-án. Főbb publikációi: - Go To Statement Considered Harmful Communications of the ACM (1968), - A note on two problems in connexion with graphs. Numerische Mathematik (1959) - Structured Programming, melyet O.-J. Dahl-el és C. A. R. Hoare-val írt 1972- ben. Néhány cikke: - The Humble Programmer (1972. augusztus) - How do we tell truths that might hurt? (1982. május) (Wikipedia, 2007) A másodikként említett publikációja alapján, hogyan is gondolkodott ő a gráfok problémáiról: 13

Összefüggő gráfok két problémája Tekintsünk n darab pontot, melyek közül néhányat vagy mindegyiket él köt össze, az élek hossza adott. Tegyük fel, hogy legalább egy él létezik valamely két pont között. Nézzük az alábbi két problémát: Első probléma: Készítsük el az n csúcs minimális költségű fáját. (Azt a fát, amelyben minden csúcs között egy és csakis egy út vezet.) Az algoritmus első lépéseként három csoportra osztjuk az éleket. I. Az eljárás során már elfogadott élek. II. A következő lépésben az I. csoportba választandó élek halmaza. III. A kimaradó élek (vagy már elutasítottuk őket, vagy még nem vizsgáltuk meg). A csúcsokat két csoportba sorolhatjuk. A: Azon élek végpontjai, amelyek az I. csoportban vannak. B: A kimaradó csúcsok (egy és csakis egy II. csoportbeli él vezet minden ilyen kimaradó csúcshoz). Kezdjük az eljárást egy tetszőleges A csoportbeli csúccsal, majd válasszuk ki azokat a II. csoportbeli éleket, amelyeknek egyik végpontja az A csúcs. Kezdetben az I. csoport üres. Ezek után ismételjük az alábbi két lépést: 1. lépés: A II. csoport legrövidebb élét tegyük I-be és az eddig a B csoportban lévő végpontját tegyük A- ba. 2. lépés: Tekintsük azokat az éleket, amelyek az éppen előbb az A csoportba helyezett csúcsból indulnak és egy B csoportbeli csúcsba érkeznek. Ha ezen élek közül valamelyik hosszabb, mint a neki megfelelő II. csoportbeli él, akkor elutasítjuk; amennyiben rövidebb annál, akkor kicseréljük őket és ezt az élt tesszük a II. csoportba, és a másikat vetjük el. Ezután visszatérünk az 1. lépéshez és a két lépést addig ismételgetjük, amíg a B és a II. csoport üres nem lesz. Végül az I. csoportban lévő élek megadják a keresett fát. Ez a megoldás használhatóbb, mint a Kruskal-, a H.Loberman- vagy a A.Weinberger-féle módszer. Az ő megoldásukban az összes élek elsősorban a hosszúság szerint vannak osztályozva. Még akkor is, ha az a csúcsok koordinátáiból kiszámolható, az eljárásukban az összes él egyidejű tárolása szükséges. A fenti eljárás során legfeljebb csak n darab él adatát kell tárolni, ugyanis a 2. lépés során csak az I. és a II. csoportbeli éleket vizsgáljuk. ( ) (E.W.Dijkstra, 1959) 4.1.2.2 Dijksta algoritmusa éllistával A Dijkstra algoritmus azoknak a csúcsoknak az S halmazát tartja nyilván, amelyekhez már meghatározta az u kezdőcsúcsból odavezető legrövidebb út 14

súlyát. Az algoritmus minden lépésben a legkisebb legrövidebb-út becslésű xv S csúcsot választja ki, beteszi az x -t S -be, és minden x -ből kivezető éllel egy-egy közelítést végez. A V S csúcsok nyilvántartására egy Q sort alkalmazunk, amelyet azok d értékeivel töltünk fel. DIJKSTRA ( Gu, ) eljárás 1. procedure Dijkstra 2. begin 3. for minden v V csúcsra do 4. Dv : 5. szülőv: 6. end 7. Du 0 8. var 9. S : 10. Q : csúcsokból álló sor 11. begin 12. while Q nem üres do 13. begin 14. x : minimális Q 15. S : S x 16. for minden vszomszéd x 17. if Dv Dx k( x, v) 18. begin 19. : A Dijkstra algoritmus mohó stratégiát alkalmaz, hiszen mindig a legközelebbi csúcsot választja ki V S -re do then Dv Dx k( x, v) 20. szülőv x 21. end 22. end 23. end -ből, hogy azután az S halmazba tegye. A mohó stratégiák általában nem adnak optimális eredményt, de az alábbi tétel mutatja, hogy a Dijkstra algoritmus szükségszerűen a legrövidebb utakat állítja elő. Tétel (Dijkstra algoritmus helyessége): Ha Dijkstra algoritmusát egy nemnegatív k súlyfüggvénnyel súlyozott, u kezdőcsúcsú irányított G = (V, E) gráfban futtatjuk, akkor annak befejezésekor minden x V csúcsra teljesül, hogy Dx d u, x. 15

Bizonyítás: Indirekten tegyük fel, hogy x az első olyan csúcs, amire az S halmazba történő beillesztésekor igaz, hogy Dx d( x, u). Nyilván x u, tehát S közvetlenül x beillesztése előtt, tehát léteznie kell egy u és x csúcs közötti útnak, különben Dx d( u, x) kezdeti Dx d( x, u) egyenlőség fennállna, és ez ellentmondana a feltevésünknek. Ezek alapján léteznie kell egy p legrövidebb útnak u és x között, ahol u S és xv S. Legyen y az első olyan csúcs a p úton, amely már a V S halmazban van, és legyen y szülője a p úton a z csúcs. Ezek alapján a p -t felbonthatjuk két részre: p1 re és p2 re, ahol p 1 az u és a z csúcs közötti út, amelynek csúcsai S -ben vannak, p 2 pedig az y és az x csúcs közötti út, amelynek minden pontja V S halmazban van. Mivel y egy u és x csúcs közötti legrövidebb úton az x előtt van, a súlyok nemnegatívak valamint és így D y d( u, y) d( u, x) Dx d( u, y) d( u, x). De x és y is a V S halmazban van, ahonnan az algoritmus 8. sora az x -et úgy választja ki, hogy a D y egyenlőtlenség fennáll. Tehát Dx d( u, x) D x kezdeti feltevésünknek, vagyis Dx d( u, x) Leiserson, Ronald L. Rivest, 2001), amely ellentmond a. (Thomas H. Cormen, Charles E. 4.1.2.3 Az algoritmus futási ideje 8. ábra: Dijkstra algoritmusának működése Amennyiben a Q sort tömbbel valósítjuk meg: a kezdőértékek beállítása On ( ) elemi lépést vesz igénybe. A 14. sorban a minimumkeresés és a 17. sorban lévő 16

vizsgálat szintén On ( )-et, mivel a 14. sorban levő minimumkeresés n 1-szer fut le, így az algoritmus összidőigénye 2 On ( ) művelet. A további elemzéshez szükséges bevezetni néhány új fogalmat: Definíció (kupac): Egy olyan adatszerkezet, amely segítségével egy rendezett halmaz egy S részhalmazát tároljuk. A kupac elemeit bináris fában tároljuk. Definíció (minimumtörlés): A kupacszerkezet egyik alapművelete. Az adott rendezés szerinti legkisebb elem törlése. Definíció (kupac-tulajdonság): Egy tetszőleges csúcs elem nem lehet nagyobb a fiaiban levő elemeknél. Definíció ( d -kupac): Az S elemit egy teljes d -fa csúcsaiban helyezzük el úgy, hogy teljesüljön a kupac-tulajdonság. Ha a gráf ritka, akkor célszerű a Q sort bináris kupaccal implementálni a D értékek szerint. A kezdeti kupacépítés On ( ) költséggel végezhető el. A 14. sorban lévő minimumkeresést egy O(log n ) költségű minimumtörlés művelettel oldjuk meg. A D értékeinek újraszámolását és a kupac-tulajdonság helyreállítását csak a választott csúcs szomszédjaira kell elvégezni. Minden csúcsot pontosan egyszer választunk ki, és a szomszédok számának összege e. Tehát az összidőigény O(( n e)log n). Sűrű gráfok esetén még komolyabb gyorsítás érhető el alkalmas d -kupaccal. Ekkor a futási idő O( n nd log n elog n) lesz. 4.1.2.4 Az utak nyomon követése d d Sokszor nemcsak a legrövidebb utak hosszára vagyunk kíváncsiak, hanem magukra az utakra is: az algoritmus 20. sora tartalmazza ezt, hiszen minden csúcs szülőjét feljegyezzük és akár egy újabb tömbben elhelyezhetjük, anélkül, hogy a futási időt megnövelnénk. 17

4.1.2.5 Érdekességek Természetesen a módszer működik irányítatlan gráfok esetén is hiszen, ahogy már említettük minden irányítatlan él felfogható úgy, mintha mindkét irányban irányított lenne. Ezek alapján már nem csodálkozunk azon, hogy mennyi mindenre jó ez az eljárás. Többek között az ütemezéselméletben előforduló J n 2 C problémára, melynek jelentése: két olyan munkának a befejezési idejét szeretnénk minimálisra szorítani, amelyek számos kisebb részmunkából tevődnek össze. A részmunkákat több különböző gép végzi el, a gépek sorrendje tetszőleges. Legyen adott a két munka megmunkálási ideje, jelöljük ezt pi, j-vel, ahol az i a gépek, a j pedig a munkák sorszáma. Például a p4,3 5 óra jelentése: a harmadik munkát a negyedik gép 5 óra alatt végzi el. Ebben a feladatban j 1 vagy 2, i m, ahol mz +. Ezen kívül adottak még minden j -re a gépek egy j sorrendje. A megadott sorrendek alapján könnyen ábrázolhatjuk a folyamatot. max 9. ábra: A folyamat szemléltetése Az ábra y tengelyén a 2 szerinti p i,2 hosszú részek adják a felosztást, míg az x tengelyén a 1 szerinti p i,1 hosszú részek. A kép egy hatgépes esetet mutat be. A 18

szürkével jelzett négyzetek a tiltott négyzetek, az azonos hosszúságú szakaszok metszete, az ábra O pontjából F pontjába tartó sötétszürke görbe a megengedett görbe. Jól látható, hogy vízszintes, függőleges és 45 -os szakaszok alkotják. Fontos tulajdonsága, hogy nem lép be tiltott négyzetbe, valamint ha vízszintesen halad, akkor y nem lehet belső koordináta, ha függőlegesen, akkor pedig x nem lehet az. Lemma: Minden megengedett ütemezés megad egy ilyen P megengedett görbét, S továbbá Cmax h( P), ahol hp= ( ) vízszintes szakaszok hossza + függőleges szakaszok hossza + a 45 -os szakaszok vetületének hossza ( C minimális befejezési idő). (A lemma fordított irányban is igaz.) S max : az S ütemezés által kapott Ezek után könnyű meghatározni a célt: a legrövidebb görbe meghatározása. Van még egy szembetűnő dolog az ábrán: a tiltott négyzetek bal felső és jobb alsó sarkában látható pontok, ezek az úgynevezett speciális pontok. Ezek segítségével definiáljuk a speciális részgörbéket és a speciális görbét. Definíció (speciális részgörbe, speciális görbe): A speciális részgörbe speciális pontokat köt össze. A speciális görbe pedig a speciális részgörbék uniója. Lemma: Minden megengedett P görbéhez h( P) h( P'). P' speciális görbe úgy, hogy Vagyis keressük azt a legrövidebb speciális görbét, amely O -ból F -be megy. Ez alapján a feladat ekvivalens egy legrövidebb út problémával, ahol a gráfunk pontjai a speciális pontok, az élei a speciális pontokból indulnak az onnan induló speciális részgörbék másik végpontjába, melyekből egy vagy kettő lehet. Az élhosszúságot a h alapján kapjuk, amelyek nemnegatívak, hiszen megmunkálási időkről beszélünk. A másik érdekes dolog, hogy a Dijkstra algoritmus módosításával legbiztonságosabb utat is lehet keresni. Legyenek az élsúlyok a tönkremenés valószínűségei, vagyis minden e élhez adott egy p valószínűség, hogy az adott él tönkremegy-e. Ezek alapján egy P út el 19

nem romlási, megmaradási esélye (1 pe ( )). Ezt szeretnénk maximalizálni. ep Vegyük ennek a kifejezésnek a logaritmusát (ezt megtehetjük, mert a logaritmus függvény monoton) és ezt maximalizáljuk: max (1 pe ( )) ep max log (1 p( e)) max log(1 p( e)) min ( log(1 p( e))) ep ep Ezek alapján írjuk át a gráfunk költségeit, legyen az új költség: k( e) log(1 p( e)). Erről tudjuk, hogy nemnegatív, vagyis alkalmazható a Dijkstra algoritmus erre az új költségekkel ellátott gráfra. Lássunk egy egyszerű példát: tegyük fel, hogy egy háborús övezet katonái az alábbi 10. ábra lévő térképet kapják az ellenséges területről. A katonáknak el kell jutni az egyessel jelzett városból a kettessel jelzett városba. A gráf élein szereplő valószínűségek azt mutatják, hogy az i -dik városból a j -dik városba mekkora eséllyel nem sikerül eljutni. ep 10. ábra: A kapott térkép A következő 11. ábra mutatja, hogy melyik utat kell választaniuk, hogy a legnagyobb eséllyel eljussanak a kettes jelzésű városba. 11. ábra: A legbiztonságosabb út 20

4.1.3 A Bellman-Ford-algoritmus A Bellman-Ford-algoritmus az adott kezdőcsúcsból induló legrövidebb utak problémáját abban az esetben oldja meg, amikor vannak az élek között negatív súlyúak, de nem találunk a gráfban negatív kört. Az algoritmus szülőatyjaként Richard Bellmant és ifjabb Lester Randolph Fordot tisztelik. 4.1.3.1 Lester Randolph Ford, Richard Bellman Ifjabb Lester Randolph Ford 1927. szeptember 23-án született. A Network Flow programozás egyik úttörője. Édesapja az idősebbik L.R. Ford, aki maga is elismert matematikus, a Farey sorozatokra adott egy bámulatos értelmezést. Ifjabb L.R. Ford nevéhez fűződik többek között a Ford-Fulkerson algoritmus is, amely a maximális folyam problémát oldja meg. (Singh Nayandeep, 2001) Richard Ernest Bellman (1920. augusztus 26.- 1984. március 19.) alkalmazott matematikus volt, az 1953-as dinamikus programozás terén elért felfedezéséért volt méltán ünnepelt, valamint nevéhez köthető, sok a matematika más területén elért eredmény is. 12. ábra: Richard E. Bellman New Yorkban született, ahol édesapja, John James Bellman egy élelmiszerüzletet vezetett a Bergen utcában a Prospest Park közelében Brooklynban. Bellman a középiskolát 1937-ben fejezte be az Abraham Lincoln Középiskolában (New York), és matematikát hallgatott a brooklyni főiskolán, ahol 1941-ben szerezett BA diplomát, a későbbiekben pedig a Wisconsin-Madison Egyetemen megszerezte az MA diplomát is. A II. világháború idején a hadseregnél az Elméleti Pszichológia Részlegen dolgozott Los Alamosban. 1946-ban megszerezte a Ph.D titulust a Princetonon. A dél kaliforniai egyetem professzora 21

volt, ösztöndíjas kutatója az amerikai Tudományok és Művészetek Akadémiájának (1975), valamint tagja a nemzeti Mérnöki Akadémiának (1977). 1979-ben az IEEE Becsület Medállal tüntették ki A döntési eljárások és az ellenőrző rendszerek területén elért eredményéért, különösen a dinamikus programozásban alkotottakért. Legfőbb műve a Bellman-Egyenlet. (Wikipedia, 2009) 4.1.3.2 Az eljárás Adott egy k: E R súlyfüggvénnyel súlyozott irányított G ( V, E) gráf, ahol a kezdőcsúcs az s. Az algoritmus visszajelzi, ha van a gráfban s -ből elérhető negatív kör, ha nincs benne, akkor előállítja a megoldást. BELLMAN-FORD( D, k, s ) eljárás. 1. procedue Bellman-Ford 2. begin 3. for minden v V csúcsra do 4. Dv : 5. szülőv: 6. end 7. begin 8. for i 1 to n 1 do 9. begin 10. for minden ( uv, ) élre 11. if Dv Du k( u, v) then 12. begin D v : D u k( u, v) 13. 14. szülő v: u 15. end 16. end 17. end 18. begin 19. for minden ( uv, ) élre do 20. if Dv Du k( u, v) Az 1-6. sorok a kezdeti értékek beállítását mutatják. Aztán a 7-17. sorok ugyanazt az ellenőrzést végzik el mint a Dijkstra algoritmus esetében, végül a 18-23. sorok keresnek negatív köröket. then 21. return HAMIS 22. return IGAZ 23. end 22

Mielőtt az eljárás helyességének bizonyítására térnénk, definiáljuk a legrövidebb-utak fa fogalmát, valamint bevezetünk két jelölést is. Definíció (legrövidebb-utak fa): Legyen G ( V, E) egy irányított, k: E R súlyfüggvénnyel súlyozott gráf, és feltesszük, hogy G nem tartalmaz s kezdőcsúcsból elérhető negatív kört, azaz a legrövidebb utak jól definiáltak. Egy s-gyökerű legrövidebb-utak fa egy olyan G' ( V ', E ') részgráf, ahol V' V és E' E úgy, hogy - V ' az s-ből elérhető G-beli csúcsok halmaza, - G ' egy s gyökerű fa, és - minden v V csúcsra G ' -beli s-ből vezető út egy legrövidebb s-ből v-be vezető út a G-ben. Jelölések: - V szülő : a nem szülőjű G-beli csúcsokat tartalmazza és az s kezdőcsúcsot: V szülő = v V : szülő v s. - E szülő : azok az irányított élek, amelyek a szülő értékekből vezetnek a V szülő -beli csúcsokba: E szülő = szülő v, v E : v Vszülő s. Tétel (A Bellman-Ford-algoritmus helyessége): Egy G ( V, E) irányított gráfon futtassuk a BELLMAN-FORD-eljárást, ahol a súlyfüggvény a k: E R, és a kezdőcsúcs az s. Ha G nem tartalmaz az s-ből elérhető negatív köröket, akkor 1. minden v V csúcsra Dv d( s, v), 2. a végeredményül kapott fa egy s gyökerű legrövidebb-utak fa (jelöljük ezt G szülő =(V szülő,e szülő )-vel) 3. az algoritmus IGAZ értéket ad vissza, vagyis megadja a keresett legrövidebb utat. 4. Ha G tartalmaz s-ből elérhető negatív kört, akkor az eljárás HAMIS értékkel tér vissza. Bizonyítás: Tegyük fel, hogy G nem tartalmaz s -ből elérhető negatív kört. 1. Tegyük fel, hogy v elérhető s -ből, legyen p v0, v1,..., vk egy s -ből v -be vezető legrövidebb út ( v0 s, vk v). A p út egyszerű (nincs benne ismétlődő 23

csúcs), tehát k n 1. Indukcióval könnyen bizonyíthatjuk, hogy minden i0,1,..., kra Dv d( s, v ). Kezdetben Dv Tegyük fel, hogy Dv i i 0 d( s, s) 0 nyilván teljesül. d( s, v ) fennáll, az i dik lépésben az ( vi 1, vi) éllel i1 i1 való összehasonlítás hatására Dv d( s, v ) i 24 i, és ez meg is őrződik az eljárás során, mert: Dv Du k( u, v) d( s, u) k( u, v) d( s, v). (Tudjuk, hogy d( s, v ) alulról korlátozza Dv értékét.) Ha nem vezet út s -ből v -be, akkor az eljárás Tehát Dv d s, v akkor a távolságuk végtelen. Dv értékkel tér vissza., mert definíció szerint, ha két csúcs között nincsen út, 2. Az első tulajdonság bebizonyítása nagyon egyszerű. Definíció szerint egy legrövidebb út akkor és csak akkor véges, ha van a két csúcs között út. Az algoritmus során egy s -től különböző v csúcs akkor és csak akkor kap véges értéket, ha szülőv. A második tulajdonság bizonyítása indirekten történik. Tegyük fel, hogy Gszülő - ben van kör, bizonyítandó, hogy ez negatív kör. (Ekkor G -ben is kell lennie, de az ellentmondáshoz vezet.) A körön minden csúcs D értéke véges, vagyis elérhetők s -ből. Indukció és az algoritmus 10-15. sorai alapján az alábbi egyenlőtlenség kapható: ahol c v0, v1,..., vk a kör v v k k k D v D v k( v, v ) i i 1 i1 i i1 i1 i1 k. 0 Mivel a c kör minden csúcsa pontosan egyszer szerepel az egyes összegekben: Ebből következik, hogy k Dvi Dvi 1 i1 i1 k 0 k( vi 1, vi) i1 Vagyis azt kaptuk, hogy G tartalmaz negatív kört, ami viszont elvezet a keresett ellentmondáshoz. k

A harmadik tulajdonság bizonyításának első lépése hogy igazoljuk, hogy ezek az utak valóban léteznek. Ez teljes indukcióval könnyedén megtehető. Azt kell még belátni, hogy legfeljebb egy út megy s -ből minden vv szülő -beli csúcshoz. Indirekten tegyük fel, hogy két út is létezik valamely v V csúcshoz. szülő 13. ábra: Annak bizonyítására, hogy csak egy s-ből v-be menő út van G szülő -ben A p1 út s -ből v -be: s u x z v, a p 2 út s -ből v -be: s u y z v, ahol x y. Ám ekkor szülő z teljesül. 3. A befejezéskor minden ( u, v) x és szülő z y, ami csak x y esetén E élre: D v d( s, v) d( s, v) k( u, v) D u k( u, v) Tehát a 20. sorban lévő ellenőrzés után sem kapunk HAMIS értéket. 4. Tegyük fel, hogy G -ben van negatív kör, jelöljük c v0, v1,..., vk v k v 0, és tegyük fel, hogy az eljárás IGAZ értékkel tér vissza. -vel, ahol k Mivel c egy negatív kör, ezért: k( vi 1, vi) 0. A feltevésünk miatt (IGAZ értékkel tér vissza az algoritmus) az alábbi egyenlőtlenség teljesül: i1 k k k D v D v k( v, v ) i i 1 i1 i i1 i1 i1 Mivel a c kör mindegyik csúcsa pontosan egyszer szerepel az első két összegben, így k k Dvi Dvi 1 i1 i1 Vagyis 0 k( vi 1, vi), ami ellentmondás. i1 (Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, 2001) k 25

14. ábra: A Bellman-Ford eljárás működése 4.1.3.3 Az eljárás futási ideje és a legrövidebb út nyomon követése Az algoritmus futási ideje O( ne ), mivel a kezdő értékek beállítása On ( ) az n 1 darab csúcson végzett összehasonlítás mindegyike Oe () ideig tart és a 18-23. sorokban lévő ellenőrzés Oe () idejű. A legrövidebb út nyomon követése ugyanúgy megy, mint a Dijkstra algoritmusnál. A időt. szülőv értékeket eltesszük egy tömbbe, ez nem növeli a futási 4.2 Két adott csúcs közötti legrövidebb út Nyilvánvalóan, ha megoldjuk az adott csúcsból az összes többi csúcsba vezető legrövidebb utak problémáját, akkor a két adott csúcs közötti legrövidebb út problémát is megoldottuk. Érdekes azonban, hogy nem ismert ennek a problémának olyan megoldó algoritmusa, amelyik aszimptotikusan gyorsabb lenne az adott csúcsból az összes többi csúcsba vezető legrövidebb utak problémájánál. Dijkstra a következőképpen elmélkedett erről a problémáról Numerische Mathematik című művében. Összefüggő gráfok két problémája Tekintsünk n darab pontot, melyek közül néhányat vagy mindegyiket él köt össze, az élek hossza adott. Tegyük fel, hogy legalább egy él létezik valamely két pont között. Nézzük az alábbi két problémát: ( ) Második probléma: Keressük meg a legrövidebb utat két adott pont, P és Q között. Használjuk ki azt a tényt, hogy az R csúcs rajta van a P és Q közti legrövidebb úton, a majdani ismeretek tartalmazzák a P és R közti legrövidebb utat. A megoldás során megkapjuk az összes többi csúcsba menő legrövidebb utat, melyek a hosszúságok sorrendjében keletkeznek, egészen addig, amíg Q-t el nem érjük. 26

A megoldás első lépése, hogy a pontokat három csoportba osztjuk. A: Azok a csúcsok, amelyeknek P-től vett távolsága minimális. Ebbe a csoportba csak a P-től minimális távolságra lévő csúcsokat vesszük bele. B: A következő lépésben az A csoportba választható csúcsok halmaza. Ebben a csoportban az A halmazbeli pontokhoz kapcsolódó csúcsok vannak (a belőlük kiinduló él másik végpontja már A- ban van). C: Kimaradó csúcsok. Az éleket is 3 csoportba soroljuk: I. A P csúcs és az A csoportbeli pontok közötti minimális utat alkotó élek. II. Azoknak az éleknek a halmaza, amelyekből kiválasztjuk a I. csoportba helyezendő élet; egy és csakis egy él vezet ebből a halmazból mindegyik B halmazbeli csúcshoz. III. A kimaradó csúcsok (vagy már elutasítottuk őket, vagy még nem vizsgáltuk meg). Kezdetben minden csúcs C-ben, és minden él a III csoportban van. Először tegyük a P csúcsot az A csoportba, majd az alábbi lépéseket ismételgessük. Első lépés: Tekintsük az összes olyan r élet, amely az éppen az A csoportba tett csúcs és R között mennek, ahol R lehet a B illetve a C csoportban is. Ha R a B csoportban van, akkor vizsgáljuk meg, hogy ennek az r élnek a használata egy rövidebb utat eredményez-e, mint a neki megfelelő (ugyanabba a csúcsba menő) eddig ismert II. csoportbeli út. Ha nem kapunk rövidebb utat az r él használatával, akkor r-et elutasítjuk (a III. csoportba tesszük), ha az r él használatával a kapott út rövidebb, mint a neki megfelelő út, akkor az eddig ismert utat lecseréljük erre az új, r élet használó útra. Amennyiben az R csúcs C-ben van, tegyük B-be és az r élet pedig a II. csoportba. Második lépés: Minden B csoportbeli csúcs és a P csúcs között egy és csakis egy út vezet, ha csak az I. és II. csoportba tartozó éleket vizsgáljuk, tehát minden egyes B csoportbeli csúcsnak véges távolsága van P csúcstól: azt a csúcsot, amelynek a legkisebb a távolsága P-től, tegyük az A halmazba, és a megfelelő élet helyezzük a II. csoportból az I. csoportba. Ezután térjünk vissza az első lépéshez és ismételgessük őket addig, amíg a Q csúcs az A halmazba nem kerül. Ekkor megkapjuk a keresett utat. Megjegyzések: 1. A fenti eljárás abban az esetben is alkalmazható, ha az élek hossza függ attól, hogy elutasítjuk, vagy megtartjuk őket. 2. Az I. és a II. csoportban lévő élek esetében érdemes feljegyezni a csúcsaik távolságát P-től (növekvő sorrendben). Az I. csoportbeli élek esetén ez a tényleges minimális távolságot jelenti, míg a II. csoportbeli élek esetén az eddig ismert minimális távolságot. Ez a megoldás hatékonyabb, mint a L.R.Ford-féle megoldás, abból a szempontból, hogy nem kell az összes élről egyidejűleg eltárolni az adatokat, elegendő csupán az I. és a II. csoportbeli élek adatait 27

tudnunk, és ez a szám mindig kevesebb, mint n. Ezen kívül a futási ideje is lényegesen kevesebb. (E.W.Dijkstra, 1959) 4.3 Egy adott csúcsba érkező legrövidebb utak Ennek a problémának a megoldása nagyon egyszerű: csupán annyi a teendőnk hogy megfordítjuk a gráfunk irányítását. Ezáltal visszavezetjük a feladatot az egy csúcsból kiinduló legrövidebb utak kérdésére, amely megoldásának módszereit már fentebb, a 4.1 fejezetben taglaltuk. 4.4 Legrövidebb utak minden csúcspárra Ebben a fejezetben célunk, hogy egy gráf valamennyi rendezett csúcspárjára a két csúcs közötti legrövidebb út megkeresése. Ha például egy autóstérképhez elkészítjük a városok egymástól vett távolságainak táblázatát, akkor éppen ezt a problémát oldjuk meg. Természetesen a 4.1-es fejezetben bemutatott algoritmusok itt is használhatók, ha minden csúcsra lefutatjuk őket, amennyiben a távolságok nem negatívak, akkor a Dijkstra eljárást, ha vannak negatív élek, akkor a kicsit költségesebb Bellman- Ford módszert. Vannak azonban ennél következetesebb módszerek is. 4.4.1 Floyd algoritmusa Ez az algoritmus abban az esetben oldja meg az összes csúcspár közötti legrövidebb utak problémáját, ha a bemenő gráfban nincsenek negatív körök (negatív élek lehetnek). 4.4.1.1 Robert W. Floyd 15. ábra: Robert W. Floyd Robert W. Floyd (1936. június 8. 2001. szeptember 25) egy kivételesen tehetséges informatikus volt. New Yorkban született, 14 évesen már maga mögött 28

tudta a középiskolát és 17 évesen, 1953-ban a chichagoi egyetemen BA diplomát szerzett bölcsész szakon, majd 1958-ban pszichológiából. Az 1960-as évek elején kezdett el operátorként dolgozni, számos érdekes cikket publikált, mígnem 27 éves korában a Caregie Mellon Egyetemen helyettes professzornak ki nem nevezték. 6 évvel később, miután megszerezte a Ph.D címet a Stanford Egyetem professzora lett. Floyd Donald Knuth közeli munkatársa volt, és mint bíráló segített neki elkészíteni könyvét: The Art of Computer Programming, emiatt Donald nagy hatással volt Floyd munkásságára. 1994-ben Richard Beigellel elkészítették a The Language of Machines: an Introduction to Computability and Formal Languages című tankönyvüket. 1978-ban kapta meg a Turing-díjat az informatika számos területén elért eredményéért, különösen a formális nyelvek témakörében alkotottakért. Floyd élete során kétszer házasodott meg, és kétszer is vált el, négy gyermeke volt. Hobbijai a túrázás és a backgammon 1 voltak. (Wikipedia, 2009) 4.4.1.2 Az algoritmus Tegyük fel, hogy a G ( V, E) gráf K adjacencia mátrixszal van megadva. A pontpárok távolságának kiszámítására egy szintén nn-es F mátrixot fogunk használni. Kezdetben F i, j: K i, j. Ezután egy ciklust hajtunk végre, amelynek k -adik lefutása után F i, j azon i j utak legrövidebbjeinek a hosszát tartalmazza, amelyek közbülső pontjai k -nál nagyobb sorszámúak. F i j értékeket a következőképpen számíthatjuk ki a k 1-edik iteráció Az új, utáni F i j k k 1, értékekből (itt az index az F különböző pillanatnyi értékeire utal). Nyilván egy legrövidebb i j út, amelyen a közbülső pontok sorszáma legfeljebb k (természetesen a kezdő- és végpontok nem számítanak közbülső pontnak), vagy tartalmazza a k csúcsot vagy nem. - Ha k nincs rajta az i j úton, akkor F i j - Ha rajta van a k csúcs az i j úton, akkor k 1,. 1 A backgammon egy két személyes társasjáték, ahol a korongokat a dobókocka dobások alapján kell mozgatni. 29

amennyiben ennek a csúcsnak a használatával előálló út rövidebb, mint az eddig ismert út, akkor ennek az új útnak a hosszát írjuk be F i, j -be, ha hosszabb, akkor a régi út hosszát, vagyis F i j k k1, ha több út is vezet az adott csúcson keresztül, akkor értelemszerűen a rövidebb értékét írjuk bele, F i j -be. k -t, FLOYD ELJÁRÁS ( Gk, ) 1. procedure Floyd 2. begin 3. for minden i V csúcsra do 4. begin 5. for minden j V csúcsra do 6. F i, j: K i, j 7. end 8. end 9. Pi, j: 0 10. begin 11. for minden k V 12. begin csúcsra do 13. for minden i V csúcsra do 14. begin 15. for minden j V csúcsra do 16. F i, j: min F i, j, F i, k F k, j 17. if F i, j értéke csökken then 18. Pi, j k 19. end 20. end 21. end 4.4.1.3 Az utak nyomon követése és a futási idő A kód magában rejti az utak nyomon követésének módszerét, ami futási időt nem befolyásolja. A 9. sorban definiálunk egy P tömböt, amelybe akkor tesszük be a k csúcsot, ha a F i, j érték megváltozik (17-18. sorok). Tehát, P i j egy legrövidebb i j út középső csúcsát fogja tartalmazni. Ezek alapján az i j út összeállításához találnunk kell egy i -ből ebbe a közbülső csúcsba vezető legrövidebb utat, és egy ebből a csúcsból j -be vezető legrövidebb utat. De ezen utaknak is ismerjük egy-egy középső csúcsát, és így tovább. 30

Az algoritmus lépésszáma 3 n -bel arányos, hiszen a domináló rész három egymásba ágyazott for ciklus. Mondhatnánk, hogy ez nagyságrendben ugyanannyi, mintha a Dijkstra mátrixos változata, de pontosabb elemzéssel kiderül, hogy a Floyd-módszer 50%-kal gyorsabb. Ha a gráf éleinek száma jóval kisebb, mint 2 n, és az élsúlyok nemnegatívak, akkor viszont érdemesebb a Dijkstra-algoritmus éllistás változatát használni. 4.4.1.4 Az eljárás működése egy példán keresztül 0 1 0 1 3 F0 0 4 0 2 2 1 0 F 2 0 1 0 3 0 1 3 0 4 0 2 1 2 1 0 0 1 0 3 2 5 0 1 4 3 F5 0 4 0 2 1 2 1 0 16. ábra: Példagráf a Floyd-eljárás működésének szemléltetéséhez 0 1 0 1 3 F1 0 4 0 2 1 2 1 0 0 1 0 3 2 0 1 5 3 F3 F4 0 4 0 2 1 2 1 0 Az F 3 és az F 4 egyenlősége abból ered, hogy a 4. csúcsból nem indul ki él, így az nem lehet közbülső csúcs. 31

4.4.2 Warshall algoritmusa Ez az algoritmus a fent említett Floyd algoritmusnál idősebb, de a módszer lényegében ugyanaz. A szakirodalomban gyakran a hasonlóság miatt egybe vonják a két algoritmust és Floyd-Warshall néven tüntetik fel. A különbség köztük az, hogy ez az algoritmus csak azt mondja meg, hogy mely pontok között megy irányított út, a hosszukat már nem adja meg. 4.4.2.1 Stephen Warshall Stephen Warshall 1935-ben született New York-ban. Karrierje során sok kutatást végzett az operációs rendszerek területén, a programozási nyelvek fejlesztésénél és sok más informatikai témakörben. Warshall a brooklyni általános iskolába járt, a Mount Vernon (New York) középiskolában érettségizett, majd a Harward egyetemen szerezte meg a Bsc diplomáját matematikából 1956-ban. Magasabb végzettséget nem szerezett, ennek ellenére különböző egyetemeken (köztük francia iskolákban is) tartott előadásokat, ezzel is elősegítve az informatika és a szoftverfejlesztés fejlődését. Miután megszerezte a Bsc diplomáját, az ORO-nál (Operation Research Office) helyezkedett el. John Hopkins által létrehozott program keretein belül végzett kutatásokat az amerikai hadseregnek. 1958-ban eljött innen és egy Technical Operations nevű vállalkozásnál vállalt munkát, a munkája hasonló volt az előzőhöz: katonai szoftverek fejlesztése. 1961-ben a massachusettsi Informatikai Egyesület tagja lett, később ez az egyesület egybeolvadt az Apllied Data Research (ADR) céggel. Ekkor Warshall vezetői kitüntetést kapott és felügyelte a projecteket és szervezeteket. 1982-ben vonult nyugdíjba, végül 2006. december 11-én halt meg rákban. (Wikipedia, 2009) 4.4.2.2 Az algoritmus Mielőtt az eljárás lépéseire térnénk definiálni kell a tranzitív lezárt fogalmát. Definíció (tranzitív lezárt): Legyen G=(V,E) egy irányított gráf, A az adjacencia mátrixa. Legyen továbbá T a következő nn-es mátrix: T i, j 1 0 ha i-ből j elérhető irányított úttal különben. 32

Ekkor a T mátrixot illetve az általa meghatározott gráfot az A mátrix illetve az általa meghatározott G gráf tranzitív lezártjának nevezzük. A fent részletezett Floyd-eljárásban csupán néhány változtatást kell tenni. A 6. sorban a kezdőértékek beállítása helyett: T i, j 1 0 ha i=j vagy Ai, j 1, különben. A 16. sorban F értékeinek változása helyett: T i, j T i, j T i, k T k, j, valamint a 17. sorban nem az F értékeinek csökkenése esetén tesszük bele a k csúcsot a P tömbbe, hanem amikor a T i, j érték változik meg. 3 Nyilvánvalóan a futási idő változatlan marad: On, és az utak nyomon követése is megegyezik a Floyd algoritmusnál leírtakkal. Tekintsük az alábbi példát a működésére: 17. ábra: Példagráf a Warshall-algoritmus működésének bemutatásához T T (0) (2) 1 1 0 0 1 0 1 1 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 0 0 1 0 0 0 0 1 1 T (1) 1 1 0 0 1 0 1 1 0 0 1 1 1 1 1 0 0 0 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 (3) (4) (5) T T T 1 1 1 1 1 0 0 0 1 0 0 0 0 1 1 33

A T T (3) (4) közbülső csúcs. azért igaz, mert a 4 csúcsból nem indul ki él, így az nem lehet (5) (5) T egyenlősége az előző kettőhöz látszólagos, a T 1,4 értéknél szemmel nem látható változás történt. Ugyanis az 1. csúcsból megy él a 2 (2) (3) és a 3-as csúcson keresztül ezt jelzi, hogy T T 1,4 1,4 1, de az 5. csúcson keresztül is vezet egy másik út, így a T i, j T i, j T i, k T k, j képlet alapján mindegy, hogy melyiket választjuk ki. 4.4.3 Johnson algoritmusa Johnson módszerével az összes csúcspár közti legrövidebb utakat 2 O( n lg n ne) időben találhatjuk meg, tehát ritka gráfokon ez lényegesen gyorsabb, mint az eddig ismert módszerek. Johnson eljárásának megértéséhez szükségünk van a Dijkstra- és a Bellman- Ford algoritmusok pontos ismeretére, mert az eljárás magában foglalja ezeket. A Johnson algoritmus (hasonlóan a Bellman-Fordhoz) HAMIS értéket ad vissza, ha a gráf tartalmaz negatív kört. A módszer alapötlete a következő átsúlyozó technika. Amennyiben a gráfban nincsenek negatív élek, akkor a természetesen használhatjuk a Dijkstraalgoritmust minden csúcsra, mint forrásra. Ahhoz hogy a fenti futási időt elérjük Fibonacci-kupacokat kell alkalmaznunk. Definíció (Fibonacci-kupac): A bináris kupacokkal ellentétben a Fibonaccikupacban levő fák nem rendezettek. Minden x csúcsnak van egy (mutató) a szülőjére, és egy px pointere gyerek x pointere az egyik gyerekére. Az x csúcs gyerekei egy kétirányú ciklikus listával vannak összekapcsolva, ezt a listát az x gyerek listájának nevezik. A gyerekek sorrendje a gyerek listában tetszőleges. Ebben az adatszerkezetben a műveletek gyorsabban elvégezhetők a pointerek miatt. Ha vannak negatív éleink, akkor a következőképpen kell eljárnunk: olyan új ˆk nemnegatív értékeket kell találnunk, melyeken azután az előző megoldás alkalmazható. A ˆk súlyoknak a következő két feltételnek kell eleget tenniük: 34

a) Minden u, v V csúcspárra a k súlyozás szerint vett bármely legrövidebb u -ból v -be menő út a ˆk szerint is az. b) Minden ( u, v) E élre az új k ˆ( u, v ) súly nemnegatív. Az a) tulajdonságnak eleget tevő átsúlyozást az alábbi lemma alapján igen egyszerű elkészíteni. Lemma (átsúlyozás): Legyen hvr : tetszőleges valós értékű függvény egy G ( V, E) irányított gráf csúcsain. Legyen k: E R ugyanennek a gráfnak az élsúlyozása. Minden ( u, v) E élre legyen k ˆ( u, v) k( u, v) h( u) h( v). Ekkor 1. minden v, 0 v k csúcspárra és minden p v0, v1,..., vk útra pontosan akkor lesz ( ) (, ), ha kˆ( p) dˆ( v0, v k ), ahol d ˆ( v, ) 0 vk a ˆk súlyozással keletkező út k p d v0 v k súlya; 2. továbbá pontosan akkor van a G gráfban negatív kör a k súlyozás szerint, ha ˆk súlyozás szerint is van. Bizonyítás: 1. Először belátjuk, hogy kˆ( p ) k ( p ) h ( v0 ) h ( v k ). A k ˆ( p ) súly a következő teleszkópos összeggé alakítható: k k kˆ( p) kˆ( v, v ) ( k( v, v ) h( v ) h( v )) i1 i i1 i i i1 i1 i1 k k k k( v, v ) h( v ) h( v ) k( p) h( v ) h( v ). i1 i i i1 0 k i1 i1 i1 Tegyük fel, hogy a ˆk súlyozással valamely v, 0 v k csúcspár között találtunk egy p ' utat, amely rövidebb, mint a k súlyozás esetén kialakult p út. Alkalmazzunk a p és p ' utakra a fenti kˆ( p ) k ( p ) h ( v0 ) h ( v k ) egyenlőséget: k( p') h( v ) h( v ) kˆ( p') kˆ( p) k( p) h( v ) h( v ), 0 k 0 amelyből k( p') k( p) következik. Ez azonban ellentmond annak a feltevésnek, hogy p a legrövidebb út v 0 és v k csúcsok között. k 35