Lénárt Szabolcs Páll Boglárka Programozási módszerek Backtracking (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 M1 M2 ... Mn Descartes-szorzatnak azon elemei alkotják, amelyek eleget tesznek bizonyos belső feltételeknek. M1 M2 ... 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 2 3 eljutunk az első megoldásig 1 2 3 4 5 6 [1 .. 49] [1 .. 49] [1 .. 49] x [1 .. 49] x [1 .. 49] x [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 6 7 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 5 6 8 ... 1 2 3 5 48 49 1 2 3 4 6 8 ... 1 2 3 4 6 49 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 46 47 48 1 2 3 46 47 49 1 2 3 46 48 49 1 2 3 47 48 49 ... 1 2 3 4 46 47 1 2 3 4 46 48 1 2 3 4 46 49 1 2 3 4 47 48 1 2 3 4 47 49 1 2 3 4 48 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) 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ív termé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 2 eljutunk az első megoldásig 1 1 2 [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 2 1 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 2 2 1 2 3 ... 1 2 9 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 4 2 ... 1 4 9 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) M1 M2 ... 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, xi számára új értéket választunk az Mi halmazból.
A módszer bemutatása Ha az Mi halmaz 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(minden) Vége(algoritmus)
Algoritmus (rekurzív megközelítés) Algoritmus Megfelel(i): Megfelel := igaz Ha a belső feltételek x1, x2, ..., xi esetében nem teljesülnek akkor Megfelel := hamis vége(ha) Vége(algoritmus)