150 likes | 367 Views
A backtracking módszer. XI. oszt ály. A backtracking nem rekurzív változata, azaz az iteratív alakja. p←1; st [p] ← 0; amíg p>0 végezd el kezdet ha < ha még létezik a p szinten ki nem próbált halmazelem > a kkor kezdet
E N D
A backtracking módszer. XI. osztály
A backtracking nem rekurzív változata, azaz az iteratív alakja p←1; st[p] ← 0; amíg p>0 végezd el kezdet ha<ha még létezik a p szinten ki nem próbált halmazelem> akkor kezdet st[p] ←<egy újabb érték a lehetséges megoldások halmazából> ha <megfelel(p) függvény igazat térít vissza>akkor ha<végső megoldáshoz értünk> akkor meghív kiír_vagy_elment_mátrixba_vagy_vektorba_vektor (p) különben kezdet p ←p+1; st[p] ←0; vége vége különben p ←p-1; vége
A backtracking nem rekurzív változata, azaz az iteratív alakja p←1; st[p] ← 0; amíg p>0 végezd el kezdet ha<ha még létezik a p szinten ki nem próbált halmazelem> akkor kezdet st[p] ←<egy újabb érték a lehetséges megoldások halmazából> ha <megfelel(p) függvény igazat térít vissza>akkor ha<végső megoldáshoz értünk> akkor meghív kiír_vagy_elment_mátrixba_vagy_vektorba_vektor (p) különben kezdet p ←p+1; st[p] ←0; vége vége különben p ←p-1; vége
A backtracking rekurzív változata Mindenpval <v1> -től<vn> -igvégezd el kezdet st[p]← pval ha<megfelel(p) függvény igazat térít vissza>akkor ha<végső megoldáshoz értünk> akkor meghív kiír_vagy_elment_mátrixba_vagy_vektorba_vektor (p) különben önmagát_hívja_meg_abktr(p+1) vége.
A backtracking rekurzív változata Mindenpval <v1> -től<vn> -igvégezd el kezdet st[p]← pval ha<megfelel(p) függvény igazat térít vissza>akkor ha<végső megoldáshoz értünk> akkor meghív kiír_vagy_elment_mátrixba_vagy_vektorba_vektor (p) különben önmagát_hívja_meg_abktr(p+1) vége.
Megválaszolandó kérdések • Honnan veszi a lehetséges részmegoldásokat, egy egy megoldás esetén? • Mikor jutunk egy megoldáshoz? • Mikor jó egy részmegoldás? • Hány megoldásra számíthatunk? Lehete meghatározni ezt előre? Hogyan? • Kell –e a megoldások halmazából optimálisat kiválasztani, vagy T tulajdonságuakat, vagy más utólagos műveletet végezni ezekkel, mely ezen megoldások összehasonlítását ígényli?
Vektorral dolgozunk, melynek vagy az elemeit, vagy az elemeinek az indexeit mentjük egy - egy verem szintre. Legfelső szint elemek elérési sorrendje Verem szerkezet Legalsó szint • De megtörténhet az is, hogy egy – egy veremszintre más - más vektor eleme kerül (vagy vektorban alvektor eleme), nem ugyan az a vektoré. Lásd a Descartes szorzatot is. • Ha mátrixból nyerjük, akkor a mátrix sora lesz a verem szintjeés az oszlopa a szintre kerülő elem értéke vagy egy másik mátrixot használunk a verem helyett, ahhoz, hogy bejelöljük azokat az elemeket, amiket egy megoldásba lehetséges jó részmegoldásként érintettünk már. Lásd a Labirintus feladatot.
Vegyel egy A4-es kockás lapot, rajzolj egy labirintust, úgy, hogy az utakat ábrázoló kockákat besatírozod halványan ceruzával. Majd rajzold le mégegyszer ugyanazt a labirintust és helyezd el a kiinduló pontba Bodrit, majd keresd meg, hány kivezető utat találhat, minden talált utat satírozd be különböző színnel.
Vegyel egy A4-es kockás lapot, rajzolj egy labirintust, úgy, hogy az utakat ábrázoló kockákat besatírozod halványan ceruzával. Majd rajzold le mégegyszer ugyanazt a labirintust és helyezd el a kiinduló pontba Bodrit, majd keresd meg, hány kivezető utat találhat, minden talált utat satírozd be különböző színnel. Hány utat találsz, tudod –e mindig előre? Bodri eljut mindig a csonthoz? Van –e kapcsolat a, közös a talált utak között? Hogyan találta meg az utat? Ird le a lépéseit Bodrinak. A különböző lépést külön sorszámmal tüntesd fel. http://prog.ide.sk/pas2.php?s=40
Mit helyettesítettünk egy egy csomóval? 12 11 10 Folytasd! 7 8 9 6 3 4 5 2 8 3 1 1
http://www.carol.ro/fisiere/file/Backtracking/12%20-%20Problema%20comis-voiajorului%20-%20implementare.swfhttp://www.carol.ro/fisiere/file/Backtracking/12%20-%20Problema%20comis-voiajorului%20-%20implementare.swf http://www.carol.ro/fisiere/file/Backtracking/13%20-%20Joc%20-%20Problema%20labirintului.swf http://www.carol.ro/fisiere/file/Backtracking/15%20-%20Problema%20labirintului%20-%20implementare.swf
A backtracking rekurzív változata a permutációra Alprogram bktr(p) {eljárás} Mindenpval 1-tőln -igvégezd el kezdet st[p]← pval hamegfelel(p) akkor hap=nakkor meghív kiír_vektor(p, st) különben bktr(p+1) vége. Algoritmusmegfelel(p) {függvény} megfelel:=igaz; Minden j 1-tőlp-1 -igvégezd el kezdet hast[p] = st[j] akkormegfelel:=hamis vége
A backtracking rekurzív változata a variációra Alprogram bktr(p) {eljárás} Mindenpval 1-tőln -igvégezd el kezdet st[p]← pval hamegfelel(p) akkor hap=kakkor meghív kiír_vektor(p, st) különben bktr(p+1) vége. Algoritmusmegfelel(p) {függvény} megfelel:=igaz; Minden j 1-tőlp-1 -igvégezd el kezdet hast[p] = st[j] akkormegfelel:=hamis vége Változás: csak a p=nváltozottp=k -ra
A backtracking rekurzív változata a variációra Alprogram bktr(p) {eljárás} Mindenpval 1-tőln -igvégezd el kezdet st[p]← pval hamegfelel(p) akkor hap=kakkor meghív kiír_vektor(p, st) különben bktr(p+1) vége. Algoritmusmegfelel(p) {függvény} megfelel:=igaz; Minden j 1-tőlp-1 -igvégezd el kezdet ha(st[p] <= st[j])akkormegfelel:=hamis vége Változás: 1. csak a p=nváltozottp=k -ra 2. (st[p] = st[j])feltétel változott (st[p] <= st[j]) -re