Documente Academic
Documente Profesional
Documente Cultură
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}.
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.
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.
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.