Referat Metoda Backtracking2.DOC
Mai jos puteti citi fragmente din
Referat Metoda Backtracking2.DOC si de asemenea puteti face
Download Referat Metoda Backtracking2.DOCCiteste fragmente din Referat Metoda Backtracking2.DOC
METODA BACKTRACKING
Stiva este acea formă de organizare a datelor (structură de date) cu
proprietatea că operaţiile de introducere şi scoatere a datelor se
fac în vârful ei.
Stivele se pot simula utilizând vectori.
Fie ST(i) un vector. ST(1), ST(2), ..., ST(n) pot reţine numai litere
sau numai cifre. O variabilă K indică în permanentă vârful stivei.
Exemplificăm, în continuare, modul de lucru cu stiva:
În stiva iniţial vidă se introduce litera A, vârful stivei va
fi la nivelul 1 (k-1);
introducem în stivă litera B, deci k va lua valoarea 2;
scoatem din stivă pe B (A nu poate fi scos);
scoatem din stivă pe A; stiva rămâne vidă
În mod practic la scoaterea unei variabile din stivă, scade cu 1
valoarea variabilei ce indică vârful stivei, iar atunci când scriem
ceva în stivă, o eventuală valoare reziduală se pierde:
Pe un anumit nivel se retine, de regulă, o singură informaţie
(literă sau cifră), însă este posibil; aşa cum va rezulta din
exemplele, prezentate în lucrare, să avem mai multe informaţii, caz
în care avem de a face cu stive duble, triple, etc.
Întreaga teorie a recursivităţii se bazează pe structura de tip
stivă.
Prezentarea tehnicii Backtracking
Această tehnică se foloseşte în rezolvarea problemelor care
îndeplinesc simultan următoarele condiţii:
- soluţia lor poate fi pusă sub forma unui vector S=x1,x2, ...,xn, cu
x1 € A1,
x2 € A2 …,xn € An
- mulţimile A1, A2 , …., An sunt mulţimi finite, iar elementele lor
se consideră că se află într-o relaţie de ordine bine stabilită;
- nu se dispune de o altă metodă de rezolvare, mai rapidă
- x1 x2 …, xn pot fi la rândul lor vectori;
- A1, A2 …, An pot coincide.
La întâlnirea unei astfel de probleme, dacă nu cunoaştem această
tehnică, suntem tentaţi să generăm toate elementele produsului
cartezian A1,A2 …,An si fiecare element să fie testat dacă este
soluţie. Rezolvând problema în acest mod, timpul de execuţie este
atât de mare, încât poate fi considerat infinit, algoritmul neavând
nici o valoare practică.
De exemplu, dacă dorim să generăm toate permutările unei mulţimi
finite A, nu are rost să generăm produsul cartezian AxAx.....xA,
pentru ca apoi, să testăm, pentru fiecare element al acestuia, dacă
este sau nu permutare (nu are rost să generăm 1.1,1.......1, pentru ca
apoi să constatăm că nu am obţinut o permutare, când de la a doua
cifră 1 ne puteam da seama că cifrele nu sunt distincte).
Tehnica Backtracking are la bază un principiu extrem de simplu:
- se construieşte soluţia pas cu pas: x1, x2 …,xn
- dacă se constată că, pentru o valoare aleasă, nu avem cum să
ajungem la soluţie, se renunţă la acea valoare şi se reia căutarea
din punctul în care am rămas.
Concret:
- se alege primul element x, ce aparţine lui A;
- presupunând generate elementele x1,x2 …,xk , aparţinând
mulţimilor A1,
A2 …,Ak , se alege (dacă există) xk+1 , primul element disponibil
din mulţimea Ak+1 , apar două posibilităţi :
1) Nu s-a găsit un astfel de element, caz în care caz în care se reia
căutarea considerând generate elementele x1,x2 …,xk+1 , iar
aceasta se reia de la următorul element al mulţimii Ak rămas
netestat;
2) A fost găsit, caz în care se testează dacă acesta îndeplineşte
anumite condiţii de continuare apărând astfel două posibilităţi:
- îndeplineşte, caz în care se testează dacă s-a ajuns la
soluţie si apar din nou două posibilităţi
- s-a ajuns la soluţie, se tipăreşte soluţia si se reia
algoritmul considerând generate elementele x1,x2 …,xk , (se caută
în continuare, un alt element al mulţimii Ak , rămas netestat);
- nu s-a ajuns la soluţie, caz în care se reia algoritmul
considerând generate elementele x1,x2 …,xk , si se caută un prim
element xk+2 € Ak.
- nu le îndeplineşte caz în care se reia algoritmul considerând
generate elementele x1,x2 …,xk , iar elementul xk-1 se caută între
elementele mulţimii A, rămase netestate.
Algoritmii se termină atunci când nu există nici un element x1 € A1
netestat.
Observaţie: tehnica Backtracking are ca rezultat obţinerea tuturor
soluţiilor problemei. În cazul în care se cere o sigură soluţie se
poate forţa oprirea, atunci când a fost găsită.
Am arătat că orice soluţie se generează sub formă de vector. Vom
considera că generarea soluţiilor se face intr-o stivă. Astfel, x1
€ A1, se va găsi pe primul nivel al stivei, x2 € A2 se va găsi pe
al doilea nivel al stivei,... xk € Ak se va găsi pe nivelul k al
stivei. În acest fel, stiva (notată ST) va arăta astfel:
ST
Nivelul k+1 al stivei trebuie iniţializat (pentru a alege, în ordine,
elementele mulţimii k+1 ). Iniţializarea trebuie făcută cu o valoare
aflată (în relaţia de ordine considerată, pentru mulţimea Ak+1 )
înaintea tuturor valorilor posibile din mulţime. De exemplu, pentru
generarea permutărilor mulţimii {1,2.....n}, orice nivel al stivei va
lua valori de la 1 la n. Iniţializarea unui nivel (oarecare) se face cu
valoarea 0. Procedura de iniţializare o vom numi INIT şi va avea doi
parametri: k (nivelul care trebuie iniţializat si ST (stiva)).
Găsirea următorului element al mulţimii Ak (element care a fost
netestat) se face cu ajutorul procedurii SUCCESOR (AS,ST,K). Parametrul
AS (am succesor) este o variabilă booleană. În situaţia în care am
găsit elementul, acesta este pus în stivă şi AS ia valoarea TRUE,
contrar (nu a rămas un element netestat) AS ia valoarea FALSE..
Odată ales un element, trebuie văzut dacă acesta îndeplineşte
condiţiile de continuare (altfel spus, dacă elementul este valid).
Acest test se face cu ajutorul procedurii VALID (EV,ST,K).
8
<
ð
ò
^
`
3se face cu ajutorul funcţiei SOLUTIE(k) iar o soluţie se tipăreşte
cu ajutorul procedurii TIPAR. Prezentăm în continuare rutina
Backtracking:
k:=1; init(1,st);
while k>0 do begin
repeat succesor (as, st, k) ; .
if as then valid(ev,st,k)
until (not as) or (as and ev) ;
if as then
if solutie(k) then tipar
else begin
k:=k+l;
init ( k, st );
end;
else k:=k-1
end;
Observaţie: Problemele rezolvate prin această metodă necesită un
timp îndelungat. Din acest motiv, este bine să utilizăm metoda numai
atunci când nu avem la dispoziţie un alt algoritm mai eficient. Cu
toate că există probleme pentru care nu se pot elabora alţi algoritmi
mai eficienţi, tehnica backtracking trebuie aplicată numai în ultimă
instanţă.
Fiind dată o tablă de şah, de dimensiune n, xn, se cer toate
soluţiile de aranjare a n dame, astfel încât să nu se afle două
dame pe aceeaşi linie, coloană sau diagonală (dame să nu se atace
reciproc).
Exemplu: Presupunând că dispunem de o tablă de dimensiune 4x4, o
soluţie ar fi următoarea:
D
D
D
D
Observăm că o damă trebuie să fie plasată singură pe linie.
Plasăm prima damă pe linia 1, coloana 1.
D
A doua damă nu poate fi aşezată decât în coloana 3.
D
D
Observăm că a treia damă nu poate fi plasată în linia 3. Încercăm
atunci plasarea celei de-a doua dame în coloana 4.
D
D
A treia damă nu poate fi plasată decât în coloana 2.
D
D
D
În această situaţie dama a patra nu mai poate fi aşezată.
Încercând să avansăm cu dama a treia, observăm că nu este posibil
să o plasăm nici în coloana 3, nici în coloana 4, deci o vom scoate
de pe tablă. Dama a doua nu mai poate avansa, deci şi ea este scoasă
de pe tablă. Avansăm cu prima damă în coloana 2.
D
A doua damă nu poate fi aşezată decât în coloana 4.
D
D
Dama a treia se aşează în prima coloană.
D
D
D
Acum este posibil să plasăm a patra damă în coloana 3 si astfel am
obţinut o soluţie a problemei.
D
D
D
D
Algoritmul continuă în acest mod până când trebuie scoasă de pe
tablă prima damă.
Pentru reprezentarea unei soluţii putem folosi un vector cu n
componente (având în vedere că pe fiecare linie se găseşte o
singură damă).
Exemplu pentru soluţia găsită avem vectorul ST ce poate fi asimilat
unei stive.
Două dame se găsesc pe aceeaşi diagonală dacă si numai dacă este
îndeplinită condiţia: |st(i)-st(j)|=|i-j| ( diferenţa, în modul,
între linii si coloane este aceeaşi).
ST(4)
ST(3) În general ST(i)=k semnifică faptul că pe linia i dama ocupă
poziţia k. ST(2)
ST(1)
Exemplu: în tabla 4 x4 avem situaţia:
D
D
D
D
st(1)= 1 i = 1
st(3)= 3 j = 3
|st(1) - st(3)| = |1 – 3| = 2
|i – j| = |1 – 3| = 2
sau situaţia
D
D
D
D
st(1) = 3 i = 1
st(3) = 1 j = 3
|st(i) - st(j)| = |3 – 1| = 2
|i – j| = |1 – 3| = 2
Întrucât doua dame nu se pot găsi în aceeaşi coloană, rezultă că
o soluţie este sub formă de permutare. O primă idee ne conduce la
generarea tuturor permutărilor si la extragerea soluţiilor pentru
problema ca două dame să nu fie plasate în aceeaşi diagonală. A
proceda astfel, înseamnă că lucrăm conform strategiei backtracking.
Aceasta presupune ca imediat ce am găsit două dame care se atacă, să
reluăm căutarea.
lată algoritmul, conform strategiei generate de backtracking:
- În prima poziţie a stivei se încarcă valoarea 1, cu semnificaţia
că în linia unu se aşează prima damă în coloană.
- Linia 2 se încearcă aşezarea damei în coloana 1, acest lucru
nefiind posibil întrucât avem doua dame pe aceeaşi coloană.
- În linia 2 se încearcă aşezarea damei în coloana 2 , însă acest
lucru nu este posibil, pentru că damele se găsesc pe aceiaşi
diagonală (|st(1)-st(2)|=|1-2|);
- Aşezarea damei 2 în coloana 3 este posibilă.
- Nu se poate plasa dama 3 în coloana 1, întrucât în liniile 1-3
damele ocupa acelaşi coloană.
- Şi această încercare eşuează întrucât damele de pe 2 şi 3 sunt
pe aceeaşi diagonală.
- Damele de pe 2-3 se găsesc pe aceeaşi coloană.
- Damele de pe 2-3 se găsesc pe aceeaşi diagonală.
- Am coborât în stivă mutând dama de pe linia 2 şi coloana 3 în
coloana 4.
Algoritmul se încheie atunci când stiva este vidă. Semnificaţia
procedurilor utilizate este următoarea:
INIT - nivelul k al stivei este iniţializat cu 0;
SUCCESOR - măreşte cu 1 valoarea aflată pe nivelul k al stivei în
situaţia în care aceasta este mai mică decât n şi atribuie
variabilei EV valoarea TRUE, în caz contrar, atribuie variabilei EV
valoarea FALSE;
VALID - validează valoarea pusă pe nivelul k al stivei, verificând
dacă nu avem două dame pe aceeaşi linie (st(k)=st(i)), sau dacă nu
avem două dame pe aceeaşi diagonală (st(k)-st(i)=|k-i|)caz în care
variabilei EV i se atribuie FALSE; în caz contrar, variabilei EV i se
atribuie TRUE;
SOLUTIE - verifică dacă stiva a fost completată până la nivelul n
inclusiv;
TIPAR - tipăreşte o soluţie.
PAGE
A
B
A
A
...
xk
…
…
x2
x1
3
1
4
2
ì¥Â@