Programozási módszerek Backtracking (Visszalépéses keresés) Általános bemutató Lénárt Szabolcs Páll Boglárka
Programozási módszerekBacktracking(Visszalépéses keresés) Általános bemutató
Lénárt SzabolcsPá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:
[1 .. 49]
kiválasztjuk az első
számot az M1 halmazból
1
[1 .. 49]
kiválasztjuk a második
számot az M2 halmazból
1
x
nem tesz eleget a
belső feltételnek !!!
kiválasztjuk az új második
számot az M2 halmazból
2
[1 .. 49]
kiválasztjuk a harmadik
számot az M3 halmazból
1
x
nem tesz eleget a
belső feltételnek !!!
kiválasztjuk az új harmadik
számot az M3 halmazból
3
...
eljutunk az első megoldásig 1 2 3 4 5 6
...
x [1 .. 49] x [1 .. 49] x [1 .. 49]
Megoldás: további megoldások megtalálása:
1 2 3 4 5 6
1 2 3 4 5 71 2 3 4 5 81 2 3 4 5 91 2 3 4 5 10...1 2 3 4 5 49
A megoldástér utolsó halmazának (itt M6) elemeit próbáljuk ki sorra
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 4 6 7
1 2 3 4 6 8...1 2 3 4 6 49
Megint a megoldástér utolsó halmazának (itt M6) elemeit próbáljuk ki sorra
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 4 46 471 2 3 4 46 481 2 3 4 46 49 1 2 3 4 47 48 1 2 3 4 47 491 2 3 4 48 49
1 2 3 5 6 8...1 2 3 5 48 49
Ha elfogytak az elemek
visszalépünk és
változtatunk egyet az előzőleg betett elemen ( M4 halmazból választunk új elemet)
...1 2 3 46 47 481 2 3 46 47 491 2 3 46 48 491 2 3 47 48 49
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:
[1 .. 9]
kiválasztjuk az első
számot az M1 halmazból
1
[1 .. 9]
kiválasztjuk a második
számot az M2 halmazból
1
x [1 .. 9]
kiválasztjuk a harmadik
számot az M3 halmazból
1
x
kiválasztjuk az új harmadik
számot az M3 halmazból
2
eljutunk az első megoldásig 1 1 2
nem tesz eleget a
belső feltételnek !!!
Megoldás: további megoldások megtalálása:
1 1 2
1 1 4 1 1 61 1 8
A megoldástér utolsó halmazának (itt M3) elemeit próbáljuk ki sorra
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 2 1
1 2 21 2 3...1 2 9
Megint a megoldástér utolsó halmazának (itt M3) elemeit próbáljuk ki sorra
Ha elfogytak az elemek
visszalépünk és
változtatunk egyet az előzőleg betett elemen ( M2 halmazból választunk új elemet)
...
2 1 1...9 4 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)
Eljutunk az utolsó megoldáshoz:
9 4 1
1 4 11 4 2...1 4 9
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(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)