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

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

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

22. GRÁFOK ÁBRÁZOLÁSA

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

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

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

GRÁFOK, GRÁF ALGORITMUSOK. Jegyzet

Gráfalgoritmusok Legrövidebb utak egy forrásból Dijkstra algoritmus Bellman-Ford algoritmus 31

Algoritmuselmélet. Gráfok megadása, szélességi bejárás, összefüggőség, párosítás. 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.

Algoritmusok bonyolultsága

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

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.

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

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

Diszkrét matematika 2.C szakirány

Gráfalgoritmusok 3 Néhány probléma modellezése gráfokkal 3 Alapfogalmak, jelölések 7 Gráfok ábrázolása 9 Bejárási stratégiák, szélességi bejárás 15

Dijkstra algoritmusa

Diszkrét matematika 2.C szakirány

A számítástudomány alapjai

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

Diszkrét matematika 2.C szakirány

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

1. tétel - Gráfok alapfogalmai

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

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

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

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

Diszkrét matematika 2.C szakirány

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

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

Diszkrét matematika 2.C szakirány

Adatszerkezetek 2. Dr. Iványi Péter

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

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

Specifikáció. B logikai formula, a bemeneti feltétel, K logikai formula, a kimeneti feltétel, A az algoritmus, amelyre az állítás vonatkozik.

A gráffogalom fejlődése

Adatszerkezetek II. 1. előadás

KOVÁCS BÉLA, MATEMATIKA I.

Algoritmusok és adatszerkezetek II. régebbi vizsgakérdések.

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

Diszkrét matematika 2.C szakirány

Formális nyelvek és automaták

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:

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

Érdemes egy n*n-es táblázatban (sorok-lányok, oszlopok-fiúk) ábrázolni a két színnel, mely éleket húztuk be (pirossal, kékkel)

Függvények növekedési korlátainak jellemzése

A továbbiakban Y = {0, 1}, azaz minden szóhoz egy bináris sorozatot rendelünk

Specifikáció. B logikai formula, a bemeneti feltétel, K logikai formula, a kimeneti feltétel, A az algoritmus, amelyre az állítás vonatkozik.

Gauss-Seidel iteráció

Nagyordó, Omega, Theta, Kisordó

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

Diszkrét matematika 2.

Mátrixok, mátrixműveletek

GRÁFOK ÉS ALGORITMUSOK ELMÉLETE VIZSGAKÉRDÉSEK Matematika BSc Elemző szakirány II. év 1. félév

Diszkrét matematika 2.

1. Alapfogalmak Algoritmus Számítási probléma Specifikáció Algoritmusok futási ideje

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

Alap fatranszformátorok II

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:

KOVÁCS BÉLA, MATEMATIKA I.

12. előadás. Egyenletrendszerek, mátrixok. Dr. Szörényi Miklós, Dr. Kallós Gábor

Nagy Gábor compalg.inf.elte.hu/ nagy

Algoritmusok és adatszerkezetek 2.

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

Algoritmuselmélet 11. előadás

Nagy Gábor compalg.inf.elte.hu/ nagy ősz

Diszkrét matematika 2.

1 2. gyakorlat Matematikai és nyelvi alapfogalmak. dr. Kallós Gábor

Legyen adott egy S diszkrét halmaz. Leggyakrabban S az egész számoknak egy halmaza, például S = {0, 1, 2,..., N}, {0, 1, 2,... }.

5. SOR. Üres: S Sorba: S E S Sorból: S S E Első: S E

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.

Minden egész szám osztója önmagának, azaz a a minden egész a-ra.

Diszkrét matematika I., 12. előadás Dr. Takách Géza NyME FMK Informatikai Intézet takach november 30.

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

Csima Judit október 24.

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

Algoritmuselmélet 18. előadás

Programkonstrukciók A programkonstrukciók programfüggvényei Levezetési szabályok. 6. előadás. Programozás-elmélet. Programozás-elmélet 6.

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

Legrövidebb útkereső algoritmusok

Gráfelméleti alapfogalmak

Matematika A1a Analízis

21. Adatszerkezetek Az adattípus absztrakciós szintjei Absztrakt adattípus (ADT) Absztrakt adatszerkezet (ADS) Egyszerű adattípusok Tömbök

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

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

Nagy Gábor compalg.inf.elte.hu/ nagy ősz

Bonyolultságelmélet. Monday 26 th September, 2016, 18:50

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

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

Typotex Kiadó. Bevezetés

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

Algoritmuselmélet. Függvények nagyságrendje, elágazás és korlátozás, dinamikus programozás. Katona Gyula Y.

Felvételi tematika INFORMATIKA

Negatív alapú számrendszerek

Gráfelmélet jegyzet 2. előadás

Gráf-algoritmusok Legrövidebb utak

Átírás:

26. MINIMÁLIS KÖLTSÉGŰ UTAK MINDEN CSÚCSPÁRRA Az előző két fejezetben tárgyalt feladat általánosításaként a gráfban található összes csúcspárra szeretnénk meghatározni a legkisebb költségű utat. A probléma gyakorlati előfordulására példa lehet az autós térképekben előforduló táblázat, amely a városok egymástól való legkisebb távolságait tartalmazza. Ez egy négyzetes táblázat, ahol a sorok és az oszlopok címkeként egyaránt a városok neveit viselik. A táblázat x címkéjű sorának és y címkéjű oszlopának a metszéspontjában található az y városnak az x várostól való legkisebb távolsága. Modellezzük az autós térképet egy gráffal (irányított vagy irányítatlan, attól függően, hogy vannak-e egyirányú utak. A csúcsokat megfeleltetjük a városoknak, az élek pedig a városokat összekötő közvetlen utaknak. Az utak hossza legyen az élek költsége, tehát a gráf legyen élsúlyozott. Célunk a gráf alapján egy ilyen táblázat előállítása. A csúcspárok közötti legkisebb költségű utakat megkereshetnénk az előző feladatnál látott megoldó módszerek segítségével. Minden csúcsot forrásként tekintve futtassuk le a legrövidebb utak egy forrásból algoritmusok egyikét. 1. Amennyiben az élsúlyok nem-negatívak, akkor alkalmazhatjuk a Dijkstra-algoritmust. Ekkor a műveletigény: a Elsőbbségi sorként rendezetlen tömböt használva az utak költségértékeinek tárolására: T(n = n O(n 2 = O(n 3 b Az utak költségeinek elsőbbségi sorát kupaccal reprezentálva: T(n = n O((n + e log n = O(n 2 log n + n e log n, ami ritka (illetve nem-sűrű gráfokra T(n = O(n 2 log n futási időt eredményez. 2. Ha negatív élsúlyokat is megengedünk, akkor a Bellman-Ford algoritmust használhatjuk, amellyel a műveletigény T(n = n Θ((n 1 e = Θ(n 2 e. Ez ritka gráfokra T(n = O(n 3, sűrű gráfokra T(n = Θ(n 4 nagyságrendű lépésszámot jelent. Ebben a fejezetben az összes legrövidebb út meghatározására a megszorítások nélküli élsúlyok esetére hatékonyabb eljárást adunk. Vizsgáljuk ennek az algoritmus speciális változatát gráfok tranzitív lezártjának a kiszámítására. 26.1. A Folyd algoritmus Feladat. Adott egy G V, E élsúlyozott, irányított vagy irányítás nélküli, negatív összköltségű irányított kört nem tartalmazó véges gráf. Határozzuk meg u, v V csúcspárra az u-ból v-be vezető legkisebb költségű utat. A fejezet további részében az utak hosszán az út mentén szereplő élek költségeinek az összegét értjük, a csúcspárok távolságán pedig a csúcspár közötti egyik legrövidebb út hosszát értjük. Tegyük fel, hogy V = {1, 2,, n}, és hogy a G gráf az C szomszédsági mátrixával adott. A csúcspárok távolságának a kiszámítására egy szintén n n-es D mátrixot fogunk használni. Vezessünk be a következő fogalmat. Legyen egy p = v 1,, v k egyszerű út belső csúcsa p minden v 1 -től és v k -tól különböző csúcsa, azaz v 2,, v k 1 halmaz elemei.

Az algoritmus elve az, hogy a megoldáshoz vezető n-lépéses iteráció során folyamatosan fenntartjuk a D (k mátrixunkra a következő invariáns tulajdonságot. Állítás. A k-adik iteráció lefutása után (i, j V V csúcspárra D (k [i, j] azon i j utak legrövidebbjeinek a hosszát tartalmazza, amelyek közbülső csúcsai k-nál nem nagyobb sorszámúak. Tehát k = n esetén (i, j csúcspárra D (n [i, j] az i j utak legrövidebbjeinek a hosszát, azaz a feladat megoldását tartalmazza. Bizonyítás. Az állítást k szerinti teljes indukcióval látjuk be. k = 0: (i, j csúcspárra D (0 [i, j] tartalmazza azon i j utak közül a legkisebb költségű utak hosszát, amely belső csúcsainak sorszáma kisebb, mint 1, azaz nem tartalmaznak belső csúcsot. Ami nem más, mint a C szomszédsági mátrixban szereplő érték. Tehát D (0 mátrix értéke legyen C szomszédsági mátrix. k 1 k: a D (k [i, j] értéket szeretnénk kiszámítani a D (k 1 mátrix értékeinek a felhasználásával. Két esetet különböztetünk meg aszerint, hogy p (k = i j (i-ből jbe vezető, belső csúcsként nem nagyobb, mint k sorszámú csúcsokat tartalmazó egyik legrövidebb útnak, k belső csúcsa vagy sem. (p (k út legyen egyszerű út, mert ha tartalmazna kört, és nem lehet negatív összköltségű a kör, akkor a kört "kivágva" a kapott út költsége nem nő, tehát a legrövidebb utak között vannak egyszerűek. 1. Ha k nem belső csúcsa p (k útnak, akkor p (k minden belső csúcsának sorszáma legfeljebb k 1, azaz p (k hossza azonos a legfeljebb k 1 belső csúcsokat tartalmazó i j legrövidebb út hosszával D (k 1 [i, j]-vel. 2. Ha k belső csúcs a p (k úton, akkor felbonthatjuk p 1 (k = i k és p 2 (k = k j legfeljebb k 1 sorszámú belső csúcsokat tartalmazó i-ből k-ba ill. k-ból j-be vezető legrövidebb egyszerű utakra (legrövidebb út részútja is legrövidebb út. Tehát D (k [i, j] = D (k 1 [i, k] + D (k 1 [k, j]. Tehát a két eset közül az adja a rövidebb utat, ahol kisebb a számított érték, azaz a kérdéses legrövidebb út hossza megkapható az alábbi képlettel: D (k [i, j] = min{d (k 1 [i, j], D (k [i, j] = D (k 1 [i, k] + D (k 1 [k, j]} A fenti bizonyítás közvetlenül megadja az algoritmus lényegi lépését, D (k előállítását. Mivel D (k [i, k] = D (k 1 [i, k] és D (k [k, j] = D (k 1 [k, j], így elegendő egyetlen D mátrix az algoritmus végrehajtásához. Az algoritmus a 26.1. ábrán látható. 26.1. ábra. A Floyd algoritmus

A Floyd algoritmust az ábrázolás szintjén adtuk meg mátrixos ábrázolás mellett, mint ahogy a szakirodalomban szokás. 26.2. Az algoritmus szemléltetése A 26.2. ábra szemlélteti az algoritmus működését ADS szinten. Minden iteráció után megadjuk a gráf és a költségmátrix aktuális állapotát. A kezdeti inicializáló lépés után D mátrix megegyezik a gráf csúcsmátrixának értékével. Az első iteráció során, az 1-es csúcson átmenő utakkal próbáljuk javítani a mátrix értékeit. Amikor a 2-es csúcsból a 4-es csúcsba menő utakat vizsgáljuk, találunk az 1-esen átmenő javító utat, D[2,4] értékét 2-re javítjuk. Mivel a gráf irányítatlan, így a szimmetrikus esetben is történik javítás (D[4,2]. 0 1 1 D (0 1 0 2 2 0 1 1 1 0 0 1 1 D (1 1 0 2 2 2 0 1 1 2 1 0 0 1 3 1 D (2 1 0 2 2 3 2 0 1 1 2 1 0 0 1 2 1 D (4 1 0 2 2 2 2 0 1 1 2 1 0 26.2. ábra. A Floyd algoritmus lépésenkénti végrehajtása A második iterációs lépésben már olyan javító utakat keresünk, amelyek belső csúcsainak a sorszáma legfeljebb 2. Vizsgáljuk az legfeljebb 1-es sorszámú belső csúcsokat tartalmazó utakat (ill. a még nem létező utakat, és megpróbáljuk közbülső csúcsnak beilleszteni a 2-es csúcsot. Az 1-ből a 3-ba, ill. 3-ból az 1-be találtunk javító utat (az eddig nem létező úthoz, a hosszú úthoz képest a 2-esen át. A harmadik iterációban nem találunk a 3-as csúcson átmenő javító utakat, így a mátrix nem változik.

A negyedik iterációs lépésben már olyan javító utakat keresünk, amelyek belső csúcsainak a sorszáma legfeljebb 4. Vizsgáljuk a legfeljebb 3-as sorszámú belső csúcsokat tartalmazó utakat (ill. a még nem létező utakat, és megpróbálunk a 4-es csúcson átmenő, kisebb költségű "elkerülő" utat találni. Találunk a 4-es csúcson átmenő javító utat. Eddig az 1-esből a 3-mas csúcsba vezető, legfeljebb 3-as sorszámú belső csúcsokat tartalmazó legrövidebb út hossza 3 volt. Ez az út az 1, 2, 3. Most megengedjük, hogy belső pont sorszáma lehet 4 is, így megvizsgálva az 1, 4 ill. 4, 3 részutak hosszának összegét, az kevesebb mint, az 1, 2, 3 út hossza, tehát találtunk egy kisebb költségű elkerülő utat. Természetesen ez a szimmetrikus esetre is igaz. A 4. lépés után megkapjuk a végeredményt. Az algoritmus n iterációs lépésben, az n 2 -es mátrix minden elemére konstans számú műveletet végez, így T(n = Θ(n 3. Ez egy stabil algoritmus, mivel legjobb, legrosszabb és átlagos esetben is azonos a műveletigénye. A műveletigényünk tehát nagyságrendileg ugyanannyi, mintha a Dijkstra algoritmust csúcsmátrixos ábrázolású gráfon, prioritásos sorként rendezetlen tömböt használva, minden csúcsra, mint forrásra lefuttatnánk. A Dijkstra algoritmusnál már láttuk, hogy ezt a megvalósítást sűrű gráfok esetén célszerű alkalmazni. Ritka gráfok esetén éllistás ábrázolást használhatunk, prioritásos sorként pedig kupacot, így a műveletigény T(n = Ο(n 2 log n, ami jobb, mint a Floyd algoritmus műveletigénye. Úgy tűnhet, hogy felesleges a Floyd algoritmust használni, mivel a Dijkstra algoritmus jobb eredményt ad, vegyük azonban figyelembe, hogy a Dijkstra algoritmust csak nem negatív költségű élek esetén használhatjuk. Amennyiben előfordulhat a gráfban negatív súlyú él (de negatív összköltségű kör nem, a Bellman-Ford algoritmus használatával ritka gráfokra T(n = Ο(n 3, sűrű gráfokra T(n = Ο(n 3 műveletigénnyel tudjuk megoldani a feladatot. Látható, hogy sűrű gráfok esetén a Floyd algoritmus hatékonyabb. Amennyiben a csúcspárok közötti legrövidebb utakra is kíváncsiak vagyunk (és nem csak azok hosszára, a korábban már látott módon eltárolhatjuk a megelőző (vagy közbülső k címkéjű csúcsot. Mivel most csúcspárok közötti utakról van szó minden lehetséges csúcspárra (n n csúcspár, így érdemes mátrixot használni. 26.3. Tranzitív lezárt Feladat. Adott egy G V, E irányított vagy irányítás nélküli, súlyozatlan, véges gráf. Határozzuk meg u, v V csúcsra, hogy létezik-e u-ból v-be vezető út a gráfban. A fejezet további részében a gráfunk legyen véges, súlyozatlan, irányított vagy irányítatlan, az utak hosszán pedig az út mentén található élek számát értjük. Állítás. Legyen a G gráf szomszédsági mátrixa C[1 n, 1 n]. Ekkor C k [i, j] (1 i, j n, k N az i-ből a j-be vezető k hosszúságú utak számát adja meg. Bizonyítás. k szerinti teljes indukcióval. k = 1: Az 1 hosszú út egy élnek felel meg. Tehát C 1 [i, j] az i-ből a j-be menő élek számát adja meg, (ami megállapodás szerint legfeljebb 1 lehet, ez pedig pontosan a szomszédsági mátrix definíciója. k 1 k: Tegyük fel, hogy k 1-ig teljesül az állítás. Kérdés, hányféleképpen juthatok el k hosszú úton i-ből j-be? Az i j k hosszúságú utat a következő módon tudjuk felbontani: i h k 1 hosszú út, majd h j él. Kérdés az, hogy hányféleképpen juthatok el k hosszú úton i-ből j-be úgy, hogy a j-t megelőző pont a gráfban a h csúcs.

Az indukciós feltevés szerint, C k 1 [i, h] féle módon juthatunkk el k 1 hosszú úton i-ből h-ba. Továbbá, ha létezik h j él a gráfban (C[h, j] = 1, akkor azon már csak egyféleképpen tudunk tovább menni j-be, azaz C k 1 [i, h] C[h, j] megadja az iből a j-be menő k hosszú utak számát, ahol j előtti megelőző csúcs a h. Amennyiben nem létezik h j él, akkor a szorzat értéke 0, ami kifejezi, hogy nincs ilyen út a gráfban. Az előzőekben h-n átmenő utakat számláltunk, de s tetszőleges csúcsa lehet a gráfnak, így ezeket minden h V csúcsra összegezzük: n C k [i, j] = (C k 1 [i, h] C[h, j] i=1 ahol i, j [1 n], ami nem más, mint egy mátrix szorzat: C k = C k 1 C. Következmény. Legyen S k = C + C 2 + C 3 + + C k mátrix. Ekkor S k [i, j] eleme az i-ből jbe vezető legfeljebb k hosszúságú utak számát adja meg. Definíció. A G V, E véges gráf útmátrixa, vagy elérhetőségi mátrixa: U[i, j] = { 1 ha i j út a gráfban 0 különben ahol i, j [1 n], n = V. Állítás. Ha létezik i-ből j-be vezető út a gráfban, akkor létezik i-ből j-be vezető egyszerű út is, továbbá minden egyszerű út legfeljebb n 1 hosszú, egy egyszerű kör pedig legfeljebb n hosszú. Tehát az útmátrix előállításához számoljuk ki C + C 2 + C 3 + + C k összeget, és az eredménymátrixban a nullánál nagyobb elemeket írjuk át 1-esre. Definíció. Egy G V, E gráf tranzitív lezárása G V, E gráf, ahol V = V és (u, v E u v út a gráfban. Állítás. G útmátrixa G szomszédsági mátrixa. Állítás. G erősen összefüggő U-ban nincs nulla elem G teljes gráf. 26.4. A Warshall algoritmus Az előző fejezetben egy gráf tranzitív lezártját elő tudtuk állítani a szomszédsági mátrix hatványainak az összegeként, amelynek hatékonysága T(n = Θ(n 4. Most lássunk egy nagyságrenddel hatékonyabb módszert. A tranzitív lezárt meghatározására használhatnánk a Floyd algoritmust is, hiszen az algoritmus lefutása után, ha D[i, j] véges, akkor létezik i j út, ha végtelen, akkor pedig nincs i-ből j-be vezető út. Azonban a Floyd algoritmus elvét felhasználva, szép algoritmus adható az ábrázolás szintjén a problémára (bár S. Warshall nevéhez fűződő algoritmus megelőzte Floydét. Adott a G V, E véges, súlyozatlan, irányított vagy irányítatlan gráf. A Floyd algoritmushoz képest az alábbi változtatások után megkapjuk a Warshall algoritmust: 1. A W logikai értékekből álló mátrix (a Floyd-nál D-vel jelölt mátrix kezdeti értéke legyen ahol i, j [1 n], n = V. U[i, j] = { ha i = j, vagy (i, j E különben

2. A ciklusban végzett művelet pedig legyen a következő: W[i, j] = W[i, j] (W[i, k] W[k, j] Az algoritmus helyességének a belátása hasonlóan történhet, mint a Floyd algoritmusnál. Természetesen a műveletigény is aszimptotikusan megegyezik a Floyd algoritmus műveletigényével, azzal a különbséggel, hogy a Floyd algoritmusnál, a ciklus belsejében konstans műveletnek tekintett összeadás és minimumválasztás helyett, most logikai műveleteket végzünk, ami hatékonyabb lehet.