38. A gráfalgoritmusok alkalmazása



Hasonló dokumentumok
29. Visszalépéses keresés 1.

Adatszerkezetek II. 1. előadás

Adatszerkezetek II. 2. előadás

10. gyakorlat Struktúrák, uniók, típusdefiníciók

1. Jelölje meg az összes igaz állítást a következők közül!

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

Struktúra nélküli adatszerkezetek

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

Programozás I. zárthelyi dolgozat

Egyszerű programozási tételek

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 7. előadás

22. GRÁFOK ÁBRÁZOLÁSA

Adatszerkezetek 1. Dr. Iványi Péter

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

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

KOVÁCS BÉLA, MATEMATIKA I.

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

30. ERŐSEN ÜSSZEFÜGGŐ KOMPONENSEK

8. gyakorlat Pointerek, dinamikus memóriakezelés

Felvételi tematika INFORMATIKA

Adatbázis és szoftverfejlesztés elmélet. Programozási tételek

Tájékoztató. Használható segédeszköz: -

Web-programozó Web-programozó

A programozás alapjai előadás. Amiről szólesz: A tárgy címe: A programozás alapjai

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

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Szimulációs technikák

Modellezés Gregorics Tibor Mesterséges intelligencia

Kinek szól a könyv? A könyv témája A könyv felépítése Mire van szükség a könyv használatához? A könyvben használt jelölések. 1. Mi a programozás?

5. előadás. Programozás-elmélet. Programozás-elmélet 5. előadás

A C programozási nyelv III. Pointerek és tömbök.

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.

A C programozási nyelv III. Pointerek és tömbök.

Bevezetés az informatikába

Rendezések. Sergyán Szabolcs Óbudai Egyetem Neumann János Informatikai Kar október 24.

INFORMATIKAI ALAPISMERETEK

A 2013/2014 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

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

Tájékoztató. Használható segédeszköz: -

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Programozás I. Egyszerű programozási tételek. Sergyán Szabolcs

A programozás alapjai előadás. [<struktúra változó azonosítók>] ; Dinamikus adatszerkezetek:

(Solid modeling, Geometric modeling) Testmodell: egy létező vagy elképzelt objektum digitális reprezentációja.

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

Adatszerkezetek 2. Dr. Iványi Péter

Programozás alapjai. 6. gyakorlat Futásidő, rekurzió, feladatmegoldás

Adatszerkezetek II. 10. előadás

C programozási nyelv

5. Gyakorlat. struct diak {

INFORMATIKAI ALAPISMERETEK

Programozás I gyakorlat

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

Dicsőségtabló Beadós programozási feladatok

Algoritmizálás és adatmodellezés tanítása 1. előadás

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

ALGORITMIKUS SZERKEZETEK ELÁGAZÁSOK, CIKLUSOK, FÜGGVÉNYEK

A 35/2016. (VIII. 31.) NFM rendelet szakmai és vizsgakövetelménye alapján.

Pásztor Attila. Algoritmizálás és programozás tankönyv az emeltszintű érettségihez

A programozás alapjai 1 Rekurzió

Fizika feladatok. 1. Feladatok a termodinamika tárgyköréből november 28. Hővezetés, hőterjedés sugárzással. Ideális gázok állapotegyenlete

V. Kétszemélyes játékok

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

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

van neve lehetnek bemeneti paraméterei (argumentumai) lehet visszatérési értéke a függvényt úgy használjuk, hogy meghívjuk

Ugrólisták. RSL Insert Example. insert(22) with 3 flips. Runtime?

Programozási nyelvek 1. előadás

A rész (30 pont) A.1. Vajon mit csinál? (5 pont) A generál(n) algoritmus egy n természetes számot dolgoz fel (0 < n < 100).

Java programozási nyelv

Programozás I gyakorlat

Véletlen sorozatok ellenőrzésének módszerei. dolgozat

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

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

1.1.1 Dátum és idő függvények

Termék modell. Definíció:

Algoritmusok és adatszerkezetek I. 1. előadás

Programozás I. Egyszerű programozási tételek. Sergyán Szabolcs

Diszkrét matematika 2.C szakirány

A 2010/2011 tanévi Országos Középiskolai Tanulmányi Verseny második fordulójának megoldása. II. (programozás) kategória

Programozási nyelvek (ADA)

INFORMATIKAI ALAPISMERETEK

Bevezető feldatok. Elágazás és összegzés tétele

Az egyszerűsítés utáni alak:

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

Az informatika kulcsfogalmai

7. fejezet: Mutatók és tömbök

BACKTRACKING Visszalépéses keresés

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ömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

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

7. BINÁRIS FÁK 7.1. A bináris fa absztrakt adattípus 7.2. A bináris fa absztrakt adatszerkezet

Java és web programozás

A gráffogalom fejlődése

Kiegészítő előadás. Vizsgabemutató VBA. Dr. Kallós Gábor, Fehérvári Arnold, Pusztai Pál Krankovits Melinda. Széchenyi István Egyetem

Rekurzió. Dr. Iványi Péter

Sorozatok határértéke SOROZAT FOGALMA, MEGADÁSA, ÁBRÁZOLÁSA; KORLÁTOS ÉS MONOTON SOROZATOK

Visszalépéses keresés

Átírás:

38. A gráfalgoritmusok alkalmazása Állapotok és átmenetek A gráf adattípus nagyon sokféle feladat megoldásánál alkalmazható. Rejtvények, játékok, közlekedési és szállítási problémák, stratégiai feladatok vizsgálhatók gráfokkal. A képfelismerés, szövegkritika, nyelvészeti analízis területén szintén bevethetô a gráfelmélet. A gráfokat felhasználja az egymástól látszólag távol esô közgazdaságtan, pszichológia, szociológia, esztétika, biológia stb. A legtöbb esetben a gráf felépítése is a program feladata. A feladatban elôforduló lehetséges eseteket a feladat állapotainak tekintjük. A sakk egy állapota például a bábuk egy elhelyezkedése a táblán. Az állapotokat átmenetek kötik össze, melyek jelzik, hogy egy-egy állapotból egy lépésben mely más állapotokba juthatunk. A sakkjáték egy állapotában minden lehetséges lépés egy-egy átmenetet jelent egy másik állapotba. A feladat megoldásakor keressük a kezdôállapotból a kívánt végállapotba vezetô átmenetek sorozatát. A gráfok alkalmazásához az egyes állapotokat egy gráf csúcsainak feleltetjük meg. A gráf élei az átmeneteket jelzik. Útkeresési algoritmusokkal döntjük el, hogyan lehet a kezdôállapotból a végállapotba eljutni. Kupák Tekintsük a következô, közismert feladatot: Egy 8 literes kupa tele van borral. Hogyan tölthetjük szét két egyenlô részre, ha ehhez egy 5 literes és egy 3 literes kupa áll még a rendelkezésünkre? Az öntögetések során egy kupa vagy teljesen tele lesz, vagy pedig teljesen kiürül. A feladatot némileg általánosítva oldjuk meg. A Térfogat tömb tartalmazza a kupák térfogatát, a Kezd tömb a kezdeti bormennyiséget, a Vég tömb a végsô bormennyiséget az egyes kupákban. A fenti feladat szerint: Térfogat(1) = 8 Térfogat(2) = 5 Térfogat(3) = 3 Kezd(1) = 8 Kezd(2) = 0 Kezd(3) = 0 Vég(1) = 4 Vég(2) = 4 Vég(3) = 0 Az állapotok tárolása A feladat kezdô- és végállapota Feladatunknak látszólag semmi köze a gráfokhoz. A gráf kialakításához elôször határozzuk meg, milyen állapotokkal jellemezhetjük az elôforduló eseteket! Az öntögetés egy állapotát a kupákban lévô bor mennyisége jellemzi. Egy lehetséges állapotot és a hozzá tartozó átmeneteket például az alábbi ábrán szemléltetjük. Az állapotokat struktúrával írjuk le, amely egy háromelemû tömböt tartalmaz, a kupákban lévô bor mennyiségének megfelelôen: 254

38. A gráfalgoritmusok alkalmazása Lehetséges átmenetek egy meghatározott állapotból kiindulva Az öntögetéseket a nyilak jelölik (honnan hová). Struktúra TÁllapot VÁLTOZÓ Kupa(3) MINT Egész az egyes kupákban lévô bormennyiség STRUKTÚRA VÉGE Vegyük észre, hogy egy állapotot elegendô lenne két mennyiséggel jellemezni. Ha ismerjük az 5 és a 3 literes kupákban lévô bor térfogatát, akkor egyértelmûen meghatározhatjuk a 8 literes kupában lévô mennyiséget. Csupán az áttekinthetôbb kód kedvéért tároljuk mindhárom értéket. Ez nem jelent túl nagy memóriafelhasználást. Az egyes kupákban 0-tól a kancsó térfogatáig változhat a bor mennyisége. Ezért a gráf csúcsainak száma: Gráf.CsúcsSzám = (Térfogat(2) + 1)*(Térfogat(3) + 1) Az állapotokat egy TÁllapot típusú tömbben tároljuk: VÁLTOZÓ Állapot(Gráf.CsúcsSzám) MINT TÁllapot Megtehettük volna, hogy struktúra helyett kétdimenziós tömböt használunk, melynek elsô dimenziója az állapot, második dimenziója pedig a kupa sorszámát indexeli. A struktúra alkalmazása azonban könnyebben olvasható forráskódot eredményez. 1. gyakorlat. A Kupa forrásfájlban található kód alapján kövessük nyomon a feladat megoldását! Figyeljük meg, hogy a mondatszerû leírás utasításait hol kell kiegészíteni vagy felbontani további utasításokra a tanult programozási nyelv sajátosságai miatt. Elemezzük ezeket az eltéréseket, vizsgáljuk meg az eltérések okát! A Visual Basic nem engedi meg a struktúra definíciójában szereplô tömb méretének megadását. Ezért a Kupa tömböket külön ciklussal kell dimenzionálni. Ennek módját az 1. gyakorlat megoldásában mutatjuk be. Megjegyezzük, hogy az Állapot tömb lehetett volna a TGráf struktúra tagja is, hiszen a gráf csúcsainak tulajdonságát (a hozzájuk tartozó állapotot) tartalmazza. Nem akartuk azonban módosítani az elôzôleg kialakított gráftípus definícióját. 255

Az állapottömb feltöltése A kupákban lévô bormennyiség és az állapotok sorszáma (tehát a gráf csúcsainak sorszáma) között függvénnyel teremtünk kapcsolatot. A függvénynek tulajdonképpen egy kétdimenziós tömb (a 2. és 3. kupában lévô bor mennyisége) elemeihez kell sorszámot rendelnie. Ezt például sorfolytonos számozással érhetjük el: Sorszámok hozzárendelése az állapotokhoz a 3 és 5 literes kupában lévô bor mennyisége alapján Az öntögetések kódolása FÜGGVÉNY TérfogatbólCsúcs(Bor2, Bor3 MINT Egész) MINT Egész Bor2 liter bor van a 2., Bor3 liter bor van a 3. kupában TérfogatbólCsúcs = (Térfogat(3) + 1) * Bor2 + Bor3 + 1 FÜGGVÉNY VÉGE Egyetlen képlet miatt általában nem érdemes függvény készíteni. Itt ismét a forráskódot tesszük áttekinthetôbbé. Ezek után az összes lehetséges módon fel kell írni az elôforduló állapotokat, és hozzárendelni az Állapot tömb elemeihez: CIKLUS Bor2 = 0-tól Térfogat(2)-ig CIKLUS Bor3 = 0-tól Térfogat(3)-ig Csúcs = TérfogatbólCsúcs(Bor2, Bor3) Állapot(Csúcs).Kupa(1) = ÖsszesBor Bor2 Bor3 Állapot(Csúcs).Kupa(2) = Bor2 Állapot(Csúcs).Kupa(3) = Bor3 ahol: ÖsszesBor = Kezd(1) + Kezd(2) +Kezd(3) A gráf élei a bor öntését jelzik az egyik kupából a másikba. Egy átöntés eredményét az ÉlVége függvénnyel írjuk le. A függvényt akkor fogjuk felhasználni, amikor értéket adunk a csúcsmátrix elemeinek. A függvény argumentumként megadjuk a kiindulási állapot/csúcs sorszámát (ÉlKezdete), és azt, hogy melyik kupából (Melyikbôl) öntünk bort melyik másik kupába (Melyikbe). A függvény meghatározza az öntés utáni állapot sorszámát, tehát annak a csúcsnak a sorszámát, ahová befut az állapotváltozást leíró él: FÜGGVÉNY ÉlVége(Élkezdete, Melyikbôl, Melyikbe MINT Egész) MINT Egész FÜGGVÉNY VÉGE Az alábbi utasításokban a Kupa tömbök az Állapot(Élkezdete) struktúra tagjai. Az áttekinthetôség kedvéért a pont elôl lehagyjuk az Állapot(Élkezdete) tömbelemmel való minôsítést. (Ezt az egyszerûsítést minôsítôblokk alkalmazásával a forráskódban is megtehetjük.) Az átöntésnél két eset fordulhat elô. 1. A Melyikbôl kupában lévô bor belefér a Melyikbe kupába, azaz:.kupa(melyikbôl) < Térfogat(Melyikbe).Kupa(Melyikbe) Ekkor a teljes mennyiséget átöntjük, így a Melyikbôl kupa kiürül. Az öntés utáni bormennyiségek:.kupa(melyikbe) =.Kupa(Melyikbe) +.Kupa(Melyikbôl).Kupa(Melyikbôl) = 0 256

38. A gráfalgoritmusok alkalmazása Öntés az egyik edénybôl a másikba 2. Ha a Melyikbôl kupában lévô bor nem fér bele teljes egészében a Melyikbe kupába, akkor átöntünk annyit, hogy ez utóbbi tele legyen. Ami nem fér bele, az marad a Melyikbôl kupában. Ekkor az öntés utáni bormennyiségek:.kupa(melyikbôl) =.Kupa(Melyikbôl) (Térfogat(Melyikbe).Kupa(Melyikbe).Kupa(Melyikbe) = Térfogat(Melyikbe) Az ÉlVége függvény visszatérési értékét, azaz a gráf ezen élének végpontját a TérfogatbólCsúcs függvénnyel határozzuk meg: ÉlVége = TérfogatbólCsúcs(.Kupa(2),.Kupa(3)) Ügyeljünk arra, hogy az Élvége függvény Élkezdete paraméterét feltétlenül érték szerint adjuk át, különben megváltoztatjuk az Élkezdete csúcshoz tartozó állapotot! 2. gyakorlat. A Kupa forrásfájlban található kód alapján tekintsük át az ÉlVége függvény definícióját! Bár a Visual Basic-ben a struktúrák érték típusú adatszerkezetek, a struktúra tömb tagjai már hivatkozás típusúak. Így a struktúra érték szerinti paraméterátadásánál is az eredeti tömbre hivatkozik a változó, tehát módosítani tudja az elemeit. Ezért a Kupa forráskódjában bevezettünk egy ideiglenes változót (Temp), melynek átadjuk a Kupa tömb elemeit. Ezzel elkerüljük az eredeti állapot módosítását. A csúcsmátrix feltöltése A csúcsmátrix az állapotok között lehetséges átmeneteket tartalmazza. A gráf egyik csúcsából akkor vezet él egy másik csúcsba, ha egyetlen öntéssel eljuthatunk az egyik csúcsnak megfelelô állapotból a másik csúcsnak megfelelô állapotba. A csúcsmátrix elkészítéséhez sorra vesszük az egyes állapotokat. Minden egyes állapotnál elvégezzük a lehetséges öntögetéseket. A csúcsmátrixban feljegyezzük, hogy egy-egy öntés során melyik állapotba, azaz melyik csúcsba jutottunk el. 257

Minden állapot esetén hatféle öntés képzelhetô el. Bármely nem üres kupából önthetünk bort bármely másik kupába. (Tele kupába 0 litert öntünk át.) Az öntések utáni állapotot az ÉlVége függvény adja meg. Így a csúcsmátrix feltöltésének algoritmusa: Gráf.Szomszédpont() = Hamis az összes elemre CIKLUS Csúcs1 = 1-tôl Gráf.CsúcsSzám-ig CIKLUS Melyikbôl = 1-tôl 3-ig ebbôl a kupából öntünk CIKLUS Melyikbe = 1-tôl 3-ig ebbe a kupába öntjük HA Melyikbôl Melyikbe ÉS Állapot(Csúcs1).Kupa(Melyikbôl) > 0 AKKOR Csúcs2 = ÉlVége(Csúcs1, Melyikbôl, Melyikbe) Gráf.Szomszéd(Csúcs1, Csúcs2) = Igaz ELÁGAZÁS VÉGE 3. gyakorlat. Egészítsük ki a Kupa forrásfájl programját a csúcsmátrix kiírásával! A feladat megoldása Miután elkészítettük a feladatnak megfelelô adatszerkezetet, a megoldást már nagyon könnyen megkaphatjuk. Nem kell mást tennünk, mint az útkeresés algoritmusát lefuttatni a kezdôállapot és a végállapot között. Az útkeresés algoritmusán semmit nem módosítunk. A szélességi bejárásra alapozott útkeresés mindjárt a legegyszerûbb (legkevesebb öntögetéssel járó) átmenetet határozza meg. Vegyük észre, hogy egy ügyesen megválasztott adatszerkezet nagyon egyszerûvé teszi a feladat megoldását! 4. gyakorlat. Egészítsük ki a Kupa forrásfájl programját a szélességi útkeresés algoritmusával! Futtassuk a programot, és határozzuk meg a feladat megoldását! Feladatok Az 1 6. feladatok a leckében bemutatott kupás feladatra vonatkoznak. 1. A megoldás kiírásánál az érintett csúcsok/állapotok sorszáma helyett jelenítsük meg a kupákban lévô bormennyiséget! Módosítsuk a kiírást úgy, hogy az útkeresésnél kapott fordított sorrend helyett a kezdôállapotból induljon a felsorolás! 2. Bôvítsük a feladat megoldásának megjelenítését! Jelöljük meg, hogy az egyes lépésekben melyik kupából melyik kupába kell bort önteni! 3. A csúcsmátrix kiírásával vizsgáljuk meg, hogy mely állapotokba nem lehet egyáltalán eljutni az adott kupatérfogatok felhasználásával! 4. Ábrázoljuk síkbeli koordináta-rendszerben az egyes állapotokat! Tekintsük x koordinátának az 5 literes, y koordinátának a 3 literes kupában lévô bor mennyiségét! Hol helyezkednek el azok a pontok, melyek nem elérhetô állapotokat jelölnek? 5. Oldjuk meg a kupás feladatot, ha 12, 7 és 4 literes kupák állnak a rendelkezésünkre! Kezdetben a 12 literes kupa tele van, és meg kell felezni a bormennyiséget. Módosítsuk a programot úgy, hogy ezeket az adatokat a felhasználótól kérje be! 258