Sunteți pe pagina 1din 3

BACKTRACKING

DESCRIERE I APLICABILITATE
Backtracking este o metod de rezolvare a unor probleme care ndeplinesc urmtoarele condiii simultan: Soluia lor poate fi pus sub forma unui vector V , cu V[i] Ai, i = 1..n; Mulimile Ai, i=1..n sunt mulimi finite, iar elementele lor se consider a fi ntr-o relaie de ordine bine stabilit; Nu se dispune de o alt metod de rezolvare mai rapid.

OBSERVAII:
Nu pentru toate problemele n este cunoscut de la nceput; V[i], i=1..n pot fi la rndul lor vectori; n multe probleme Ai, i=1..n coincid.

EXEMPLU:
Generarea permutrilor mulimii {1, 2, , N}.

CAZ PARTICULAR: N=3


Soluia este: {1, 2, 3}, {1, 3, 2}, {2, 1, 3}, {2, 3, 1}, {3, 1, 2}, {3, 2, 1} A1 = A2 = A3 = {1, 2, 3}

PRINCIPIUL DE BAZ ESTE URMTORUL:


Se construiete soluia pas cu pas: X1, X2, , Xn La un moment dat se caut o valoare pentru componenta k. Se testeaz pe rnd valorile din Ak. Dac se constat c pentru o valoare aleas nu avem cum s ajungem la soluie, se renun la acea valoare i se reia cutarea cu alt valoare. Este necesar o funcie care verific dac pentru o anumit poziie, s-a ales o valoare care poate conduce la soluie (funcia de tiere). Astfel, cutarea se realizeaz ntr-un spaiu parial de soluii determinat de funcia de tiere.

CONCRET:

Iniial:
Se alege primul element V[1] care aparine lui A1;

La pasul k:
Presupunnd generate elementele V[1], V[2], , V[k-1], V[i] Ai, se caut[ un element pentru V[k] Se alege (dac exist) un element din Ak. ( V[k]++; ) Exist dou posibiliti.

1. Nu s-a gsit un astfel de element


n acest caz n care se reia cutarea considernd generate elementele V[1], ., V[k-2]. Cutarea se reia pentru componenta k-1. ( pasul backword, k-- ; ) 2. A fost gsit V[k] Ak. Se verific dac V[k] ndeplinete anumite condiii de continuare (funcia de tiere). Apar dou posibiliti 2.1. Dac V[k] ndeplinete condiiile de continuare Se verific dac s-a ajuns la soluie Apar dou posibiliti: 2.1.1. Dac s-a ajuns la soluie Se tiprete soluia 2.1.2. Dac nu s-a ajuns la soluie Se reia algoritmul pentru componenta k+1 (pas forward , k++) 2.2. Dac V[k] nu ndeplinete condiiile de continuare Se reia algoritmul considernd generate elementele V[1], , V[k-1] Se caut alt valoare pentru V[k] ntre elementele mulimii Ak rmase netestate.

Algoritmul se termin atunci cnd nu mai exist nici un element n A1 netestat. Observaie: Tehnica Backtracking are ca rezultat obinerea tuturor soluiilor problemei. n cazul n care se cere o singur soluie se poate fora oprirea, atunci cnd a fost gsit prima soluie.

EXEMPLU PENTRU PERMUTRI


OBSERVAII: Vectorul soluie va avea lungimea constant N (3) Pentru fiecare component a vectorului vom testa elementele 1, 2, .. , N (1, 2, 3). n acest caz mulimile A1, A2, .. AN sunt identice. Funcia de tiere trebuie s decid dac elementele V[1], V[2], , V[k-1] sunt diferite de V[k] Funcia de tiprire va afia elementele V[1], V[2], , V[N].

IMPLEMENTARE ITERATIV

Soluia se va construi n vectorul V Funcia Valid returneaz 1 dac valoarea V[k] satisface condiia de continuare i 0 altfel. Funcia Soluie returneaz 1 dac s-a ajuns la o soluie i 0 altfel. Funcia Tipar afieaz soluiile problemei Pseudocod
void Backtrack (lista_parametri) { k=1; // iniial se caut o valoare pentru V[1] while (k>0) // nu s-au epuizat toate valorile posibile pentru prima component while (exist candidai netestai pentru V[k]) { aleg candidat netestat pentru V[k] din Ak if (Valid(V,k)) // V[k] satisface conditia de continuare if (Solutie(Lista_parametri)) // s-a gasit o solutie Tipar (Lista_parametri); else k++; // pas forward } k--; // pas backward }

n general mulimile Ai care definesc mulimea valorilor posibile pentru componentele V[i] sunt mulimi de numere ntregi consecutive. Ex. Pentru permutri A[i] = {1, 2, 3} Din acest motiv, alegerea candidailor netestai se face astfel: - Primul candidat este primul element din mulimea de valori (1) - Ceilali candidai pentru componenta V[k] vor fi selectai prin incremetarea lui V[k]. n momentul n care nu se gsete un candidat valid pentru poziia k se va ncerc alt valoare pentru poziia k-1. Dac se gsete o valoare valid pentru poziia k-1 i nu am ajuns la soluie, se va cuta din nou o valoare pentru poziia k. Avnd n vedere c selectarea valorilor se face prin incremetare, este necesar ca nainte de selectarea valorilor pentru V[k], aceast component s fie iniializat cu cel mai mic element din Ak -1.

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