Documente Academic
Documente Profesional
Documente Cultură
Laborator 1
Descriere: Backtracking
1. Prezentarea metodei
Problemele care se rezolvă prin backtracking nu impun generarea tuturor soluţiilor posibile, ci
doar generarea acelor soluţii care îndeplinesc anumite condiţii, specifice problemei, denumite
condiţii interne. Soluţiile posibile care respectă condiţiile interne sunt denumite soluţii
rezultat.
Unele probleme impun obţinerea soluţiei optime, acea soluţie rezultat care îndeplineşte o
anumită condiţie de optim.
Algoritm :
• Presupunând generate elementele x1, x2, x3, ... , xk aparţinând mulţimilor A1, A2, A3, ... , Ak se
alege pentru xk+1 (dacă acesta există), primul element disponibil din mulţimea Ak+1. Apar
două posibilităţi:
o Nu a fost găsit un astfel de element, caz în care se reia căutarea considerând
generate elementele x1, x2, x3, ... , xk-1 şi se atribuie lui xk următorul element
disponibil din mulţimea Ak şi algoritmul este reluat.
o A fost găsit xk+1, caz în care se testează dacă acesta îndeplineşte condiţiile de
continuare. Există două posibilităţi:
Sunt îndeplinite condiţiile, caz în care se testează dacă s-a ajuns la soluţie
şi apar din nou, două posibilităţi:
• S-a ajuns la soluţie, se tipăreşte soluţia şi se reia algoritmul
considerând generate elementele x1, x2, x3, ... , xk (se caută în
continuare, un alt element al mulţimii Ak+1 rămas netestat).
• Nu s-a ajuns la soluţie, caz în care se reia algoritmul, considerând
generate elementele x1, x2, ... , xk+1 şi se caută un prim element xk+2
aparţinând mulţimii Ak+2.
Nu sunt îndeplinite condiţiile, caz în care se reia algoritmul considerând
generate elementele x1, x2, ... , xk, iar elementul xk+1 se caută printre
elementele mulţimii Ak+1 rămase netestate.
Algoritmul se termină atunci când nu mai există nici un element x1 netestat, aparţinând lui A1.
Algoritmul general backtracking, pentru cazul în care soluţia este reprezentată cu ajutorul unui
vector X, este următorul:
if (succesor)
// daca avem succesor ( implicit este si valid )
{
if ( avem solutie ) // daca s-a atins solutia
afisare solutie;
else // daca nu s-a atins solutia se mai urca un
// nivel in stiva
{
// se initializeaza elementul de pe pozitia
// urmatoare in stiva
k++;
stiva[k]=prima valoare posibila-1;
}
}
else k--; // se coboara un nivel in stiva
}
2.1 Iterativ
for(k=1;k<=n;k++) x[k]=gol; initiarizarea vectorului solutie
k=1; pozitionare pe prima componenta
while (k>0) cat timp exista componente de analizat
if (k==n+1) daca x este solutie
{afis(x);
–k;} atunci: afisare solutie si pas stanga
else altfel:
{ if(x[k]<max[k]) daca exista elemente de ıncercat
if(posibil(1+x[k])) daca 1+x[k] este valida
++x[k++]; atunci maresc si fac pas dreapta
else ++x[k]; altfel maresc si raman pe pozitie
else x[k–]=gol; altfel golesc si fac pas dreapta
Vectorul solutie x contine indicii din multimile A1,A2, ...,An. Mai precis, x[k] = i ınseamna ca pe
pozitia k din solutia x se afla ai din Ak.
2.2 Recursiv
3. Generarea aranjamentelor
Restrictiile si conditiile de continuare: Daca x = (x1, x2, ..., xn) este o solutie ea trebuie sa respecte
restrictiile: xi ≠ xj pentru oricare i ≠ j. Un vector cu k elemente (x1, x2, ..., xk) poate conduce la o
solutie numai daca satisface conditiile xi ≠ xj pentru oricare i ≠ j.
Conditia de gasire a unei solutii: Orice vector cu n componente care respecta restrictiile este o
solutie. Cand k = n + 1 a fost gasita o solutie.
class GenAranjIterativ1{
static int n=2, min=1,max=4, gol=min-1;
static int[] a=new int[n+1];
while (k>0)
if (k==n+1) {
afis(a);
--k;
}
else{
if(a[k]<max)
if(!gasit(1+a[k],k-1)) ++a[k++]; // maresc si pas dreapta
else ++a[k]; // maresc si raman pe pozitie
else a[k--]=gol;
}
}
}
class GenAranjIterativ2{
while (k>0){
ok=false;
class GenAranjRecursiv{
static int n=2, m=4, nsol=0;
static int[] a=new int[n+1];
a[k]=i;
if(k<n) f(k+1);
else afis();
}
}
Fiind dată o tablă de şah, de dimensiune n x n, se cer toate soluţiile de aranjare a n regine, astfel
încât să nu se afle două din ele pe aceeaşi linie, coloană sau diagonală, în sensul ca reginele „să
nu se atace” reciproc.
Pentru reprezentarea unei soluţii se poate folosi un vector X, cu n componente (având în vedere
că pe fiecare linie se găseşte o singură regină), care poate fi asimilat unei stive. În general
X(i)=k semnifică faptul că pe linia i regina cu acelaşi număr ocupă poziţia k.
Două regine se găsesc pe aceeaşi diagonală dacă şi numai dacă este îndeplinită condiţia: |X (i)-
X(j)|=|i-j| ( diferenţa, în modul, între linii şi coloane este aceeaşi). Deoarece două regine nu se
pot găsi pe aceeaşi coloană, rezultă că o soluţie este sub formă de permutare. Algoritmul se
încheie atunci când stiva este vidă.
Exemplu: Problema celor 8 regine – Generează soluţiile de aşezare a 8 regine pe tabla de şah
astfel încât acestea „să nu se atace” reciproc:
import java.util.*;
if( (el0.intValue()==el.intValue()) ||
(Math.abs(el0.intValue()-el.intValue()))==(Math.abs(st.size()-1-i)))
{
ev=false;
break;
}
}
return ev;
}
ASD
if(as){
if(solutie()) tipar();
else initS();
}
else st.removeElementAt( st.size()-1 );
}
System.out.println("Sfarsit generare");
}
5. Problema labirintului
Se dă un labirint sub forma unei matrici cu m linii şi n coloane. Fiecare element al matricei
reprezintă o cameră. Într-una din camerele labirintului se găseşte un om. Se cere să se afle toate
soluţiile de ieşire din labirint, fără să treacă de două ori prin aceeaşi cameră. Fiecare cameră are
pereţi proprii şi se poate trece dintr-o cameră în alta, numai dacă între cele două camere nu există
perete. Deplasarea prin labirint se poate face doar mergând în sus, în jos, la stânga sau la dreapta,
nu şi în diagonală.
6. Probleme
2. Generarea combinarilor
ASD
3. Fiind data o harta cu n tari, se cer toate posibilitatile de a colora o harta, utilizand 4 culori
(rosu,galben,verde,albastru) a.i, doua tari vecine sa nu fie colorate la fel. De exemplu, avem
urmatoarea harta cu 7 tari si o solutie posibila de colorare.
0 1
4
2 3
6
5
Harta este reprezentata cu ajutorul unei matrici patratice. Pentru fiecare linie i (reprezentand tara i)
avem j coloane (1 = daca se invecineaza cu tara j, 0 = daca nu se invecineaza cu tara j). Pentru
exemplul de mai sus avem urmatoarea matrice (va fi salvata intr-un fisier harta.in).
0,1,1,0,1,1,0
1,0,0,0,1,1,1
1,1,0,1,1,1,1
0,0,1,0,1,0,1
1,1,1,1,0,0,1
1,1,1,0,0,0,1
0,1,1,1,1,1,0
Rezultatul va fi salvat intr-un fisier harta.out si va fi codificat sub forma unui vector in care fiecare
element i va avea valoarea 1 (rosu), 2 (galben), 3(verde) sau 4 (albastru).
4. Realizati un program care rezolva problema rucsacului, sau problema selectiei optime. Fiind date
n obiecte, fiecare cu greutatea g[i] si valoarea v[i] si un rucsac cu capacitatea totala gt, sa se
determine ce obiecte trebuie selectate pentru a fi luate in rucsac astfel incat greutatea lor totala sa
nu depaseasca gt si valoarea lor sa fie maxima. Datele de intrare vor fi preluate dintr-un fisier
rucsac.in
5. Se dau suma s si n tipuri de monede si bancnote , avand valori de v1,v2,.....,vn € . Se cer toate
modalitatile de plata a sumei s utilizand aceste monede si bancnote.