BACKTRACKING Visszalépéses keresés

Hasonló dokumentumok
Visszalépéses kiválogatás

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

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

Informatikai tehetséggondozás:

Informatikai tehetséggondozás:

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

Visszalépéses keresés

Felvételi tematika INFORMATIKA

25. évfolyam 3. szám. Fizika InfoRmatika Kémia Alapok. Kiadó. Levélcím Cluj, C. P. 1/140. Erdélyi Magyar Műszaki Tudományos Társaság

INFORMATIKA javítókulcs 2016

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

Algoritmusokfelülnézetből. 1. ELŐADÁS Sapientia-EMTE

Adatszerkezetek II. 10. előadás

Mesterséges Intelligencia. Csató Lehel. Csató Lehel. Matematika-Informatika Tanszék Babeş Bolyai Tudományegyetem, Kolozsvár 2010/2011 1/363

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

2. Visszalépéses keresés

2018, Diszkrét matematika

INFORMATIKA tétel 2017

Számítógép és programozás 2

Informatikai tehetséggondozás:

24. szakkör (Csoportelméleti alapfogalmak 3.)

15. LINEÁRIS EGYENLETRENDSZEREK

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

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

Dinamikus programozás vagy Oszd meg, és uralkodj!

angolul: greedy algorithms, románul: algoritmi greedy

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

2. Visszalépéses stratégia

INFORMATIKA tétel 2019

Rakov(34125)= Rakov(12543)= Rakov(14532)= Rakov(54321)=-

1. ábra ábra

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

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

Gyakori elemhalmazok

Evolúciós algoritmusok

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

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

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

Rekurzív algoritmusok

Problémamegoldási stratégiák

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

38. A gráfalgoritmusok alkalmazása

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

Algoritmusok pszeudókód... 1

FÖLDPRÖGETŐK TERMÉSZETTUDOMÁNYOS HÁZIVERSENY IV. FORDULÓ - Sakk 5 6. évfolyam

8. Előadás. Megyesi László: Lineáris algebra, , oldal. 8. előadás Mátrix rangja, Homogén lineáris egyenletrendszer

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

Tartalomjegyzék Algoritmusok - pszeudókód

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.

Érdekes informatika feladatok

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

Gráfelméleti feladatok. c f

Gráfalgoritmusok ismétlés ősz

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

Kombinatorikai algoritmusok

1. Feladat: beolvas két számot úgy, hogy a-ba kerüljön a nagyobb

1. gyakorlat. Mesterséges Intelligencia 2.

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

Diszkrét matematika 2.C szakirány

5. Előadás. (5. előadás) Mátrixegyenlet, Mátrix inverze március 6. 1 / 39

SZAMOKKAL Egy algoritmus generálja növekvő sorrendben, kizárólag a 3, 5 és 7 számjegyeket használva, az összes n számjegyű számot.

Rakov(34125)= Rakov(12543)= Rakov(14532)= Rakov(54321)=-

Algoritmuselmélet 7. előadás

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

Kereső algoritmusok a diszkrét optimalizálás problémájához

Adatszerkezetek II. 1. előadás

Algoritmusok pszeudókód... 1

Totális Unimodularitás és LP dualitás. Tapolcai János

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

Kétszemélyes játékok Gregorics Tibor Mesterséges intelligencia

Koordinátageometria. M veletek vektorokkal grakusan. Szent István Egyetem Gépészmérnöki Kar Matematika Tanszék 1

3. Osztályok II. Programozás II

Kereső algoritmusok a diszkrét optimalizálás problémájához

Feladatmegoldási stratégiák

Válogatott fejezetek a logikai programozásból ASP. Answer Set Programming Kelemen Attila

Mohó algoritmusok. Példa:

Deníciók és tételek a beugró vizsgára

INFORMATIKA tétel 2018

1. Olvassuk be két pont koordinátáit: (x1, y1) és (x2, y2). Határozzuk meg a két pont távolságát és nyomtassuk ki.

BME MOGI Gépészeti informatika 5.

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

Web-programozó Web-programozó

Visszalépéses keresés korlátozással

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

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

Írjon olyan programot a standard könyvtár alkalmazásával, amely konzolról megadott valós adatokból meghatározza és kiírja a minimális értékűt!

értékel függvény: rátermettségi függvény (tness function)

INFORMATIKAI ALAPISMERETEK

VI. Felkészítő feladatsor

Összetett programozási tételek Rendezések Keresések PT egymásra építése. 10. előadás. Programozás-elmélet. Programozás-elmélet 10.

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

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

Permutációk véges halmazon (el adásvázlat, február 12.)

Diszkrét matematika 2.C szakirány

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

Algoritmusok bonyolultsága

Németh László Matematikaverseny, Hódmezővásárhely április 8. A osztályosok feladatainak javítókulcsa

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

Mesterséges intelligencia 3. laborgyakorlat

Struktúra nélküli adatszerkezetek

Átírás:

BACKTRACKING Visszalépéses keresés I. rész A wiki.prog.hu weboldal az alábbi leírással vezeti fel a visszalépéses keresés algoritmus bemutatását: A visszalépéses keresés (Backtracking) olyan esetekben használható, amikor a keresési tér fastruktúraként képzelhető el, amiben a gyökérből kiindulva egy csúcsot keresünk. Számtalan ilyen probléma található a labirintusokban történő útkeresés, bizonyos mintaillesztési feladatok, a könyvtárszerkezetben történő keresés, egyes logikai játékok (pl. Rubik-kocka) kirakása is visszavezethető erre a problémára. Az alábbi kétrészes cikksorozat egyfajta backtracking gondolkodásmódra igyekszik ráhangolni az olvasót. Bástyák/királynők: Legyen egy nxn méretű sakktábla: (1) helyezzünk el rajta, az összes lehetséges módon, n bástyát úgy, hogy ne üssék egymást; (2) helyezzünk el rajta, az összes lehetséges módon, n királynőt úgy, hogy ne üssék egymást. 1. ábra. Helyes királynő-elhelyezés 8 8-as sakktáblán Mielőtt megoldanánk a bástya/királynő feladatot, foglalkozzunk egy másik problémával. Kerékpár-zár: Emlékezzünk a klasszikus 4-pozíciós kerékpár-zárra (lásd a 2. ábrát). Mindegyik pozícióba valamelyik számjegy választható ki: 0, 1,, 9. A feladatunk az, hogy generáljuk az összes lehetséges 4 számjegyű kódvektort: (0,0,0,0), (0,0,0,1), (0,0,0,2),, (9,9,9,9). 12 2015-2016/3

2. ábra. 4-pozíciós kerékpárzár Úgy is fogalmazhatunk, hogy érdekel az összes (v 1,v 2,v 3,v 4 ) alakú vektor, ahol v i {0, 1,, 9}, i=1..4. Milyen algoritmust követhetünk? 1. pozíción: minden számjegyet egyszer állítunk be. (Az 1. szintre egyszer generáljuk a 0, 1,..., 9 számjegysort) 2. pozíción: minden 1. pozíciós számjegy mellé társítjuk, rendre, a teljes számjegysort. (A 2. szintre 10-szer generáljuk a 0, 1,..., 9 számjegysort) 3. pozíción: minden 1..2 pozíciós számjegypár mellé társítjuk, rendre, a teljes számjegysort. (A 3. szintre 10 2 -szer generáljuk a 0, 1,..., 9 számjegysort) 4. pozíción: minden 1..3 pozíciós számjegyhármas mellé társítjuk, rendre, a teljes számjegysort. (A 4. szintre 10 3 -szor generáljuk a 0, 1,..., 9 számjegysort) Ez az algoritmus megvalósítható 4 egymásba ágyazott minden ciklussal (a kódvektorokat az x[1..4] tömbben generáljuk). minden x[1] = 0,9 végezd minden x[2] = 0,9 végezd minden x[3] = 0,9 végezd minden x[4] = 0,9 végezd ki: x[1..4] //10 4 -szer hajtódik végre Általánosítsuk a Kerékpár-zár feladatot: generáljuk az összes n számjegyű kódvektort. Ez esetben az előző megközelítés nyilván nem működik, mert nem tudunk egymásba ágyazni ismeretlen darab minden ciklust. Mi hát a megoldás? A BACTRACKING (BT) stratégia! 2015-2016/3 13

BTd(x[],n,k) minden x[k] = 0,9 végezd ha k < n akkor BTd(x,n,k+1) különben kiír(x,n) vége BTd A módszer e rekurzív implementációja a következőképen foglalható össze: A BTd(x,n,k) rekurzív eljárás feladata, hogy generálja, az x[k..n] tömbszakaszon, az összes (v k, v k+1,, v n ) kódszakaszt. Egy eljárás-példány, a kapott feladatból csak annyit vállal személyesen be, hogy generálja az x[k] szintre a 0, 1,, 9 számjegyeket. o Azok a példányok, amelyeket k<n értékre hívtak meg, a (v k+1,, v n ) kódszakaszok generálását (k+1) szintű példányokra ruházzák át. (Minden x[k] érték mellé generáltatják, egy-egy BTd(x,n,k+1) rekurzív hívás révén, az x[(k+1)..n] tömbszakaszon, az összes (v k+1,, v n ) kódszakaszt). o A k=n értékre meghívott példányok feladata lesz a generált kódvektorok kiíratása, a kiír(x,n) eljárás révén. A BTd(x,n,1) példány (amelyet a fő-program/függvény hív meg) kapja feladatul, hogy generálja az összes n hosszú kódvektort. Ezen 1. szinten levő példány 10-szer hivatkozik majd 2. szintű példányokra, ezek pedig összes 10 2 -szer 3. szintűekre, és így tovább. Végül a 10 n-1 darab n. szintű példány mindegyike kiír tíz teljes kódot. Összesen 10 n kód jelenik meg a képernyőn. Megjegyzések: A módszert azért nevezik backtracking-nek, mert amennyiben befejeződött a kurrens szintű értéksor generálása, visszalép, hogy folytassa az időszakosan felfüggesztett előző szintűt. Vegyük észre, hogy a generált kódvektorok a {0, 1,, 9} halmaz n-szeres Descartes-szorzatának elemeit adják meg. (Ezért neveztük az eljárást BTdnek). A generált kódvektorokat n-szintes fastruktúraként is felfoghatjuk. A 0. szintű virtuális gyökérnek 10 első szintű fia van, ezek mindenikének tíz-tíz második szintű (összesen 10 2 ), és így tovább. Az n. szinten 10 n levele lesz a fának. Ha mindenik testvér csomópontsorhoz a 0, 1,, 9 számjegyeket rendeljük, akkor a fa 10 n gyökér-levél ága/útja egy-egy n hosszú kódvektort képvisel majd. Módosítsunk a Kerékpár-zár feladaton! Olyan, n hosszú kódvektorok érdekelnek, amelyek elemei az {1, 2,, n} halmazból vehetnek értékeket. Kössük ki azt is, hogy a kódok nem tartalmazhatnak identikus elemeket. Tömören fogalmazva, az {1, 2,, n} halmaz permutációi érdekelnek: (1, 2,, n),, (n, n-1,, 1). 14 2015-2016/3

Hogyan módosítsuk a BTd eljárást, hogy permutáció-generáló (BTp) legyen belőle? Nyilvánvaló, hogy ez esetben a minden ciklus, az x[k] tömbelemben, az 1, 2,, n értékeket kell, hogy generálja. Ha csak ennyit változtatnánk, akkor az {1, 2,, n} halmaz n-szeres Descartes-szorzatának elemeit kapnánk eredménynek. Hogyan zárhatjuk ki az identikus kódelemeket? Az x[k] tömbértéket csak akkor tekintjük úgy, mint amely ígéretesen bővíti az x[1..(k-1)] kód-prefixet, ha különbözik e szakasz mindegyik elemétől. Ennek vizsgálatát bízzuk az ígéretes(x,k) függvényre. Az ígéretes megnevezés azt sugallja, hogy amennyiben az x[k] érték összefér az x[1..(k-1)] tömbszakasz elemeivel (a generálandó megoldás-kódvektorokkal szemben támasztott belső tulajdonság értelmében; jelen esetben, hogy elemeik páronként különbözzenek), akkor, remélhetőleg, a bővített x[1..k] tömbszakasz egy megoldás-kódvektor-prefixet tárol. o Sajátos esetekben (ilyen a permutáció feladat is), ha az x[k] érték öszszefér az x[1..(k-1)] szakasszal, akkor a bővített x[1..k] szakasz garantáltan megoldás-kódvektor-prefixet tárol. Ilyenkor találóbb lehet a megfelelő függvénynév-azonosító használata. ígéretes(x[],k) minden i = 1,k-1 végezd ha x[i] == x[k] akkor return HAMIS return IGAZ vége ígéretes BTp(x[],n,k) minden x[k] = 1,n végezd ha ígéretes(x,k) akkor ha k < n akkor BTp(x,n,k+1) különben kiír(x,n) vége BTp Megjegyzések: Vegyük észre, hogy máris megoldottuk a Bástya feladatot. Minden permutáció egy-egy helyes bástyaelhelyezést kódol. A kiír(x,n)eljárásnak az (1,x[1]), (2,x[2]),, (n,x[n]) (sor,oszlop) koordinátákon kell a bástyákat elhelyeznie. Mi a teendőnk, amennyiben a helyes királynő elhelyezések érdekelnek? Csupán az ígéretes függvényt kell módosítanunk, hogy csak olyan permutációk generálódnak, ame- 2015-2016/3 15

lyek helyes királynő elhelyezést kódolnak. Tekintsük továbbra is úgy, hogy a tömbindexek sakktábla-sorokat, a tömbértékek pedig sakktábla-oszlopokat jelentenek. Mikor ígéretes egy x[k] érték? Ha a (k,x[k]) koordinátájú pozíciót nem ütik az (i,x[i]) pozíciókra (i=1..(k-1)) már elhelyezett királynők. Ennek plusz feltétele (a bástyafeltételhez képest), hogy a (k,x[k]) és (i,x[i]) koordinátájú pozíciók ne legyenek egyazon átlón: azaz a (k-i) sor-távolság ne legyen azonos a x[k]-x[i] oszlop-távolsággal. Íme, az n-királynő feladat megoldását implementáló backtracking algoritmus (BTkirálynő): ígéretes_királynő(x[],k) minden i = 1,k-1 végezd ha (x[i] == x[k]) vagy ((k-i) == x[k]- x[i] ) akkor return HAMIS return IGAZ vége ígéretes_királynő kiír_királynő(x[],n) minden i = 1,n végezd ki: i,x[i] vége kiír_királynő BTkirálynő(x[],n,k) minden x[k] = 1,n végezd ha ígéretes_királynő(x,k) akkor ha k < n akkor BTkirálynő(x,n,k+1) különben kiír_királynő(x,n) vége BTkirálynő Megjegyzések: Az {1, 2,, n} halmaz n-szeres Descartes-szorzatának elemeit ábrázoló fastruktúra úgy is felfogható, mint a megoldások keresési tere. Keressük azokat a gyökér-levél ágakat/utakat, amelyek helyes bástya/királynő elhelyezést kódoló vektoroknak felelnek meg. Ebből a megvilágításból az ígéretes függvény úgy tekinthető, mint amely révén leszűkítjük (megmetsszük) a keresési teret. Az alábbi ábrák az n=4 esetet teszik szemléletesebbé: 16 2015-2016/3

3. ábra. Helyes királynő elhelyezések 4x4-es sakktáblán 4. ábra. A 4-királynő feladathoz kapcsolódó keresési tér, mint fastruktúra Kátai Zoltán 2015-2016/3 17