150 likes | 264 Views
Program ozási módszerek Backtracking (Visszalépéses keresés) Általános bemutató. L énárt Szabolcs Páll Boglárka. Alkalmazási terület.
E N D
Programozási módszerekBacktracking(Visszalépéses keresés)Általános bemutató Lénárt Szabolcs Páll Boglárka
Alkalmazási terület • azon feladatok megoldásakor alkalmazható, amelyeknek eredményét az M1M2 ... Mn Descartes-szorzatnak azon elemei alkotják, amelyek eleget tesznek bizonyos belső feltételeknek. • M1M2 ... Mn Descartes-szorzatot a megoldások terének nevezzük.
1. Példa • Példa:Irassuk ki az összes 6 / 49 lottón kisorsolható lehetséges eseteket! • Ebben az esetben a megoldás tere: [1 .. 49] x [1 .. 49] x [1 .. 49] x [1 .. 49] x [1 .. 49] x [1 .. 49] 6 23 5 18 46 33 egy lehetséges megoldás • A belső feltételek pedig: a számok mind különböznek egymástól
Megoldás: x x [1 .. 49] [1 .. 49] x [1 .. 49] x [1 .. 49] x [1 .. 49] [1 .. 49] kiválasztjuk az első számot az M1 halmazból kiválasztjuk a második számot az M2 halmazból kiválasztjuk a harmadik számot az M3 halmazból nem tesz eleget a belső feltételnek !!! nem tesz eleget a belső feltételnek !!! 1 1 1 ... kiválasztjuk az új második számot az M2 halmazból kiválasztjuk az új harmadik számot az M3 halmazból ... 2 3 eljutunk az első megoldásig 1 2 3 4 5 6
Megoldás:további megoldások megtalálása: 1 2 3 4 5 6 1 2 3 4 67 Ha elfogytak az elemek visszalépünkés változtatunk egyet az előzőleg betett elemen ( M4 halmazból választunk új elemet) Megint a megoldástér utolsó halmazának (itt M6) elemeit próbáljuk ki sorra A megoldástér utolsó halmazának (itt M6) elemeit próbáljuk ki sorra 1 2 3 568 ... 1 2 3 548 49 1 2 3 4 68 ... 1 2 3 4 649 1 2 3 4 5 7 1 2 3 4 5 8 1 2 3 4 5 9 1 2 3 4 5 10 ... 1 2 3 4 5 49 ... Ha elfogytak az elemek visszalépünk és változtatunk egyet az előzőleg betett elemen ( M5 halmazból választunk új elemet) 1 2 3 464748 1 2 3 4647 49 1 2 3 4648 49 1 2 3 474849 ... 1 2 3 4 4647 1 2 3 4 4648 1 2 3 4 4649 1 2 3 4 4748 1 2 3 4 4749 1 2 3 4 4849 Ha elfogytak az elemek visszalépünk és változtatunk egyet az előzőleg betett elemen ( M5 halmazból választunk új elemet) Eljutunk az utolsó megoldáshoz: 44 45 46 47 48 49
2. Példa • Példa: Keressük meg az összes olyan pontosan háromjegyű szigorúan pozitívtermészetes számot, amelyek számjegyeinek összege kisebb 15-nél, illetve a számjegyek szorzata nullától különböző páros szám. • Ebben az esetben a megoldás tere: {1,2,3…,9} x {1,2,3…,9} x {1,2,3…,9} • A belső feltételek pedig: Számjegyei összege kisebb legyen 15-nél és a számjegyek szorzata pedig páros szám legyen.
Megoldás: x x [1 .. 9] [1 .. 9] [1 .. 9] kiválasztjuk az első számot az M1 halmazból kiválasztjuk a második számot az M2 halmazból kiválasztjuk a harmadik számot az M3 halmazból nem tesz eleget a belső feltételnek !!! 1 1 1 kiválasztjuk az új harmadik számot az M3 halmazból 2 eljutunk az első megoldásig 1 1 2
Megoldás:további megoldások megtalálása: 1 1 2 1 21 Ha elfogytak az elemek visszalépünkés változtatunk egyet az előzőleg betett elemen ( M1 halmazból választunk új elemet) Megint a megoldástér utolsó halmazának (itt M3) elemeit próbáljuk ki sorra A megoldástér utolsó halmazának (itt M3) elemeit próbáljuk ki sorra 1 22 1 23 ... 1 29 2 1 1 ... 9 4 1 1 1 4 1 1 6 1 1 8 Ha elfogytak az elemek visszalépünk és változtatunk egyet az előzőleg betett elemen ( M2 halmazból választunk új elemet) ... Ha elfogytak az elemek visszalépünk és változtatunk egyet az előzőleg betett elemen ( M2 halmazból választunk új elemet) 1 4 1 1 42 ... 1 49 Eljutunk az utolsó megoldáshoz: 9 4 1
A módszer bemutatása • A visszalépéses keresés nem generálja a Descartes-szorzat minden x = (x1, x2, ..., xn) M1M2 ... Mn elemét, hanem csak azokat, amelyek esetében remélhető, hogy megfelelnek a belső feltételeknek. • Igy csökkenthetjük a próbálkozások számát. • Az eredményt általában egy tömbbe tároljuk. A 1.példánk esetében a megoldást egy hatelemes tömbbe fogjuk tárolni. var szam:array[1..6] of 1..49;
A módszer bemutatása • Az algoritmusban a tömb elemei egyenként kapnak értékeket: • xi számára csak akkor „javasolunk értéket”, ha x1, x2, ..., xi–1 már kaptak értéket az aktuálisan generált eredményben. • Az xi-re vonatkozó „javaslat”-ot akkor fogadjuk el, amikor x1, x2, ..., xi–1 értékei az xi értékével együtt megvalósítják a belső feltételeket. • Ha az i-edik lépésben a belső feltételek nem teljesülnek, xiszámára új értéket választunk az Mihalmazból.
A módszer bemutatása • Ha az Mihalmaz minden elemét kipróbáltuk, visszalépünk az i–1-edik elemhez, amely számára új értéket „javasolunk” az Mi–1 halmazból • Ha az i-edik lépésben a belső feltételek teljesülnek, az algoritmus folytatódik ha teljesülnek a folytatási feltételek és akkor az xi+1-nek adunk értéket (példa: nem generáltuk mind a három számjegyet), különben a végeredményhez jutunk.
Algoritmus (rekurzív megközelítés) Algoritmus Rekurzív_Backtracking(i): Minden mj eleme Miértékre végezd el: xi := mj Ha Megfelel(i) akkor {ha megfelel a belső feltételeknek} Ha i < n akkor{ha meg van folytatas} Rekurzív_Backtracking(i+1) {tovabblepek a kovetkezo elemhez} különben{ha a vegere ertem} Ki: x1, x2, ..., xn{eredmeny kiirasa} vége(ha) vége(ha) vége(minden) Vége(algoritmus)
Algoritmus (rekurzív megközelítés) Algoritmus Megfelel(i): Megfelel:= igaz Haa belső feltételek x1, x2, ..., xi esetében nem teljesülnekakkor Megfelel :=hamis vége(ha) Vége(algoritmus)