29. Visszalépéses keresés 1.

Hasonló dokumentumok
38. A gráfalgoritmusok alkalmazása

2. Visszalépéses keresé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

15. A VERSENYRENDEZÉS

Rekurzió. (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

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

Visszalépéses keresés

Webprogramozás szakkör

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

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

Algoritmuselmélet 2. előadás

Algoritmusok és adatszerkezetek gyakorlat 03 Oszd meg és uralkodj. Nagy

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

A programozás alapjai 1 Rekurzió

Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés. Szekvenciális fájlkezelés Fájlok használata

Permutáció n = 3 esetében: Eredmény: permutációk száma: P n = n! romámul: permutări, angolul: permutation

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

II. Mérés SZÉCHENYI ISTVÁN EGYETEM GYŐR TÁVKÖZLÉSI TANSZÉK

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

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

Bevezetés a programozásba I 3. gyakorlat. PLanG: Programozási tételek. Programozási tételek Algoritmusok

30. ERŐSEN ÜSSZEFÜGGŐ KOMPONENSEK

Java programozási nyelv

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

Rekurzió. Dr. Iványi Péter

Nézzük tovább a lexikai egységeket!

Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Függvények II. Indítsuk el az Excel programot! A minta alapján vigyük be a Munka1 munkalapra a táblázat adatait! 1. ábra Minta az adatbevitelhez

Programozási segédlet

Programozás Minta programterv a 1. házi feladathoz 1.

Access gyakorlati feladatok lépésről lépésre

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

I. ALAPALGORITMUSOK. I. Pszeudokódban beolvas n prim igaz minden i 2,gyök(n) végezd el ha n % i = 0 akkor prim hamis

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

8. gyakorlat Pointerek, dinamikus memóriakezelés

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

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

Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés

Informatikai tehetséggondozás:

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

Megerősítéses tanulás 7. előadás

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

Adatszerkezetek 7a. Dr. IványiPéter

MS ACCESS 2010 ADATBÁZIS-KEZELÉS ELMÉLET SZE INFORMATIKAI KÉPZÉS 1

Kérem, ismerkedjen meg a DigitAudit program AuditTeszt moduljának Adatok tesztelése menüpontjával.

Programozás I. Metódusok C#-ban Egyszerű programozási tételek. Sergyán Szabolcs

I. Internetes keresési feladatok (ajánlott idő: 20 perc)

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

Feladat. Bemenő adatok. Bemenő adatfájlok elvárt formája. Berezvai Dániel 1. beadandó/4. feladat április 13. Például (bemenet/pelda.

Programozás alapjai 9.Gy: Struktúra 2.

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

Felvételi tematika INFORMATIKA

7. Laboratóriumi gyakorlat: Vezérlési szerkezetek II.

Algoritmusok és adatszerkezetek 2.

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

Országos Középiskolai Tanulmányi Verseny, 2004/2005-ös tanév INFORMATIKA, II. (programozói) kategória második fordulójának javítási útmutatója

Bevezetés a programozásba I.

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Keresési algoritmusok, optimalizáció

BACKTRACKING Visszalépéses keresés

VI. Robotprogramozó Országos Csapatverseny évfolyam

Rekurzív algoritmusok

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

Programozási nyelvek a közoktatásban alapfogalmak I. előadás

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

Mesterséges Intelligencia. Csató Lehel. Csató Lehel. Matematika-Informatika Tanszék Babeş Bolyai Tudományegyetem, Kolozsvár 2007/2008

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

Optimalizációs stratégiák 2.

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

3. Előadás. Megyesi László: Lineáris algebra, oldal. 3. előadás Lineáris egyenletrendszerek

Dinamikus programozás II.

BABEŞ BOLYAI TUDOMÁNYEGYETEM MATEMATIKA ÉS INFORMATIKA KAR BBTE Matek-Infó verseny 1. tételsor INFORMATIKA írásbeli. A versenyzők figyelmébe:

Programozás I. 1. előadás: Algoritmusok alapjai. Sergyán Szabolcs

sallang avagy Fordítótervezés dióhéjban Sallai Gyula

Rekurzió. Működése, programtranszformációk. Programozás II. előadás. Szénási Sándor.

Programozási nyelvek 6. előadás

Lekérdezések I. Egyszerű választó lekérdezések

2. Visszalépéses stratégia

Modellellenőrzés. dr. Majzik István BME Méréstechnika és Információs Rendszerek Tanszék

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

Az informatika kulcsfogalmai

SAP HR Általános lekérdező Ad-hoc-query

AZ ALGORITMUS. az eredményt szolgáltatja

Játék a szavakkal. Ismétléses nélküli kombináció: n különböző elem közül választunk ki k darabot úgy, hogy egy elemet csak egyszer

Oktatási segédlet 2014

Struktúra nélküli adatszerkezetek

1. Alapok. #!/bin/bash

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

Szoftver karbantartási lépések ellenőrzése

Hogyan lehet Pivot tábla segítségével komplex adatokat elemezni és bemutatni?

Bevezetés a programozásba I.

Bevezetés a programozásba I.

OEP Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1. Feladat. Elemzés 1

Programozás I. házi feladat

Visszalépéses kiválogatás

INFORMATIKA javítókulcs 2016

Informatikai tehetséggondozás:

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

Átírás:

29. Visszalépéses keresés 1. A visszalépéses keresés algoritmusa Az eddig megismert algoritmusok bizonyos értelemben nyílegyenesen haladtak elôre. Tudtuk, hogy merre kell mennünk, és minden egyes lépéssel közelebb kerültünk a feladat megoldásához. Sokszor azonban nem látjuk elôre az utat, csak próbálkozásokkal tudjuk elérni a célt. Tipikus példa egy labirintus felderítése. Ha zsákutcába jutottunk, akkor bizony vissza kell lépni az utolsó elágazásig, és másfelé indulni. A visszalépéses keresést (backtrack) azokban a feladatokban alkalmazzuk, melyekben a megoldás során gyakran kerülünk döntési helyzetbe. Egy-egy döntés meghatározza a megoldás további folyamatát. Lehetséges azonban, hogy így megakadunk, ezért meg kell változtatnunk korábbi döntéseinket. Ehhez visszalépünk egy elôzô döntéshez, majd másik irányban keressük tovább a megoldást. Visszalépéses keresés rekurzióval Útkeresés a labirintusban. Van rövidebb út is a bejárattól a kijáratig? Példaként tekintsük a kijárat keresését egy labirintusban. Minden egyes elágazásnál kiválasztjuk, hogy melyik irányba haladjunk tovább. Ha zsákutcába jutunk (vagy körbeértünk), akkor visszatérünk egy elôzô elágazáshoz, ahonnan másik irányba tudunk indulni. Az egyszerûség kedvéért a labirintust egy MaxSor sorból és MaxOszlop oszlopból álló, négyzetrácsos táblának tekintjük, melynek bizonyos mezôit falak foglalják el. A bal felsô cellából kell indulnunk, és a jobb alsó cellánál van a kijárat. Közben csak jobbra vagy lefelé léphetünk. Megoldásunk könnyen általánosítható tetszôleges labirintusra. A táblát kétdimenziós, karakter típusú tömbben tároljuk. A falat X-szel, a szabad utat szóközzel jelezzük. Egyszerûbb lesz a lehetséges lépésirányok kiválasztása, ha a 0. sorba és oszlopba, illetve a MaxSor+1 sorba és a MaxOszlop+1 oszlopba szintén X-et írunk. A felderített úthoz tartozó cellákat pedig O-val jelöljük. A táblázat egy cellájára érkezve a következô algoritmust követjük. Megpróbálunk jobbra lépni, ameddig csak lehet, majd megpróbálunk lefelé lépni, ameddig csak lehet. Ha megakadtunk, akkor visszalépünk az elsô olyan cellára, ahonnan még tudunk ki nem próbált irányba továbbhaladni. Az út kiírása miatt a visszalépésnél szabaddá tesszük azokat a cellákat, melyek zsákutcába vezettek. A táblát és a MaxSor, MaxOszlop változókat modulszinten deklaráljuk. Így csökkentjük az útkeresô eljárás paramétereinek számát. A továbblépést az útkeresô eljárás rekurzív hívásával végezzük. Ügyeljünk arra, hogy a paramétereket cím szerint adjuk át, mert az eljárás módosítja az értéküket: 186

29. Visszalépéses keresés 1. Tábla(Sor, Oszlop) = O bejelöljük, hogy elértük ezt a cellát HA NEM Kész ÉS Tábla(Sor, Oszlop+1) == AKKOR jobbra lépünk Útkeresés(Sor, Oszlop+1, Kész) HA NEM Kész ÉS Tábla(Sor+1, Oszlop) == AKKOR lefelé lépünk Útkeresés(Sor+1, Oszlop, Kész) HA NEM Kész AKKOR visszalépünk Tábla(Sor, Oszlop) = felszabadítjuk a cellát (a kiírás miatt) HA Tábla(Sor, Oszlop 1) == O AKKOR Oszlop = Oszlop 1 balról jöttünk Sor = Sor 1 fentrôl jöttünk A rekurziót a Sor = 1, Oszlop = 1, Útkeresés(Sor, Oszlop, Kész) utasításokkal indítjuk el. 1. gyakorlat. Írjuk meg az útkeresést végzô programot! Jelenítsük meg a labirintust és a kijárathoz vezetô utat! Teszteléshez felhasználhatjuk a forrásfájlok között található Útkeresés1-4.txt állományokat. Gondoljuk át alaposan az algoritmust! Mi történik egy rekurzív hívásból való visszatérés után? Honnan tudjuk a végén, hogy eljutottunk-e a kijárathoz? Módosul-e a Kész változó értéke a feltételes elágazásokban? Mi történne, ha a három elágazást egy többágú szelekcióba vonnánk össze (Egyébként ágakkal)? Miért kell a visszalépésnél felszabadítani a cellát? A program módosításával és futtatásával ellenôrizzük válaszainkat! Futtassuk a programot úgy is, hogy az eljárás elején (tehát minden egyes hívásnál) kirajzoljuk az addig bejárt utat! Így figyelemmel kísérhetjük a visszalépéseket. Visszalépéses keresés iterációval Az útkeresés elsô néhány próbálkozása Készítsük el az útkeresés iteratív algoritmusát! A rekurzív hívások egymásutánját ciklussal helyettesítjük. A ciklusmagot addig ismételjük, amíg el nem jutunk a célig, vagy már nincs lehetôségünk a további visszalépésre (a legelsô celláról kellene visszalépnünk). Ez utóbbi feltételt a rekurzív algoritmusban azért nem vizsgáltuk, mert a hívásokból való visszatérés automatikusan leállította a rekurziót, ha nem találtunk megoldást. Mivel elöltesztelô ciklust használunk, a Kész változó értékét a ciklus elôtt és a ciklus végén is meghatározzuk. A visszalépések során pedig ügyelnünk kell arra, hogy tiltsuk le az aktuális cellát, többet ide ne lépjünk. Egyébként végtelen ciklusba kerülnénk. A tiltást egy speciális karakterrel, például egy - jellel fejezzük ki. Az algoritmus egyébként pontosan megfelel a rekurzív megoldásnak: 187

CIKLUS AMÍG NEM Kész ÉS Sor 1 ÉS Oszlop 1 Tábla(Sor, Oszlop) = O bejelöljük, hogy elértük ezt a cellát HA Tábla(Sor, Oszlop+1) == AKKOR jobbra lépünk Oszlop = Oszlop + 1 HA Tábla(Sor+1, Oszlop) == AKKOR lefelé lépünk Sor = Sor + 1 visszalépünk Tábla(Sor, Oszlop) = - letiltjuk a cellát, hogy még egyszer ne jöjjünk erre HA Tábla(Sor, Oszlop 1) == O AKKOR Oszlop = Oszlop 1 balról jöttünk Sor = Sor 1 fentrôl jöttünk HA Kész AKKOR Tábla(Sor, Oszlop) = O Az eljárást a Sor = 1, Oszlop = 1, Útkeresés(Sor, Oszlop, Kész) utasításokkal hívhatjuk. 2. gyakorlat. Írjuk meg az útkeresés iteratív programját! Az 1. gyakorlathoz hasonlóan jelenítsük meg a megoldást! Hasonlítsuk össze az algoritmust a rekurzív megoldással! Miért nem vizsgáltuk meg az elágazások feltételeiben a Kész változó értékét? Mi történne, ha többágú szelekció helyett egymás utáni feltételes elágazásokat alkalmaznánk (a rekurzív megoldáshoz hasonlóan)? Miért volt szükség a ciklus után a Tábla(Sor, Oszlop) cella bejelölésére? Mi történne, ha nem írnánk - jelet a visszalépés elôtt az aktuális cellába? A program módosításával és futtatásával ellenôrizzük válaszainkat! A keresés általánosítása Az elôzôekben nagyon egyszerû adatszerkezettel ábrázoltuk a labirintust. Az útkeresés általánosításához célszerû a karakterként kezelt cellák jellemzôit struktúrában (rekordban) tárolni. Logikai változókban feljegyezzük, hogy fal van-e a cella helyén, továbbá, hogy jobbra, illetve lefelé léphetünk-e a celláról. Sztringként tároljuk azt az irányt, ahonnan a cellára léptünk (balról, illetve fentrôl): STRUKTÚRA TCella VÁLTOZÓ Fal, Jobbra, Le MINT Logikai VÁLTOZÓ Honnan MINT Sztring STRUKTÚRA VÉGE A labirintus egy cellájához tartozó mezôk értéke 188

A labirintust most is egy kétdimenziós tömb tartalmazza, minden szélén egy-egy többletsorral, illetve -oszloppal, melyek celláit falként kezeljük. A tömbelemek TCella típusúak. A mezôk értékét a labirintus beolvasásánál kell megadni. Az algoritmus apró változtatásoktól eltekintve megfelel az elôzô szakaszban bemutatott eljárásnak: CIKLUS AMÍG NEM Kész ÉS Sor 1 ÉS Oszlop 1 HA Tábla(Sor, Oszlop).Jobbra AKKOR jobbra lépünk Tábla(Sor, Oszlop).Jobbra = Hamis többet innen ne lépjünk jobbra Oszlop = Oszlop + 1 Tábla(Sor, Oszlop).Honnan = Balról HA Tábla(Sor, Oszlop).Le AKKOR lefelé lépünk Tábla(Sor, Oszlop).Le = Hamis többet innen ne lépjünk lefelé Sor = Sor + 1 Tábla(Sor, Oszlop).Honnan = Fentrôl visszalépünk HA NEM Tábla(Sor, Oszlop+1).Fal AKKOR Tábla(Sor, Oszlop).Jobbra = Igaz HA NEM Tábla(Sor+1, Oszlop).Fal AKKOR Tábla(Sor, Oszlop).Le = Igaz HA Tábla(Sor, Oszlop).Honnan == Balról AKKOR Oszlop = Oszlop 1 balról jöttünk Sor = Sor 1 fentrôl jöttünk Ezt az eljárást is a Sor = 1, Oszlop = 1, Útkeresés(Sor, Oszlop, Kész) utasításokkal indíthatjuk. Az algoritmus felírásánál ügyeljünk az utasítások sorrendjére a feltételes elágazásokban! Hasonlítsuk össze az eljárást az elôzô szakaszban bemutatott algoritmussal! Melyik utasítást helyeztük át és miért? Szükség van-e a Jobbra, illetve a Le mezôk hamisra állítására a feltételes elágazásokban? 3. gyakorlat. Írjuk meg struktúra alkalmazásával az útkeresés programját! A keresés után a bejárattól a kijáratig vezetô utat a Honnan mezôk segítségével kapjuk meg. A kijárattól indulva a mezôk értéke szerint lépegetünk visszafelé, amíg csak el nem jutunk a bejáratig: Sor = MaxSor, Oszlop = MaxOszlop CIKLUS AMÍG NEM (Sor == 1 ÉS Oszlop == 1) ELÁGAZÁS Tábla(Sor, Oszlop).Honnan SZERINT Balról ESETÉN Ki: Lépés jobbra, Oszlop = Oszlop 1 Fentrôl ESETÉN Ki: Lépés lefelé, Sor = Sor 1 A ciklus fordított sorrendben írja ki a lépéseket. Egy verem felhasználásával a sorrend könnyen visszafordítható. 4. gyakorlat. Bôvítsük a 3. gyakorlat programját a lépések kiírásával! 29. Visszalépéses keresés 1. Az út felderítése a céltól a startig 189

Útkeresô algoritmusunkat némileg egyszerûsíthettük volna, de fenti formájában könnyen általánosítható. Bôvítésével például engedélyezhetjük a négyirányú mozgást. Ha egy celláról négyféle irányba is továbbléphetünk, akkor az irányok logikai értékét célszerû tömbben tárolni. Ekkor a következô lépésirányt ciklussal kereshetjük meg. Az összes út meghatározása A visszalépéses keresésre vonatkozó feladatok egy része az összes lehetséges megoldás meghatározását igényli. Ehhez becsapjuk a fenti algoritmust. Ha elérkeztünk egy megoldáshoz, akkor még a cikluson belül kiíratjuk, majd visszalépünk. Ezzel arra kényszerítjük a programot, hogy egy további megoldást keressen. A ciklust csak akkor állítjuk le, ha már a legelsô mezôrôl kellene visszalépnünk: ELJÁRÁS ÖsszesÚt(VÁLTOZÓ Sor, Oszlop MINT Egész, VÁLTOZÓ Kész MINT Logikai) CIKLUS AMÍG Sor 1 ÉS Oszlop 1 HA Sor == MaxSor ÉS Oszlop == MaxOszlop AKKOR találtunk egy megoldást Ki: Út Visszalép(Sor, Oszlop) HA Tábla(Sor, Oszlop).Jobbra AKKOR jobbra lépünk (lásd az elôzô szakaszt) HA Tábla(Sor, Oszlop).Le AKKOR lefelé lépünk (lásd az elôzô szakaszt) Visszalép(Sor, Oszlop) Mivel a visszalépés két helyen is elôfordul, külön eljárással végezzük. Az utasítások pontosan megfelelnek az elôzô szakasz algoritmusának: ELJÁRÁS Visszalép(VÁLTOZÓ Sor, Oszlop MINT Egész) HA NEM Tábla(Sor, Oszlop+1).Fal AKKOR Tábla(Sor, Oszlop).Jobbra = Igaz HA NEM Tábla(Sor+1, Oszlop).Fal AKKOR Tábla(Sor, Oszlop).Le = Igaz HA Tábla(Sor, Oszlop).Honnan == Balról AKKOR Oszlop = Oszlop 1 balról jöttünk Sor = Sor 1 fentrôl jöttünk 5. gyakorlat. Írjunk programot, amely meghatározza az összes lehetséges utat a bejárattól a kijáratig! A visszalépéses keresés algoritmusa természetesen nem csak a labirintusokra alkalmazható. Különbözô játékok, stratégiai feladatok és más problémák is megoldhatók a segítségével. 190