Dijkstra algoritmusa Hujter Bálint Specmat továbbképzés, július 1.

Hasonló dokumentumok
Dijkstra algoritmusa

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

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

Algoritmuselmélet 7. előadás

A számítástudomány alapjai

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

Gráfalgoritmusok ismétlés ősz

22. GRÁFOK ÁBRÁZOLÁSA

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.

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

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

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

Nagyságrendek. Kiegészítő anyag az Algoritmuselmélet tárgyhoz. Friedl Katalin BME SZIT február 1.

Algoritmusok és adatszerkezetek gyakorlat 07

Algoritmusok bonyolultsága

Diszkrét matematika 2.C szakirány

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.

30. ERŐSEN ÜSSZEFÜGGŐ KOMPONENSEK

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

Algoritmuselmélet. Bonyolultságelmélet. Katona Gyula Y.

SzA II. gyakorlat, szeptember 18.

Algoritmusok Tervezése. 6. Előadás Algoritmusok 101 Dr. Bécsi Tamás

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.

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)}

Általános algoritmustervezési módszerek

Diszkrét matematika 2.C szakirány

Osztott algoritmusok

Diszkrét matematika 2.C szakirány

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

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

B-fa. Felépítés, alapvető műveletek. Programozás II. előadás. Szénási Sándor.

Ellenőrző kérdések. 36. Ha t szintű indexet használunk, mennyi a keresési költség blokkműveletek számában mérve? (1 pont) log 2 (B(I (t) )) + t

Gráfelméleti alapfogalmak

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

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

Sali Attila Budapest Műszaki és Gazdaságtudományi Egyetem. I. B. 137/b március 16.

Gráfelmélet/Diszkrét Matematika MSc hallgatók számára. 3. Előadás

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. 12.

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

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

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.

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

file:///d:/okt/ad/jegyzet/ad1/b+fa.html

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.

Diszkrét matematika 2.

OKTV 2005/2006 döntő forduló

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

Javító és majdnem javító utak

A 2014/2015 tanévi Országos Középiskolai Tanulmányi Verseny döntő forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Adatszerkezetek 2. Dr. Iványi Péter

Arany Dániel Matematikai Tanulóverseny 2016/2017-es tanév Kezdők III. kategória I. forduló

minden x D esetén, akkor x 0 -at a függvény maximumhelyének mondjuk, f(x 0 )-at pedig az (abszolút) maximumértékének.

17. A 2-3 fák és B-fák. 2-3 fák

Euler tétel következménye 1:ha G összefüggő síkgráf és legalább 3 pontja van, akkor: e 3

Diszkrét matematika 2.C szakirány

1. előadás. Lineáris algebra numerikus módszerei. Hibaszámítás Számábrázolás Kerekítés, levágás Klasszikus hibaanalízis Abszolút hiba Relatív hiba

Az optimális megoldást adó algoritmusok

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

Adatbázisok elmélete 12. előadás

Diszkrét matematika 2.

A sorozat fogalma. függvényeket sorozatoknak nevezzük. Amennyiben az értékkészlet. az értékkészlet a komplex számok halmaza, akkor komplex

HÁLÓZAT Maximális folyam, minimális vágás

Megoldások 7. gyakorlat Síkgráfok, dualitás, gyenge izomorfia, Whitney-tételei

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

Más szavakkal formálisan:, ahol olyan egész szám, hogy. Más szavakkal formálisan:, ahol olyan egész szám, hogy.

Az R halmazt a valós számok halmazának nevezzük, ha teljesíti az alábbi 3 axiómacsoport axiómáit.

EGYSZERŰ, NEM IRÁNYÍTOTT (IRÁNYÍTATLAN) GRÁF

Időjárási csúcsok. Bemenet. Kimenet. Példa. Korlátok. Nemes Tihamér Nemzetközi Informatikai Tanulmányi Verseny, 2-3. korcsoport

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

Algoritmuselmélet zárthelyi (BSc képzés) április 24.

A matematikai feladatok és megoldások konvenciói

Gráfokkal megoldható hétköznapi problémák

KOVÁCS BÉLA, MATEMATIKA I.

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

A 2013/2014 tanévi Országos Középiskolai Tanulmányi Verseny döntő forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Javítókulcs, Válogató Nov. 25.

Nagyordó, Omega, Theta, Kisordó

Mesterséges Intelligencia MI

1/50. Teljes indukció 1. Back Close

Gráfelméleti alapfogalmak-1

Arany Dániel Matematikai Tanulóverseny 2015/2016-os tanév 1. forduló Haladók III. kategória

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

KOVÁCS BÉLA, MATEMATIKA I.

Hadamard-mátrixok Előadó: Hajnal Péter február 23.

PISA2000. Nyilvánosságra hozott feladatok matematikából

Arany Dániel Matematikai Tanulóverseny 2009/2010-es tanév első (iskolai) forduló haladók II. kategória

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:

Egészrészes feladatok

Diszkrét matematika 2.C szakirány

Analízis I. Vizsgatételsor

11. Előadás. 11. előadás Bevezetés a lineáris programozásba

Adatszerkezetek II. 2. előadás

Algoritmuselmélet 18. előadás

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

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny második fordulójának feladatai. INFORMATIKA II. (programozás) kategória

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny második forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny első forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Átírás:

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1. Dijkstra algoritmusa Hujter Bálint Specmat továbbképzés, 01. július 1. Az alábbi képeken 1 Franciország úthálózatának sematikus rajza látható. Többféle útvonal szóba jöhet két város, például Párizs és Marseille között. Természetes kérdés, hogy miként lehet ezek közül a legrövidebbet kiválasztani, összhosszúságát meghatározni. Dijkstra algoritmusa erre, és ehhez hasonló feladatok egy nagyobb családjának megoldására ad gyakorlatban is jól használható módszert. Több érv is felhozható a speciális matematika szakon való tanítása mellett. A megoldandó feladat egy természetes és valószerű probléma (gondoljunk az útvonaltervező szoftverekre). Az ismertetendő algoritmu ténylegesen jól használható a valóságközeli problémáknál a legjobb szoftverek is tipikusan ennek néhány ügyes trükkel módosított verzióit használják. A Dijkstra-algoritmus ráadásul algoritmus egyáltalán nem bonyolult, egy diák akár magától is rájöhet. Mégis több messzire vezető, például adatstruktúrákal kapcsolatos kérdés is természetesen vetődik fel a méylebb vizsgálata során. A hazai és nemzetközi programozó versenyeken is rendszeresen szerepelnek a Dijkstraalgoritmushoz kapcsolódó feladatok. Jó, ha a diákok látják, hogy ez nem csak egy infomratikai eszköz, hanem értelmes és érdekes matematikai háttere van ennek mélyebb megértése programozóként is segítheti őket. Előzetes tudás Előzetes tudásként támaszkodunk némi gráfelméleti alapiseretre (utak, séták, szélességi bejárás, irányított élek). Nem feltétel, de hasznos, ha a diákok programozni is tudnak; különösen is jó, ha gráfalgoritmusokat is kódoltak már. Érdemes az algoritmus lépésszámáról részletesen beszélni, ehhez némi algoritmuselméleti előképzettség is szükséges lehet (maximumkeresés összehasonlításokkal bináris keresés, aritmetikai műveletek algoritmizálása). 1 forrás: http://www.bonjourlafrance.com/france-map/images/france-driving-distances.jpg 1

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1. 1. Legrövidebb utak v v v v 6 v s v 1 t v 1.1. feladat. Hány élből áll a legrövidebb út az alábbi gráfon s és t csúcsok között? 1.1. megjegyzés. Az s és t betűjelekkel az angol source (forrás, kezdőpont) és target (célpont) elnevezésekre utalunk. Megoldás. A kérdésre könnyen megkapjuk a választ szélességi bejárással, egy legrövidebb út élből áll. A legrövidebb utak szerkezete is jól látszik: éppen akkor lesz egy st-út hosszú (azaz legrövedebb), ha minden éle egyet lefele lépő él a szélességi fában. s 1 v 1 v (t) v v v 6 v v 0(s) 1 t Hogyan változik a helyzet, ha különböző élek igénybevétele különböző költséggel járhat? (A költség többféle jellegű lehet: távolság, idő, pénz.) 1.. feladat. Az ábra egy park ösvényeinek vázlatos rajza. Minden útszakaszra felírtuk, hogy hány percig tart rajta végigsétálni. Legkevesebb hány percig tart egy s-ból t-be menő séta? (Hogyan járnánk el egy hasonló, de több csúcsú és élű gráf esetén?) v v v 6 t v 6 v v s 6 v 1

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1. Jó ötletnek tűnhet ismét a szélességi kereséssel próbálkozni. Ha a szélességi keresés sorrendjében próbálnánk kiszámolni ki az egyes csúcsok távolságát a szomszédaik távolságának segítségével, a bal oldali ábrán látható távolságokat kapnánk. Ezzel szemben a jobb oldali ábra mutat egy rövidebb összegű utat, mint amit az előbb megtaláltunk. [1] 16 [] v v 9 [] 6 1 [] v 6 t 1 [] 1 [] 11 [] v 6 v v 0 s 6 6 [1] s 6 v 1 Ezzel a módszerrel több probléma is fellép. Ha a legrövidebb út nem minimálisan sok élből áll (ld. a fenti példát), akkor ilyen módon nem fogjuk megtalálni. Ha több, ugyanannyi élből álló út megy két csúcs között, akkor sem világos, hogy hogyan válasszuk ki a legjobbat (ha pl. v -ből v 1 -be szeretnénk menni.) Megpróbálhatjuk a feladatot visszavezetni a súlyozatlan gráfok esetére is, ahol már biztonságosan működik a szélességi keresés. Cseréljünk ki minden élt egy az élsúlyának megfelelő számú (súlyozatlan) élből álló útra. Ezt a változtatást mutatja be egy egyszerűbb gráfon a következő ábrapár. Az így módosított gráfon már tudjuk futtatni a jól bevált szélességi keresést. Világos, hogy a módosított gráfban kapott legrövidebb (legkevesebb élből) álló út megfelel az eredeti gráf egy minimális összhosszúságú útjának.. Dijkstra algoritmusa Az általános esetben a következő feladatot szeretnénk megoldani..1. feladat. Adott egy G = (V, E) gráf és az élein egy l : E R + hosszúságfüggvény. Adott s, t V csúcsokra keressük a minimális összhosszúságú st utat.

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1. Megpróbáljuk az előző ötletünket használni, minden e élt cseréljünk ki egy l(e) darab élből álló útra. A felosztott gráfon (jelölje G ) futtassunk szélességi keresést. Módszerünknek vannak korlátai. Bajban vagyunk például, ha az l(e) értékek nem egészek. Amennyiben az értékek még racionálisak, felszorozva a nevezők legkisebb közös többszörösével, ez a gond még orvosolható. (Az irracionális számok esete azért így is megmarad, bár ez a gyakorlati alkalmazásokban nem jelent problémát, mivel a életből vett hosszúságadatok sosem lesznek irracionális számok.) Nehezebben feloldható problémát jelent, ha az l(e) értékek között vannak nagy számok (például a közös nevezővel való felszorzás könnyen eredményezhet ilyet). Ilyen módon a gráf élszáma, ezzel pedig algoritmusunk lépésszáma megsokszorozódik; így a feladat gyakorlati szempontból könnyen kezelhetetlenné válhat. Erről részletesebben a. megjegyzésben írunk majd. Dijkstra algoritmusa (196) elegánsan kerüli ki ezt a problémát. Az algoritmus úgy is felfogható, hogy a G -n futtatott szélességi keresést modellezzük, anélkül hogy az élek felosztásakor keletkező extra csúcsokkal egyenként foglalkoznánk. A Dijkstra-algoritmusban abban a sorrendben fogjuk átvizsgálni a G gráf csúcsait, ahogyan a G -n futtatott szélességi keresésben sorra kerülnének a nekik megfelelő csúcsok. Ha nem akarunk a felosztott G gráfra gondolni, akkor tekinthetjük úgy is, hogy az eredeti G-n folytatunk egy a kövektező elvek mentén módosított szélességi keresést: Az átvizsgálásra soron következő csúcs kiválasztásánál körültekintőbben járunk el. Egy elért (de még nem átvizsgált) csúcsnál fenntartjuk annak a lehetőségét, hogy később rövidebb odavezető utat találjunk. Edsger W. Dijkstra (190-00).1. megjegyzés. Edsger W. Dijkstra holland tudós volt, a holland nevek kiejtése pedig nem magától értetődő. Akit érdekel az eredeti kiejtés, itt meghallgathatja: https://en.wikipedia. org/wiki/file:dijkstra.ogg..1. A Dijkstra-algoritmus részletes ismertetése Tárolandó adatok: Az algoritmus futás egy köztes pillanatát a csúcsok állapotai és a csúcsokhoz tartozó bizonyos paraméterek értékei határozzák meg (a futás során mind a csúcs-állapotok, mind a paraméterek dinamikusan változnak). A csúcsok az alábbi állapotokban lehetnek: x L: Lezárt y N: Nem lezárt (elért) z N: Nem lezárt (nem elért) A nem lezárt csúcsok között vannak már elértek és még nem elértek, de az ezek közötti különbségtétel az algoritmus megértésében segít, a helyes futtatáshoz valójában nem szükséges. Elég csak azt tárolni, hogy a csúcsok L vagy N állapotban vannak. Egy már elért v csúcs mellett mindig tárolunk egy hozzá tartozó d(v) értéket is, melynek jelentése az eddig megtalált legrövidebb sv út hossza.

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1. Praktikus a már elért csúcsok mellett az ún. szülőjük azonosítóját is tárolni. Kezdeti állapot: Kezdetben minden csúcs N állapotban van, d(s) = 0, a többi csúcsnak pedig még nincs d(v) értéke (tekinthető úgy, hogy d(v) = ). Az algoritmus egy lépése: Az N állapotúak közül kiválasztjuk azt az u csúcsot, amire d(u) minimális (ha több ilyen is van, akkor tetszőlegesen választunk ezek közül egyet). Minden uv élre megvizsgáljuk a d(v) értékeket. Ha még nincs d(v) érték vagy d(u) + l(u, v) < d(v), akkor d(v) új értéke d(u) + l(u, v) lesz, továbbá v szülője u lesz. Ezután az uv élt töröljük a gráfból. Ha már nincs uv él, akkor u állapotát L-re változtatjuk és a következő lépésre ugrunk. Az algoritmust addig folytatjuk, amíg t csúcs L állapotú nem lesz. Nem összefüggő gráf esetén az is előfordulhat, hogy az N állapotú csúcsok egyikének sincs ( -től különböző) d(v) értéke, ilyenkor is megállunk. d(t) leálláskori értéke adja meg a legrövidebb st út hosszát... megjegyzés. Ha a Dijkstra algoritmust addig futtatjuk, amíg az összes elérhető csúcs L állapotú lesz, akkor valójában nem csak t-re, hanem az összes s-ből elérhető v csúcsra meghatározza a legrövidebb sv út hosszát... Az algoritmus futása egy konkrét gráfon 1. fázis v v v 6 t v 6 v v csúcs d(v) szülő lezárva? s 0 - L v 1 6 s N v s N s 6 v 1. fázis v v v 6 t v 6 v v csúcs d(v) szülő lezárva? s 0 - L v s L v 1 6 s N v 9 v N s 6 v 1

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1.. fázis v v v v 6 6 t v v csúcs d(v) szülő lezárva? s 0 - L v 1 6 s L v s L v 11 v 1 N v 9 v N v 6 1 v 1 N s 6 v 1. fázis Most jön az érdekes lépés! v v v v 6 6 t v s 6 v 1 v csúcs d(v) szülő lezárva? s 0 - L v 1 6 s L v s L v 9 v L v 11 * v 1 N v 1 v N v 6 11 v N *Holtverseny esetén választhatunk pl. lexikografikus sorrend szerint. Újabb fázisok Az -8. fázisok részletes rekonstruálását az olvasóra bízzuk. Az. fázisban a v ; a 6. fázisban a v 6 ; a. fázisban a v csúcs, míg végül a 8. fázisban a v csúcs is átvizsgálásra, majd lezárásra kerül. Érdemes még megjegyezni, hogy így a v -et előbb v -ből érjük majd el (1 távolság), és ez a következő fázisban kerül majd csak átírásra. Végállapot Végül a 8. fázisban megállapítjuk, hogy t minden éle át lett már vizsgálva korábban, t-t így lezárhatjuk, és leolvashatjuk a végeredményt. 6

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1. v v v 6 t v 6 v s 6 v 1 v v d(v) szülő lezárva? s 0 - L v 1 6 s L v 11 v 1 L v 1 v L v s L v 9 v L v 6 11 v L v 1 v 6 L t 16 v L.. megjegyzés. A Dijkstra-algoritmus egy látványos szimulációja érhető el az alábbi címen: https://www.cs.usfca.edu/~galles/visualization/dijkstra.html.. megjegyzés. Vegyük észre, hogy amennyiben nem állunk meg t átvizsgálásakor, hanem addig futtatjuk az algoritmust, amíg az összes csúcs lezárt nem lesz, akkor t semmilyen kitüntetett szerepet nem játszik... Az algoritmus helyességének igazolása Az algoritmust részletesen bemutattuk. Következő feladatunk, hogy igazoljuk, hogy valóban a legrövidebb st út hosszát adja tetszőleges G = (V, E) gráf és l : V R + hosszfüggvény esetén. Ezt érdemes önálló feladatként is feladni diákjainknak:.. feladat. Igazoljuk, hogy a Dijkstra-algoritmus megadja a legrövidebb st út hosszát; tetszőleges G = (V, E) gráf és l : V R + hosszfüggvény esetén. Az algoritmus helyessége a következő, teljes indukcióval igazolható állításon múlik:.. állítás. (Az algoritmus futásának tetszőleges köztes állapotában igaz, hogy:) Minden L állapotú u csúcsra d(u) a legrövidebb su út hossza. Az N állapotú v csúcsokra d(v) értéke (ha létezik) a legrövidebb olyan út hossza, ami csupa L állapotú csúcsokon át halad s-ből v-be. Bizonyítás. Az lezárt csúcsok száma szerinti teljes indukcióval bizonyítunk. Kezdetben (amikor csak s lezárt) az állítás triviális.tegyük fel, hogy n 1 lezárt csúcs esetén még igaz volt; belátjuk, hogy ez az n. csúcs lezárásával is megmarad. Az n. lezárt csúcs egy olyan v lesz, amelyhez van egy olyan uv él, ahol u L és v N, továbbá d(v) = d(u) + l(u, v) minimális az ilyen csúcspárok között. Ekkor a v-be menő legrövidebb sv út d(v) hosszú kell legyen; hiszen ha lenne egy rövidebb P sv-út, ennek az első N állapotú csúcsára d(w) < d(v) kellene, hogy teljesüljön, ellentmondva a v választásának. v átvizsgálása után igaz marad az is, hogy minden w N csúcsra d(w) a legrövidebb csak L-beli csúcsokat használó út. Valóban: ha a legrövidebb ilyen sw út nem használja v-t, akkor már korábban megtaláltuk, ha pedig használja v-t, akkor most kellett megtalálnunk... A legrövidebb utak kiolvasása Bemelegítésként érdemes meggondolni a következő feladatot:

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1... feladat. Legyen P = (s, v 1,..., v k, t) egy minimális összhosszúságú st-út. Bizonyítsuk be, hogy ekkor minden 1 i k esetén P i = (s, v 1,..., v i ) is egy minimális összhosszúságú sv i -út. Megoldás. Indirekt bizonyítunk. Ha lenne v i -be egy rövidebb P i út, akkor P i -hez a (v i, v i+1,..., v k ) szakaszt csatolva egy P -nél rövidebb sétát kapnánk. Ha ez a séta esetleg nem út (lehet benne csúcsismétlés, ezáltal kör), akkor a köröket kivágva belőle egy még rövidebb utat kapunk. A következő feladat ad választ arra, hogy miért volt érdemes a szülőt is tárolni az elért csúcsok mellett... feladat. Adjuk meg egy legrövidebb st-út éleit a Dijkstra-algoritmus végallapotánál látható táblázat segítségével. Megoldás. A keresett utat t-ből visszafele haladva könnyű megtalálni: vegyük t szülőjét, majd annak a szülőjét, stb. Így véges sok lépésben eljutunk s-hez, mivel s kivételével minden lezárt csúcsnak van szülője, egy korábban lezárt csúcs személyében. Így előbb-utóbb a legelőször lezárt s-hez jutunk, ráadásul kör sem keletkezhetett. Legyenek az így kapott út csúcsai sorrendben s, u 1, u,..., u k, t. Könnyen látható i szerinti indukcióval, hogy az (s, u 1,..., u i ) egy legrövidebb su i -út. v v v 6 t v 6 v s 6 v 1 v v d(v) szülő lezárva? s 0 - L v 1 6 s L v 11 v 1 L v 1 v L v s L v 9 v L v 6 11 v L v 1 v 6 L t 16 v L Valójában nem csak s-ből t-be találjuk meg a legrövidebb utakat így, hanem s-ből az összes többi csúcsba is... feladat. Legyen G = (V, E) összefüggő gráf, élein l : E R + egy hosszfüggvény és s V egy kijelölt csúcs. Futtassuk le a Dijkstra-algoritmust s kezdőpontból, amíg az összes csúcs lezárt állapotú lesz. Minden v csúcsra húzzuk be pirossal az uv irányított élt, ahol u a v csúcs Dijkstra-algoritmus eredményeként kapott szülője. Bizonyítsuk be a következőket: (a) A piros élek egy s-gyökerű ki-fenyőt alkotnak. s-ből bármelyik másik csúcsba egyértelműen lehet eljutni az (irányított) piros éleken. (b) Minden v V -re a piros élek által megadott sv út egy legrövidebb G-beli sv út. Megoldás. (a) Minden s-től különböző csúcsba pontosan 1 piros él fut be (s-be pedig egy sem). Így a piros élek száma pontosan n 1 (ahol n = V ). Lássuk be, hogy a piros élek nem alkotnak kört (irányítatlan értelemben sem). Egyfelé irányított kör nem lehet, hiszen egy piros él fejénél nagyobb d(v) érték van, mint a tövénél (másképp: a töve hamarabb lett lezárva a Dijkstra-algoritmusban, mint a feje). Ha pedig egy piros körön lenne két ellentétes körüljárási irányba mutató él, akkor lenne olyan csúcs, amibe két piros él fut be. 8

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1. Körmentes, n-1 élű gráf irányított értelemben fa. Minden irányítás rajta s-től távolodó irányba mutat. (b) Az algoritmus helyessége c. szakaszban igazából ezt is beláttuk (hiszen t semmilyen kitüntetett szerepet nem játszott... A Dijkstra-algoritmus fizikai modellje.6. feladat. Egy asztalon gyöngyök fekszenek, ezeket változatos hosszúságú madzagokkal kötjük össze. Így egy gráfszerű hálózatot kapunk. Fogjuk meg az egyik gyöngyöt és függőlegesen emeljük fel az asztalról. Milyen sorrendben fog a többi gyöngy elemelkedni az asztalról? Válasz. A gyöngyök abban a sorrendben emelkednek el, mint amilyen sorrendben a megfelelő gráfban a Dijkstra-algoritmus átvizsgálja a csúcsokat.. Irányított gráfok. Gráfok és feladatok megadási módjai.1. feladat. A következő táblázat a Bergengócia városai között közlekedő repülőgépjáratok jegyárait tartalmazza. Legkevesebb hány tallérból lehet eljutni Elemérhalomból Cecíliavásárhelyre? A B C D E F G H I Artúrbánya - - 8-0 - - Bélavár 1-8 19 1-0 6 Cecíliavásárhely 66 - - - 8-1 Dénesville - 8 - - 1 89 61 Elemérhalom 1-9 6 - - 8 Ferencváros - 9 9 - - - 6 Gizellarév - 6 1 9-1 - 19 Hugófalva 1 1 - - 61-69 Ilonahegy - 1 6-8 6 - - A feladatban a költségek nem szimmetrikusak, azaz X-ből Y -ba tipikusan nem ugyanannyiba kerül eljutni, mint Y -ból X-be. Tehát a feladatot egy irányított gráffal tudjuk modellezni. Fontos a diákokkal megbeszélni, hogy a Dijkstra-algoritmus érdemi változtatás nélkül működik irányított gráfokra. Az algoritmus lépései és a helyességre adott bizonyítás is szóról-szóra megismételhető. Ez tehát semmiféle problémát nem jelent. Másrészt, az előző feladat példát mutat a gráfok tárolásánake egyik tipikus módjára, az ún. adjacencia-mátrix ra is. Ennek előnye a jó áttekinthetőség: egy adott csúcs szomszédai könnyen kiolvashatók. Az adjacencia-mátrixnál szokványosabb mód egy gráf megadására az éllistás felsorolás. Erre is mutatunk egy példát: 9

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1. 0 1 1 1 1 0 1 8 8 0 1 8.1. megjegyzés. Amennyiben gráfunk ritka, azaz csúcsszámához képest kevés éle van, akkor az éllistával jóval kisebb tárhely elég. n csúcsú és m élű gráf esetén az adjacencia-mátrixban durván n adatot kell eltárolnunk. Éllistával csak m adatsorunk van, ez nagy n esetén nagyságrendekkel lehet kisebb n -nél. Az útkereső algoritmusok gyakorlati alkalmazásai során adódó hálózatok legtöbbször ritka gráfok. Az Euler-féle poliédertétel egyszerű következménye, hogy ha egy egyszerű (irányítatlan) síkgráf minden tartománya legalább csúcsú, akkor az élek száma legfeljebb n. Egy földi térkép úthálózata tehát tipikusan ritka gráfot határoz meg. A Nemes Tihamér versenyen is rendszerint éllistával történik a gráfok megadása:.. feladat (010.,. kat.,. forduló,. feladat). Futár. Egy országban N város van. Az egyik városban futárok várakoznak. Ismerjük azt is, hogy az egyes városokból mennyi idő alatt lehet elérni valamilyen járművel adott másik városokat. Készíts programot (futar.pas,... ), amely megadja, hogy minimum mennyi idő alatt jutnak el a futárok az összes városba! A futar.be szöveges állomány első sorában a városok száma (1 N 100), a járművek száma (1 M 000) és a futárok kezdő helye (1 H N) van, egy szóközzel elválasztva. A következő M sorban egy-egy járművet leíró szám szerepel, egy-egy szóközzel elválasztva: az indulás helye (1 A i N), az érkezés helye (1 B i N), valamint az út megtételéhez szükséges idő (1 T i 1000). A futar.ki szöveges állományba egyetlen sort kell írni, a minimális időt, ami alatt a futárok az összes városba elérhetnek! Példa: futar.be futar.ki 6 1 1 1 6 0 6 Magyarázat: 1 6: 1 időegység 1 10 6 10 1 : 10 időegység 1 : 1 időegység 10 10 1 10 0 1 1 1 : időegység 1 10 1 : időegység 0 6 10 10 10 10 1 6 6 1 0 6 10 8

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1. Elképzelhető, hogy az élhosszúságokon kívül egyéb tényezőket is figyelembe kell vennünk. A következő feladat például olyan esetre mutat példát, ahol bizonyos élek igénybevétele csak akkor engedélyezett, ha elég hamar megérkezünk a kezdőpontjukba. Szerencsére ezt a nehezítést Dijkstra-algoritmus még könnyen kezelni tudja... feladat. Szeretnénk repülővel eljutni Budapestről Vlagyivosztokba, ez persze csak átszállásokkal megoldható. Holnap 8:00-kor indulunk Budapestről, a lehető legkorábban szeretnénk Vlagyivosztokban leszállni. Tegyük fel, hogy rendelkezésre áll az összes számításba vehető légitársaság menetrendje (indulási és érkezési időpontokkal). Ahhoz, hogy egy repülőjáratot használhassunk, legalább fél órával az indulás előtt meg kell érkeznünk a megfelelő repülőtérre. Adjunk algoritmust, amely meghatározza a legkorábbi lehetséges odaérkezés időpontját... megjegyzés. Ha a diákok előképzettsége megengedi, érdemes egy-egy hasonló feladatot ténylegesen le is programoztatni a diákokkal.. A Dijkstra-algoritmus lépésszáma Lépésszámról nagyon nehéz beszélni megfelelő előképzettség nélkül. (Például: Egyáltalán mit is jelent egy lépés?) Azért a Dijkstra hatékony implementálásához kapcsolódó fő trükkök előhozhatók anélkül is, hogy a szokásos számításelméleti terminológiát ismernénk, használnánk..1. feladat. A megbízód ad majd egy 1000 csúcsú és 000 élű gráfot (éllistával), ahol minden él hossza egy-egy pozitív racionális szám. Megkapod még az s és t csúcsok sorszámait. Feladatod, hogy megmondd a legrövidebb st-út hosszát. Van egy számolósegéded, aki a következő műveleteket tudja elvégezni: össze tud adni két racionális számot, illetve két racionális számról el tudja dönteni, hogy melyik a nagyobb. Egy műveletért 1 dollárt kell fizetned a segédünknek. Összeadást és összhasonlítást magad nem végezhetsz, csak a segédeddel csináltathatod. Ingyen másolhatsz át egyszer már leírt számokat. a) Elvállalnád-e a munkát, ha millió dollárt ajánlanak érte? b) És 100 ezer dollárért? Megoldásvázlat. Az a) rész limitje alatt maradunk, ha naiv módon számoljuk össze a futás során szükséges lépéseket. Minden fázis (n db) azzal kezdődik, hogy kiválasztjuk a minimumot a már elért, de még nem lezárt csúcsok közül (n-nél kevesebb ilyen van). Ez eddig legfeljebb n összehasonlítás. Másrészt minden él vizsgálata kapcsán végzünk egy összeadást és egy összehasonlítást. Végeredményben tehát az dollárban mért költségünk felülről becsülhető így: n + m A b) rész limitjének teljesítéséhez ügyesebbnek kell lennünk. Az n -en kellene spórolnunk valamennyit. Ezt elérhetjük, ha nem végzünk minden fázis elején egy új minimumkeresést. Ehelyett, az elért csúcsokat d(v) szerint növevő sorrendben tároljuk. Ha egy új d(v) érték jelenik meg, vagy egy korábbi d(v) csökken, akkor meg tudjuk találni az a helyét a sorban log (n) összehasonlítással (ún. bináris keresséssel: először a középsővel hasonlítjük össze stb.). Modellünk sajnos túlzottan is nagyvonalú. A valóságban természetesen nem lehet ingyen adatokat másolni, az is időt (lépésszámot vesz igénybe). Márpedig, ha az előbb vázolt módon, egyszerű növekvően rendezett listában tároljuk a csúcsainkat, akkor egy-egy új elem beszúrása azt is maga után vonja, hogy a nála nagyobb elemeket eggyel hátrébb kell másolni a listában. 11

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1. Ez pedig már nem megy log (n) lépésben (helyette átlagosan n/ darab másolás kell, amivel a naiv számolással is megkapott n -es nagyságrend fog adódni a lépésszámra). Szerencsére azonban ezt a problémát is meg lehet oldani, ha az adatainkat nem egyszerű rendezett listában, hanem egy trükkösebb adatstruktúrában, ún. bináris fában tároljuk..1. Bináris fák Vázlatosan ismertetjük a bináris fák működését. A tárgyalás során a struktúrában rejlő, matematikus számára is érdekes ötletre fókuszálunk; a gyakorlati megvalósítás, egyébként távolról sem érdektelen kérdéseit meghagyjuk az informatikusoknak. A bináris fa csúcsaiban helyezkednek el a rendezendő elemeink. Minden csúcsnak legfeljebb gyereke van. Egy szülő sosem nagyobb semelyik gyermekénél. A gyökérben így mindig egy minimális elem szerepel. Végig megtartjuk a fa kiegyensúlyozott tulajdonságát is, azaz csak akkor kezdünk újabb szintet, ha az előző szint már megtelt. Így (legfeljebb) n adat esetén a szintek száma (legfeljebb) log n; egészen pontosan ennek egészrésze, ha a gyökeret 0. szintűnek tekintjük. 9 10 8 1 6 10 1 10 Változtassuk meg a modellünket: mostantól nemcsak az összehasonlítás és összeadás kerül pénzbe, hanem egy adat átmásolásáért is 1 dollárt kell fizetnünk (ezekre van szükségünk a Dijkstra-algoritmus futtatása során). A bináris fa előnye, hogy a következő műveletek mindegyike elvégezhető c log (n) dollárért (ahol c alkalmas, n-től független, előre rögzített konstans) a módosított modellben is: Újabb elem beszúrása. Egy elem értékének csökkentése. A minimális elem törlése. A Dijkstra-algoritmus futtatása során éppen ezekre lesz szükségünk. Egy elem beszúrásának folyamatát ábrákkal is szemléltetjük. 9 10 8 1 6 10 1 10 6 9 6 8 1 6 10 1 10 10 1

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1. Az új elemet elsőre a fa legalsó szintjének első szabad helyére szúrjuk be. Összehasonlítjuk a szülőjével. Ha kisebb nála, akkor kicseréljük vele. Ezután az új helyen is összehasonlítjuk a szülővel, és szükség esetén kicseréljük vele. 6 9 8 1 6 10 1 10 10 6 9 8 1 6 10 1 10 10 Mindezt addig ismételgetjük, amíg olyan helyre nem kerül, ahol már nem kisebb a szülőjénél (legkésőbb a gyökérbe érve ilyen lesz). Könnyű látni, hogy ekkor újra egy helyesen kitöltött bináris fánk lett. Szintenként legfeljebb egyszer kellett összehasonlítanunk és két adatot kicserélnünk (egy csere másolással könnyen megvalósítható), így a log n korlát kényelmesen tartható. Ha egy már a fában levő elem értéke csökken, akkor lényegében ugyanezt kell csinálnunk, csak nem kell új elemet beszúrunk. A minimum törlésénél egy kicsit figyelmesebbnek kell lennünk. Megtehetnénk, hogy egyszerűen kitöröljük a gyökérből az ottani elemet, a helyére a kisebbik gyermeket írjuk, aztán annak a helyére az ő kisebbik gyermekét, stb. Így azonban a fa szépen kiegyensúlyozott struktúrája elromolhat, az alsóbb szinteken lukak keletkeznének (és így pl. a következő elem beszúrásánál külön kellene keresgélni, hogy hol az első szabad hely). Ezért ehelyett a következőt tesszük: a legalsó szint utolsó elemét áttesszük a gyökér helyére, és ezt lebillegtetjük: összehasonlítjuk a kisebbik gyerekével, és ha nagyobb nála, kicseréljük vele; ezt addig ismételgetjük, amíg nem lesz kisebb mindegyik gyerekénél..1. megjegyzés. A Dijkstra-algoritmus gyakorlati megvalósítása esetén persze a fában valójában nem a d(v) értékeket, hanem az egyes csúcsok azonosítóját tároljuk, illetve egy ún. pointer t, ami azon memóriacellákra mutat, ahol az adott csúcs d(v) értéke és egyéb adatai megtalálhatók. Ezáltal a lépésszámolás is némileg bonyolultabb a mi dollárszámításunknál, de továbbra is a c log n korláton belül marad, alkalmas c konstanssal... Elméleti eredmények összefoglalása Hogy némi háttérismeretet adjunk, összefoglalunk néhány elméleti eredményt is. Ehhez bevezetjük (felidézzük) a O( ) (ejtsd: nagy ordó ) jelölést pontosabban annak egy egyszerűbb, gráfalgoritmusokra használatos verzióját... definíció. Legyen f : N N N függvény. Azt mondjuk, hogy egy gráfalgoritmus lépésszáma O(f(n, m)), ha van olyan c pozitív egész szám, hogy bármilyen n csúcsú és m élű gráfra legfeljebb c f(n) lépésben lefut az algoritmus. Az O( ) jelölés a lépésszám aszimptotikus viselkedésre koncentrál, biztonságos használata némi jártasságot feltételez a határérték-számítás terén. Ezért próbáltunk eddig ennek kikerülésével dolgozni. Az új jelöléssel eredményeink így fogalmazhatók: Naivan lépésszámolással O(n ) adódik. 1

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1. Bináris fát használva, akkor O(n + m log n) elérhető. A lépésszámbecslés valójában még tovább javítható. Egy bonyolultabb adatstuktúra, az ún. Fibonacci-kupac alkalmazásával O(n log n + m) is elérhető. Bizonyos speciális gráfosztályok esetén, az algoritmus esetleges apró változtatásaival O(m) is elérhető... Néhány szó a polinomiális algoritmusokról Az eddigi becsléseinkben nem figyeltünk arra, hogy az egyes élekre írt számok mekkorák. Valójában a feladat méretét ez is befolyásolja. Nagy egyszerűsítést hajtottunk végre akkor is, amikor tetszőlegesen nagy számok másolását, összeadását és összehasonlítását engedtük egyetlen lépésben. Valószerűbb a b bites számokon végzett alapműveleteket b lépésnek tekinteni (így például az x + y összeadás nagyjából log x + log y lépést igényel). Így számolva a lépéseket, a következő általánosabb definíciót használhatjuk... definíció. f : N N függvény. Azt mondjuk, hogy egy algoritmus lépésszáma O(f(n)), ha van olyan c pozitív egész szám, amelyre bármilyen n pozitív egész esetén egy n bites inputra legfeljebb c f(n) lépésben lefut az algoritmus. Egy súlyozott gráf esetén az input mérete lényegében az l(e) értékek bitszámának összege (minden e élre). A Dijkstra-algoritmusra ebben az értelemben is áll az O(n ) becslés. Mivel itt f egy polinomfüggvény, a Dijkstra-algoritmus egy ún. polinomiális algoritmus. Elméleti matematikai szempontból a polinomiális algoritmusokra szokás hatékony algoritmusként gondolni. Egy-egy algoritmikus probléma fontos jellemzője, hogy ismert-e a megoldására polinomiális algoritmus. (A valóságban sajnos egy algoritmus polinomális volta nem mindig esik egybe a gyakorlati felhasználhatóságával.).. megjegyzés. Érdemes egy pillanatra visszatérni arra a korábbi algoritmus-ötletünkre, amikor a súlyozott gráf minden élét l(e) hosszú úttal helyettesítettük. Ha egy l(e) értéket b biten tároltunk, akkor az e élből b számú új él is keletkezhet. Így az ezen alkalmazott szélességi keresés már exponenciális futásidejű lehet. Tehát valóban szükség van Dijkstra módszerére a polinomiális futásidő eléréséhez.. A Dijkstra-algoritmus változatai.1. Dijkstra kapacitás jellegű élsúlyokra Eddig az l : E R + élsúlyokra mindig úgy tekintettünk, mint valamiféle költség (úthossz, idő, pénz) jellegű mennyiségre: minél kisebb, annál jobb. Egy élsúlyozás azonban kifejezhet kapacitás jellegű feltételt is. Ilyenkor persze tipikusan nem az a feladat, hogy egy úton az ilyen kapacitásokat összeadjuk, hanem hogy a legszűkebb útszakaszt is minél szélesebbre vegyük..1. feladat. Adott egy úthálózat térképe (egyszerű gráffal modellezve). Mindegyik útszakaszról (élről) tudjuk, hogy legfeljebb milyen széles teherautók közlekedhetnek rajta. Adjunk algoritmust, amely meghatározza, hogy legfeljebb milyen széles teherautóval lehet eljutni A-ból B-be. Bizonyítás. Megoldásvázlat Jelölje G = (V, E) a gráfot és w : E R + az egyes útszakaszok szélességét. Egy út szélessége jelentse a legkeskenyebb élének szélességét, keressük a legszélesebb st utat. Futassuk a Dijskstra algoritmust a következő módosításokkal: 1

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1. d(v) jelentse az (eddig megtalált) legszélesebb sv út szélességét. A d(v) értékek update-elésére a korábbi szabály lépés helyett ezt vezetjük be: d(u) + l(u, v) < d(v) esetén d(u) + l(u, v) d(v) min{d(u), w(u, v)} > d(v) esetén min{d(u), w(u, v)} d(v) Az átvizsgálásra kerülő csúcs mindig a legnagyobb d(v) értékű, nem lezárt csúcs. Az eredetihez hasonló módon belátható a módosított algoritmus helyessége is. Erre az észrevételre is épült már informatikai versenyfeladat:.. feladat (011.,. kat.,. forduló 1. feladat). Egy ország N városa között különböző teherbírású utak vannak. Két város között árut szeretnénk szállítani a lehető legnagyobb kapacitású teherautóval olyan útvonalon, ahol az autó tehersúlya nem nagyobb, mint az egyes utak teherbírása. Készíts programot (szallitas.pas, szallitas.c,... ), amely adott A és B városra megadja, hogy maximum mekkora tehersúlyú teherautó közlekedhet közöttük és merre kell menni! A szallitas.be állomány első sorában a városok száma (1 N 100), a köztük levő utak száma (1 M 10000), a kezdő és a cél város sorszáma (1 A B N) van, egyegy szóközzel elválasztva. A következő M sor mindegyikében egy-egy út leírása található: azon két város sorszáma (1 sorszám N), amelyek között a kétirányú út vezet, valamint az út teherbírása (1 tehebírás 1000). Az szallitas.ki szöveges állományba sort kell írni. Az elsőbe a maximális tehersúly kerüljön, a másodikba pedig az oda vezető úton levő városok sorszáma, egy-egy szóközzel elválasztva, az útvonal sorrendjében (azaz az első sorszám biztosan A, az utolsó sorszám biztosan B legyen)! Több megoldás esetén bármelyik megadható. Példa: 1 100 szallitas.be 6 00 1 100 1 100 1 00 00 900 00 szallitas.ki.. Ha több legrövidebb út van Korábban láttunk módot egy legrövidebb út kiolvasására. egyetlen legrövidebb út van. 100 00 900 00 00 Nem biztos azonban, hogy csak.. feladat. Mi a helyzet, ha minden útszakasznak van hossza és útdíja is? Minimális útdíjköltséggel, ezen belül pedig a lehető legrövidebb úton szeretnénk eljutni S-ből T -be. Hogyan lehet megtalálni az optimális utat? 1

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1. Kétféle megoldás is van, külön-külön mindegyik igen tanulságos. I. megoldás. Jelölje l(e) az e él hosszát, míg c(e) az útdíj-költséget. Minden e élhez rendeljük hozzá az (c(e), l(e)) számpárt. Két ilyen számpárt össze tudunk adni: (c 1, l 1 ) + (c 1, l )) = (c 1 + c, l 1 + l ). Össze is tudjuk hasonlítani ezeket: (c 1, l 1 ) < (c, l )), ha c 1 < c vagy c 1 = c és l 1 < l. Tegyük az élsúlyok helyébe ezeket a számpárokat. Összeadni és összehasonlítani tudjuk őket, tehát a Dijkstra algoritmust is tudjuk futtatni. Ennek eredményeképp egy olyan utat kapunk, amelyen a (c, l) számpárösszeg minimális, azaz a c-összeg optimális, ezek között az l-összeg is minimális..1. megjegyzés. A f(v) = (c(e), l(e)) számpárok aritmetikájára úgy is gondolhatunk, mint ha c(e) M + l számokkal dolgoznánk, ahol M egy rögzített, nagyon nagy szám. A II. megoldás a pontos élek fogalmára épít. Ezt a következő feladat kapcsán tudjuk megismerni... feladat. Súlyozatlan gráfok esetében ismert, hogy egy st út pontosan akkor legrövidebb az st-utak között, ha minden éle 1-et lép lefele a szélességi fában. Tudsz-e hasonló jellemzést adni súlyozott élek esetén? A megoldás a következő definíció... definíció. Legyen G = (V, E, l) egy irányított gráf nemnegatív élhosszfüggvényekkel ellátva (az irányítatlan eset tekinthető oda-vissza irányított gráfnak). Legyen s V rögzített és jelölje d(v) az s-ből v-be menő legrövidebb út hosszát (minden v V csúcsra). Ekkor egy uw él pontos, ha d(w) d(u) = l(uw). Nem nehéz belátni a következő állítást:.. állítás. Egy st út pontosan akkor minimális összhosszúságú, ha minden éle pontos. II. megoldás a. feldatra. Futtassuk le a Dijkstra-algoritmust c útdíjak szerint. Ezután futtassuk l szerint a Dijkstra-algoritmust, de ne az egész gráfon, hanem csak a c költség szerint pontos élek halmazán. A.1 és. feladatok kombinációja a következő feladat:.. feladat. Egy úthálózat minden szakaszának tudjuk a hosszát és az adott szakaszon megengedett maximális tömeget is. A lehető legrövidebb útón, ezen belül a lehető legnehezebb szállítmányt szeretnénk eljuttatni s-ből t-be. Hogyan lehet megtalálni az optimális utat?.. Leghosszabb utak Természetes módon merülhet fel egy diákban, hogy ha a legrövidebb utakat ilyen hatékonyan meg tudjuk keresni egy s és t pont között, akkor mi a helyzet a leghosszabb/legdrágább utakkal. Ismert-e erre is hatékony (polinomiális) algoritmus? Erre negatív válasz adható, már a súlyozatlan gráfok esetén is. Ha ugyanis lenne hatékony algoritmus erre, akkor lenne hatékony algoritmus az algoritmuselmélet egyik leghíresebb megoldatlan problémájára, a Hamilton-kör létezésének eldöntésére. Feladatat formájában is érdemes feladni a következőt: 16

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1..6. feladat. Tegyük fel, hogy a LongRoad01 nevű algoritmus tetszőleges gráfban tetszőleges s, t csúcspárra megmondja, hogy hány élből áll a leghosszabb út s és t között. Csináljunk olyan algoritmust, ami egy m élű gráfra el tudja dönteni, hogy van-e benne Hamilton-kör, a LongRoad01 legfeljebb m-szeri meghívásával. Bizonyítás. Legyen uv az n csúcsú és m élű G gráfunk egy tetszőleges éle. Hagyjuk ki ideiglenesen az uv élt a gráfból és alkalmazzuk a LongRoad algoritmust u, v csúcspárra a maradék gráfban. Pontosan akkor talál n 1 élű utat az algoritmus, ha G-ben van olyan Hamilton-kör, ami uv élt tartalmazza (egyébként csak rövidebbet). Ezt G összes élére megismételve kiderül, hogy van-e Hamilton-kör a gráfban... megjegyzés. Számítástudományi nyelven éppen azt jelenti feladatunk állítása, hogy a leghosszabb út megkeresése NP-nehéz probléma. Azaz, ha lenne polinomiális algoritmus erre a feladatra, akkor egy rakat mindmáig megoldatlan (és sokak által megoldhatatlannak is tartott) algoritmuselméleti problémára lenne polinomiális algoritmusunk. Az NP-nehéz problémákról részletesebben pl. []-ben lehet olvasni. 6. Negatív költségű élek 6.1. feladat. Mutassunk példát arra, hogy ha negatív költségű éleket is megengedünk, akkor a Dijkstra algoritmus nem ad feltétlenül minimális összköltségű utat. 6.. feladat. Adott egy irányított gráf, és élein egy c : A R költségfüggvény, mely negatív értékeket is felvehet. Egy megfelelő konstanssal minden élen megnöveljük c-t úgy, hogy a kapott c nemnegatív legyen. Igaz-e, hogy ekkor c -re alkalmazva a Dijkstra-algoritmust az eredeti c költségfüggvény szerint is legrövidebb utat kapunk? (A költségfüggvény milyen módosítása nem változtat a legrövidebb utak halmazán?) Válasz. Könnyű ellenpéldát adni. A.6 feladathoz hasonlóan oldható meg a következő feladat: 6.. feladat. Tegyük fel, hogy a NegativeRoad01 nevű algoritmus tetszőleges gráfban, tetszőleges c : E R költsdégfüggvényre és s, t csúcspárra megmondja, hogy a minimális st út összköltségét. Csináljunk olyan algoritmust, ami egy m élű gráfra el tudja dönteni, hogy van-e benne Hamilton-kör, a NegativeRoad01 legfeljebb m-szeri meghívásával. A feladat azt mondja nekünk, a negatív költségfüggvényes változat általánosan NP-nehéz, mivel lehetne vele Hamilton-kört keresni. Ismert azonban egy viszonylag természetes megkötés, ami mellett már megoldható a negatív élköltségeket is megengedő eset (igaz, nem a Dijkstra-algoritmussal, hanem az ún. Bellman Ford algoritmussal): 6.1. definíció (Konzervatív súlyozás). Legyen G = (V, E) egy irányított gráf. Egy c : E R költségfüggvényt konzervatívnak nevezünk, ha nincsen olyan egyirányba irányított kör, amelyen 6.. megjegyzés. Természetes példa lehet konzervatív súlyozásra egy energiát visszatáplálni képes villamoshálózat. 1

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1. A konzervatív élsúlyozásokkal kapcsolatos tételekről, fogalmakról és algoritmusokról (Gallai tétele, tenziók, Bellman Ford algoritmus, Floyd Warshall algoritmus) [1]-ban részletesen lehet olvasni. A konzervatív súlyozások vizsgálata során felmerülő kérdések közül egyet jól mutat be a következő feladat: 6.. feladat. Egy svájci vasúttársaság módosítja a jegyárait. Magassági pótlékot ill. kedvezményt vezetnek be, tekintettel arra, hogy hegyre fel a villanyvonatoknak többletenergiára van szüksége, ugyanakkor lejtmenetben a modern villanyvonatok akár energiát visszatáplálni is képesek a rendszerbe. Ennek rendje a következő: ha a járat kiinduló városa h 1 méter tengerszint feletti magasságban van, míg a célállomás h méter magasságban, akkor a jegy árát h h 1 rappennel emelik ill. csökkentik, a különbség előjelének megfelelően (minden jegyár pozitív marad). Lehetséges-e, hogy a módosítás hatására A-ból B-be egy másik útvonalon lesz a legolcsóbb eljutni, mint korábban? Lehetséges-e, hogy a Dijkstra-algoritmus másik utat talál meg legrövidebbként? Megoldás. Minden st út összhossza ugyanannyival változik: h(t) h(s)-sel növekszik ill. csökken a különbség előjelétől függően. Így változatlan a legolcsóbb utak halmaza. A Dijkstra-algoritmus átvizsgálási sorrendje azonban megváltozhat. Így, ha többféle legrövidebb út is van, lehetséges, hogy másikat talál meg ezek közül. Egy példát ad erre a következő gráf: w (1000 m) s (0 m) t (0 m) 1 v (000 m) Az eredei gráfon a Dijkstra az svt utat választaná, de a magasságpótlék bevezetése után már az swt kerül kiválasztásra.. Gyakorlati alkalmazások az A*-algoritmus A legrövidebb utak megkeresése egy igazán gyakorlati probléma, gondolhatunk például a navigációs rendszerek útvonaltervezőire. Ezekben az alkalmazásokban tipikusan nem az általunk megismert Dijkstra-algoritmust, hanem annak valamilyen módosított változatát használják. A módosítások alapja általában a vizsgált hálózat sajátosságainak ügyes kihasználása. Nem javítják meg Dijkstra módszerét általánosan (nem is ismert olyan módszer, ami minden súlyozott gráfra hatékonyabban működne, mint a Dijkstra-algoritmus); de a konkrét térkép esetében mégis jobban működnek. Egy tipikus ötletek közül az egyik jól bemutatható az alábbi feladattal. A válasz még némi matematikai érdekességet is rejt magában. 100 rappen = 1 svájci frank 18

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1..1. feladat. Az alábbi térkép Franciország nagyvárosai közötti közúti összeköttetéseket mutatja, az egyes összeköttetések mellé írták az adott útszakasz hosszát, kilométerben. Tegyük fel, hogy Párizsból Marseille-be szeretnénk eljutni a legrövidebb úton. Hogyan futna ezen a feladaton a Dijkstra-algoritmus? Mennyiben más ez, mint ha józan ésszel, a térképet követve próbálnánk legrövidebb utat találni? A kép forrása: http: // www. bonjourlafrance. com/ france-map/ images/ france-driving-distances. jpg A Dijkstra-algoritmus a Párizsból kiinduló éleket minden irányban megvizsgálná. Így például a keresés során eljutna az északi Lille-be, vagy a keleti Strasbourgba is, pedig a térképre rátekintve látszik, hogy ezeket értelmetlen útba ejteni. Hogyan lehetne az algoritmusunkat ettől a felesleges munkától megkímélni? Erre kínál egy lehetőséget az A*-algoritmus. 19

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1..1. Az A*-algoritmus Tegyük fel, hogy van valamilyen előre ismert becslésünk minden v csúcs esetén a legrövidebb vt út összhosszára. Jelölje h : V R + azt a heurisztikus távolságfüggvényt, amelyre h(v) a (v, t) párra adott becslés értéke. Például h(v) lehet a v és t csúcsoknak megfelelő városok légvonalbeli távolsága. A szokásos módon, egy már elért csúcsra jelölje d(v) az eddig megtalált legrövidebb sv út hosszát. Tekintsük a következő összegeket minden csúcsra: f(v) = d(v) + h(v). Az A*-algoritmusban a Dijkstra-algoritmust módosítjuk a következőképpen: a soron következő csúcsot nem a d(v) hanem az f(v) értékek alapján határozzuk meg: a következő átvizsgálandó mindig egy minimális f(v) értékű (nem lezárt) csúcs. Leállíthatjuk az algoritmust, ha már minden olyan csúcs le van zárva, aminek aktuális f(v) értéke kisebb az aktuális d(t) értéknél; azokat a csúcsokat, amelyeket eddig nem zártunk le, később sem fogjuk átvizsgálni. Könnyű példát adni olyan gráfra és h függvényre, amikor ez a módosítás elrontja a Dijkstraalgoritmust, az új változat nem találja meg a legrövidebb sv utakat. A hiba egyik oka az, hogy egy v csúcs lezárásakor még nem biztos, hogy a legrövidebb sv utat ismerjük. A módosított átvizsgálási sorrend miatt elképzelhető, hogy egy későbbi u csúcsból találunk egy olyan uv élt, amelyre d(u) + l(u, v) < d(v) teljesül. Ilyenkor v csúcs d(v) értékét javítsuk ki, és tegyük vissza N állapotba! Sajnos még mindig nem garantálható, hogy az optimális sv utat fogjuk megtalálni. Azonban, ha h teljesít egy viszonylag természetes elvárást, akkor az A* biztosan a legjobb st utat fogja megtalálni... feladat. Bizonyítsd be, hogy ha a h : V R + optimista, azaz h(v) alulról becsüli a legrövidebb vt út hosszát minden v V esetén, akkor az A*-algoritmus egy optimális utat talál meg. Megoldás. Jelölje minden v csúcsra d (v) a legrövidebb (minimális l-összegű) sv út hosszát. Legyen sv 1 v... v k t egy legrövidebb st-út. A. feladat alapján ez minden v i -be is egy legrövidebb utat határoz meg. Azt állítjuk, hogy az út minden csúcsa lezárásra kerül, méghozzá az optimális d (v i ) értékkel. (Innen egyből következik a feladat állítása.) i szerinti indukcióval bizonyítunk. i = 0 (v 0 = s) eset triviáis. Tegyük fel, hogy v i 1 -re már beláttuk, következik v i. Tekintsük az algoritmus leállásának pillanatát (tehát amikor t csúcsot lezártuk). A feltevésünk szerint v i 1 lezárásra került d (v i 1 ) értékkel. v i 1 utolsó átvizsgálásakor a v i 1 v i élt is néztük, tehát v i -t is el kellett érjük d (v i ) hosszúságú (azaz optimális) úton. Ez azt is jelenti, hogy az algoritmus leállásának pillanatában teljesül: f(v i ) = d (v i ) + h(v i ) d (t). Itt az utolsó azért igaz, mert h(v i ) az optimista tulajdonság miatt alulról becsüli a v i v i+1... v k t út hosszát, ami éppen d (t) d (v i ). A kapott f(v i ) < d (t) azt jelenti, hogy az algoritmus leállásakor v i -nek is lezárva kell lennie a d (v i ) értékkel. Az esetleges visszanyitások miatt egy csúcs többször is átvizsgálásra kerülhet, így az A* akár lassabb is lehet, mint a jó öreg Dijkstra-algoritmus. Szerencsére egy másik h-ra vonatkozó elvárás ezt az eshetőséget is kizárja. 0

Hujter Bálint: Dijkstra algoritmusa SpecMat továbbképzés, 01. július 1... feladat. Bizonyítsd be, hogy ha a h : V R + monoton, azaz minden uv élre: h(u) l(u, v) + h(v), akkor az A*-algoritmus minden csúcsot legfeljebb egyszer vizsgál át. Megoldás. Azt kell meggondolni, hogy sosem kerül sor egy már lezárt csúcs visszanyitására. Indirekt tegyük fel, hogy v csúcsot vissza kell nyitnunk, méghozza egy u szomszédjának átvizsgálásakor. Erre azért kerülhet sor, mert az aktuális d értékekkel d(u) + l(u, v) < d(v). A monotonitás miatt h(u) l(u, v) h(v). Összeadva a két egyenlőtlenséget: f(u) = d(u) + l(u, v) + h(u) l(u, v) < d(v) + h(v) = f(v). Ez ellentmond annak, hogy v-t már az u mostani vizsgálata előtt átvizsgáltuk egyszer..1. megjegyzés. Amennyiben a gráf csúcsai városok, l(u, v) a közúti távolság és h(v) a légvonalbeli vt távolság, akkor h optimista és monoton is... megjegyzés. Valójában az A*-algoritmus név egyszerre több, csak apróságokban különböző algoritmust takar, mi ezek közül választottunk egyet. További rokonai a B* és D* keresési algoritmusok. Hivatkozások [1] Frank András, Király Tamás: Operációkutatás, Egyetemi jegyzet (01), letölthető: http://etananyag.ttk.elte.hu/files/downloads/_frank_kiraly_operaciokut.pdf [] Lovász László: Algoritmusok bonyolultsága, Egyetemi jegyzet (01), letölthető: http://etananyag.ttk.elte.hu/files/downloads/16_lovasz_algor_bonyol.pdf [] ELTE Egerváry Jenő Kutatócsoport: Operációkutatás példatár (01), letölthető: http://etananyag.ttk.elte.hu/files/downloads/_opkut_peldatar.pdf [] https://en.wikipedia.org/?title=dijkstra%s_algorithm [] https://en.wikipedia.org/wiki/a*_search_algorithm [6] Nemes Tihamér Országos Informatikai Tanulmányi Verseny archívuma (Programozás kategória) http://nemes.inf.elte.hu/nemes_archivum.html 1