Professional Documents
Culture Documents
Problema celor opt dame, asezate pe o tabla de 8x8, cunoscuta la nivel mondial ca si The 8 Puzzle Queens, problema standard, consta in asezarea a opt dame pe table 8x8, care nu trebuie sa se atace intre ele. Pentru a gasi solutia corecta, nu trebuie sa existe doua dame pe aceasi linie, coloana, sau diagonala.
Istoric: Problema a fost prima data propusa in 1848 de catre jucatorul de sah Max Bezzel si peste cativa ani de mai multi matematiceni printre care si Johann Carl Friedrich Gauss care a lucrat la acesta problema si la problema generala. Prima solutie a fost gasita de Franz Nauck in 1850. Tot Nauck a generalizat problema. In 1874, S. Gunther a propus o metoda de gasire a solutilor folosind determinantul. Edsger Dijkstra a folosit aceasta problema in 1972 pentru a ilustra ceea ce noi numim structura de programare. El a publicat o descriere foarte detaliata a primului algoritm de backtracking. Aflarea solutiei: Problema pare destul de complicata, fiind 4.426.165.368 de cazuri posibile de a pune cele opt dame pe tabla de 8x8 si doar 92 de soluti corecte. Dintre cele 92 de solutii, exista doar 12 cazuri unice sau fundamentale. Caz 1
a b c d e f g h
X X X X
Caz 2.
8 a b c d e f g h X 7 X 8 6 X 7 X 5 X 6 4 X 5 X 3 X 4 2 X 3 X 1 X 2 X 1
Caz 3.
a b C d e f g h
X X X
Caz 4.
8 a b c d e f g h 7 X 8 X 6 X 7 5 X 6 X 4 X 5 X 3 X 4 X 2 X 3 1 X 2 X 1
Caz 5.
a b c d e f g h
X
8 X 7 X 6 5 X 4 X 3 X 2 1
Caz 6.
a b c d e f g h
X X X X X X X X X
8 7 X 6 5 X 4 3 X 2 1
Caz 7. Caz 8.
a b c d e f g h
8 X 7 a b c d e f g h 6 X 8 5 X 7 4 X 6 X 3 X 5 X 2 X 4 1 X 3 X 2 X 1
Caz 9.
a b c d e f g h
X
8 X 7 X 6 5 X 4 X 3 X 2 1
Caz 10.
a b c d e f g h
X X X X X X
Caz 11.
8 7 X 6 5 4 X 3 2 1
a b c d e f g h
X X
X X
8 X 7 a b c d e f g h 6 X 8 X 5 X 7 X 4 X 6 3 X 5 X 2 X 4 1 X 3 X 2 X 1
Caz 12.
1.Stiva: Stiva este o list pentru care singurele operaii permise sunt: adugarea unui element in stiv; eliminarea, consultarea sau modificarea unui element introdus in stiv;
Stiva funcioneaz pe principiul LIFO (Last In First Out) - ultimul intrat, primul ieit. Atenie: adugarea sau scoaterea unui element din stiv se face prin acelai capt, numit vrful stivei
1. Pentru a scoate farfuria roie trebuie s scoatem toate farfuriile aflate deasupra acesteia. 2. Acum putem extrage farfuria roie. 2. Exemplificarea lucrului cu stiva: 1. n stiva iniial vid se introduce elementul A i vrful stivei va fi nivelul 1 (k=1). 2. Introducem n stiv elementul B, deci vrful stivei va fi nivelul 2 (k=2). 3. Vrem s scoatem din stiv elementul A. Se procedeaz n felul urmtor: scoatem din stiv elementul B, deoarece A nu se poate scoate deocamdat. Vrful stivei devine nivelul 1 (k=1). 4.Scoatem din stiv pe A. 3.Tehnica backtracking: Exist clase de probleme pentru care algoritmii se proiecteaz dup o anumit metod de programare. Putem privi metoda de programare ca un ablon pe care l putem aplica pentru rezolvarea unor clase de probleme cu un specific comun.
Tehnica backtracking se folosete n rezolvarea problemelor care au urmtoarele caracteristici: - soluia lor poate fi pus sub forma unui vector: S= s1 s2 .... sn unde s1S1, s2S2.... snSn - mulimile S1, S2... Sn sunt mulimi finite, iar elementele lor se afl intr-o relaie de ordine bine stabilit. - nu avem la dispoziie o alt metod mai rapid. Important: - nu n toate problemele n este cunoscut de la nceput; - S1,S2,....Sn, pot fi la rndul lor vectori; - n multe probleme, S1,S2,...Sn coincid; - tehnica backtracking are ca rezultat obinerea tuturor soluiilor problemei. De aceea dac se dorete o singur soluie, trebuie forat oprirea algoritmului. Am artat c soluiile se genereaz sub form de vector. Considerm c acest vector este prelucrat ca o stiv. Notm vectorul stiv cu st i n este dimensiunea acesteia. Vectorul st format din elementele (st[1], st[2],..., st[n]) aparinnd S1 x S2 x ... x Sn se numete soluie final. Mulimea finit S = S1 x S2 x ... x Sn se numete mulimea soluiilor posibile. ntre elementele vectorului stiv st exista anumite relaii. Aceste relaii le vom numi condiii de validare. Vom spune despre st[1], st[2],..., st[k] c reprezint o soluie valid dac i numai dac sunt ndeplinite condiiile de validare ale problemei. O soluie valid devine soluie final dac numrul k al nivelului n stiv este egal cu n (dimensiunea stivei).
4. Exemplu practic: aranjarea mobilei ntr-o cas: Un exemplu practic de utilizare a unui algoritm backtracking l constituie problema aezrii mobilei ntr-o cas nou.
Exist multe posibiliti de ncercare dar n mod practic doar cteva vor fi luate n considerare. Pornind de la punctul iniial cnd casa este goal, fiecare pies de mobil este plasat n anumite locuri.
Dac toat mobila este aranjat i proprietarul este mulumit atunci algoritmul se ncheie. Dac ne vom lovi de situaia n care la un moment aranjamentul parial obinut este neplcut, suntem nevoii s renunm la poziia pe care am plasat ultima pies i s ncercm o alt amplasare a ei. Dac nu vom gsi o variant satisfctoare, continum s renunm i la poziia penultimei piese aezate, cutndu-i o alt poziie i aa mai departe. n situaia n care am renunat la toate variantele atunci nu exist nici un aranjament convenabil, deci problema nu are soluii.
n caz contrar, o s obinem soluia problemei. Trebuie menionat c algoritmul nu genereaz toate variantele posibile de aranjamente. Plasarea unei piese nu va fi fcut direct n toate locurile disponibile din cas. De exemplu, varianta de a aeza biblioteca n buctrie nu va fi luat n considerare. Multe asemenea variante vor fi abandonate din start deoarece conduc la obinerea unor aranjamente neplcute. 5. Metoda backtracking va folosi o serie de proceduri i funcii care vor fi folosite totdeauna cu acelai nume i aceiai parametri: procedure init(k, st); Rol: atribuie elementului situat pe nivelul k o valoare iniial Parametri: k - nivelul in stiv st - stiv procedure succesor(k, st, as); Rol: atribuie elementului st[k] din stiv valoarea urmtoare din mulimea Sk Parametri:
as - variabil boolean care ntoarce valoarea adevrat dac elementul situat pe nivelul k are succesor st - stiv k - nivelul in stiv procedure validare(k, st, ev); Rol: verific dac elementul pus pe nivelul k n stiv ndeplinete restriciile ntre elementele distinctive Parametri: k - nivelul in stiv st - stiv ev - variabil boolean care ntoarce valoarea adevrat dac elementul situat pe nivelul k este valid sau nu function solutie(k): boolean; Rol: verific dac s-au determinat toate elementele din stiv ce constituie vectorul soluie al problemei Parametri: k - nivelul in stiv procedure tipar; Rol: listeaz soluia determinat
6. Generarea permutrilor Un creator de mod a pregtit trei melodii pentru a crea ambientul muzical n timpul prezentrii ultimei sale colecii, dar nc nu s-a hotrt exact n ce ordine s le pun. El te roag s-i generezi toate succedrile posibile, astfel ncat s o poat asculta pe fiecare i s-o aleag pe cea mai potrivit. Observaie: - prima melodie o notm cu 1; - a doua melodie o notm cu 2; - a treia melodie o notm cu 3; - o succedare este valid cnd melodiile ce o compun sunt diferite ntre ele. k<-1 init(k,st) while k<0 do { repeat { succesor (k,st,as) if as then validare ( k,st,ev) until (not as) or (as and ev)
} if as then { if solutie(k) then tipar { else k<-k+1 init(k,st) } else k<-k-1 } } 7. Problema generrii aranjamentelor: n continuare v propunem urmtorul joc: folosindu-v de algoritmul prezentat anterior n problema creatorului de mod, suntei invitai s generai aranjamentele de trei elemente luate cte dou. Tot ce trebuie s facei e s umplei nivelul n stiv cu elementul corespunztor. Elementele le "luai" din mulimea din partea dreapt a ecranului i le "lsai" n nivelul corespunztor din stiv. n partea de jos a ecranului avei punctajul obinut. Observaie: elementul 0 este folosit pentru iniializarea nivelului k din stiv. 8. Problema damelor la general: S se gseasc toate modalitaile de a aranja n dame pe o tabl de ah de dimensiuni n x n, astfel nct ele s nu se atace una pe alta. Dou dame se atac dac ele se afl pe aceeai linie, pe aceeai coloana sau pe aceeai diagonala. Aceat problema fuctioneaza doar pentru n=1 sau n>=4. De exemplu, daca n=4, o solutie este reprezentata in figuria a.modul de obtinere al solutiei este prezent in figurile urmatoare, de la b la i. a)
x x x x
b)
c)
x x
d)
x x
e)
x x x
f)
g)
h)
x x x
i)
x x x x
Comentarii referitoare la figurile anterioare. b) Observam ca dama trebuie sa fie plasata singura pe linie. Prozitionam prima dama pe linia 1,coloana1. c) A doua dama nu poate fi asezata decat in coloana 3. d) Observam ca a treia dama nu poate fi plasata in linia 3.Incercam atunci plasarea celei de-a doua dame in coloana 4. e) A treia dama nu poate fi plasata decat in coloana 2. f) In aceasta situatie dama a patra nu mai poate fi asezata. Incercand sa avansam cu dama a treia , observam ca nu este posibil sa plasam nici in coloana a-3-a, nici in coloana a4-a, deci o vom scoate de pe tabla. Dama a doua nu mai poate avansa, deci si ea este scoasa de pe tabla .Avansam cu prima dama in coloana a-2-a. g) A doua dama nu poate fi asezata decat in coloana a-4-a. h) Dama a treia se aseaza in prima coloana. i) Acum este posibil sa plasam a patra data in coloana 3 si astfel am obtinut o solutie a problemei. Algoritmul continua in acest mod pana cand trebuie scoasa de pe tabla prima dama. Pentru cautarea si reprezentarea unei solutii folosim un vector cu n componente,numit sol.Prin sol[i] intelegem coloana in care se gaseste dama de pe linia i. Solutia cu ajutorul vectorului sol.
Doua dame se gasesc pe aceeasi diagiagonala daca si numai daca este indeplinita conditia: | sol(i)-sol(j) | =| i-j |
x x
x x
Intrucat doua dame nu se pot gasi in aceeasi coloana, rezulta ca o solutie este sub forma de premutare. O prima idee ne conduce la generarea tuturor permutarilor si la extragerea solutilor pentru problema. Daca procedam astfel , inseamna ca nu lucram conform strategiei backtracking. Acesta ca inediat ce gasim doua dame care se ataca , sa reluam cautarea in alte conditii. Fata de programul de n dame are o singura conditie suplimentara, in suprogramul valid. Int valid(int k) { for(int i=1;i<k;i++) if(sol[k]==sol[i]) return 0; return 1; } Problema este un exemplu folosit in mai toate lucrarile in care este prezentata metoda backtracking. Numar dame Solutii unice 1 1 2 0 3 0 4 1 5 2 6 1 7 6 8 12 9 46 10 92 11 341 12 1.787
10
40
92
352
724
2.680
14.200
14 45.752 365.596
24 28.439.272.956.934 227.514.171.973.736
25 275.986.683.743.434 2.207.893.435.808.352
26 2.789.712.466.510.289 22.317.699.616.364.044
Bibliografie
Manualul de informatica, cls. aXIa http://info.mcip.ro/?t=back http://www.scribd.com/doc/8066145/Metoda-Backtracking http://www.scritube.com/stiinta/informatica/Metode-deprogramare3424121010.php