Sunteți pe pagina 1din 2

Informatică 11

Metoda backtracking (căutare cu revenire)


Metoda backtracking este o metodă construită cu proprietate de revenire asupra tuturor valorilor
căutate.

Problemele la care se aplică metoda backtracking sunt cele în care soluția poate fi reprezentată sub
forma unui vector.

x=[x1, x2,..., xn] ∈ S1xS2x...xSn , unde mulțimile Si sunt mulțimi finite. Pentru fiecare problemă în parte
există în enunț niște restricții pe care le vom numi condiții interne (condiții de continuare). Mulțimea
finită S=S1xS2x...xSn se numește spațiul soluțiilor posibile. Soluțiile posibile care satisfac condițiile
interne se numesc soluții rezultat.

Metoda backtracking caută să genereze doar aceste soluții rezultat și evită generarea tuturor
soluțiilor posibile. În acest scop, elementele vectorului stivă x primesc, pe rând, valori din mulțimea
de soluții posibile. Fiecare x[i] ∈ Si (ia valori din Si). De fiecare dată, se testează condițiile interne. În
cazul în care acestea nu sunt îndeplinite, componenta x[i] se videază și se trece la o nouă valoare
pentru componenta x[i-1]. La un anumit pas k, se va căuta o valoare pentru x[k] doar dacă x[1],
x[2],..., x[k-1] îndeplinesc condițiile de continuare.

Prin metoda backtracking, orice vector este construit progresiv, începând cu prima componentă și
mergând către ultima, cu eventualele reveniri asupra valorilor atribuite, cu unul sau mai mulți pași
înapoi.

O configurație la un anumit pas k are următoarea formă:

v1 v2 v3 ... v(k-1) xk x(k+1) ... xn

C1 C2 C3 ... C(k-1) Ck vid ... vid

Configurația reprezintă faptul că valorile v1, v2,..., v(k-1) îndeplinesc condițiile de continuare și se
încearcă atribuirea unei valori pentru componenta x k. Acesteia i se dă o valoare din mulțimea S k-Ck,
unde Ci (xk) reprezintă mulțimea valorilor consumate (testate). În cazul în care xk, împreună cu v1,
v2,..., v(k-1), îndeplinește condițiile interne (de continuare), atunci i se atribuie lui x k valoarea v[k] și se
trece la pasul următor (k+1).

Aplicarea metodei backtracking începe în situația în care nicio valoare nu a fost încă testată și se
încearcă atribuirea unei valori pentru componenta x 1. Acest lucru presupune faptul că mulțimile Ci
sunt inițial vide.

O configurație în cursul aplicării metodei backtracking va suferi 4 tipuri de modificări.

1. Atribuire și avansare

O modificare de acest tip are loc atunci când C k<>Sk, adică mai există valori neconsumate pentru
componenta xk, iar valoarea v[k], aleasă din Sk-Ck, satisface condițiile de continuare. În acest caz, v[k] i
se atribuie lui xk și este adăugat mulțimii Ck.

2. Încercare eșuată

O astfel de modificare are loc atunci când mai există valori neconsumate pentru x k, dar valoarea
aleasă nu a satisfăcut condițiile interne.

1
Informatică 11

3. Revenire

O modificare de acest tip are loc atunci când C k=Sk (toate valorile pentru xk au fost testate). În această
situație, se revine la componenta x(k-1), încercându-se atribuirea unei noi valori pentru această
componentă și se videază mulțimea Ck, deoarece se vor relua toate încercările pentru x k din mulțimea
Sk.

4. Revenire după construirea unei soluții

O modificare de acest tip are loc atunci când toate componentele vectorului au primit valori ce
satisfac condițiile interne, adică am construit o soluție. În acest caz, se revine la componenta x n, care
urmează să primească alte valori.

void back ( )
{ int i, k, s=n;
k=1;
for (i=1; i<=n; i++)
x[i]=0; // construirea configurației inițiale
while (k>0) // configurația nu este finală
if (k==n+1)
{ retsol ( ); // reține soluția
k --; } // revine după construirea unei soluții
else
if (x[k]<s) // mai există valori neconsumate pentru x[k]
{ x[k]=x[k]+1; // s-a ales valoarea următoare
if (continuare (k))
k++; // avansează } // încercare eșuată
else // revenire
{ x[k]=0;
k --; } }

Rutina backtracking apelează o funcție retsol, care va tipări soluția, și o funcție continuare, în care
sunt testate condițile interne ale problemei. Dacă această funcție returnează 1, înseamnă că vom
intra în backtracking, iar dacă valoarea ei va fi 0, nu vom intra în rutina backtracking.

S-ar putea să vă placă și