NOTA IMPORTANTA: asta e cam ce am inteles eu citind in graba laboratorul nostru de PA. Ofc I might be wrong. In plus, asta e doar ideea in mare, si nu doar gandire abstracta si pseudocod, ci si solutii de implementare practica. Daca aveti prea mult timp liber, exista carti intregi despre backtracking ;)
Ideea e ca acum nu mai vedem o lista de valori posibile pe care le permutam, ci avem un fel de graf astfel incat:
- nodurile sunt liste cu valori posibile
- un arc intre 2 noduri reprezinta o restrictie intre 2 noduri, spre exemplu avem 2 noduri n1 si n2 cu arcul <, adica trebuie ca n1 < n2
- o solutie finala este o valoare data pentru noduri astfel incat toate restrictiile din arce sa fie respectate
void bkt(int p)
{
for (int i=0;i < n_pos[p];i++)
{
st[p]=pos[p][i];
if (verif(p)) //verificam la fiecare pas, nu la sfarsit
if (p==nr_cautat
) //adica fiecare nod are o valoare
afiseaza(p)
else bkt(p+1);
}
}
Sa luam ca exemplu un sudoku. Cred ca toata lumea stie jocul, la cat pierdem timpul la cursuri cu el ;) (daca nu, cititi aici ). Vom reprezenta tabela de 9x9 ca o stiva de 81 de elemente, ce vor reprezenta practic nodurile alese de noi. In pos[p] vom baga toate numerele de la 1 la 9, iar nr_pos[i]=9 pt oricare i de la 1 la 81. Un bkt de genul asta va genera toate tabelele posibile. Ca sa rezolvam o tabela cu cateva valori predefinite, facem in asa fel incat pe pozitia p sa putem avea doar valoarea x data. Acum, ajungem in final la optimizari. Toate astea practic reduc din elementele din pos[p]. Practic inainte sa intram in backtracking, mai avem o functie care sa prelucreze matricea respectiva dupa niste reguli clare. Avem asa: - NC - node consistency
- AC1 - arc consistency 1
- AC3 - arc consistency 3
Mai pe romaneste, avem un nod n1, care are arc catre n2 si n2 are arc catre n3 (adica exista restrictii pentru n2 in functie de cum alegem n1, si pentru n3 in functie de cum alegem n2). In coada Q avem initial (n1,n2) si (n2,n3). Cautam daca e ceva de eliminat in n1, si nu e. In Q ramane (n2,n3). Cautam sa vedem daca e ceva de eliminat in n2, si gasim. Prin urmare, readaugam in Q (n1,n2) si (n2,n3).
Cam atata in mare despre backtracking. O singura recomandare pentru voi, programatori dragi. Cititi, face-ti-va o idee cu ce se mananca, faceti temele cu restrictiile lor idioate impuse, then think outside the box! Be creative and never follow the rules, even when it comes to programming. Un programator bun stie toti algoritmii astia, cand sa-i foloseasca si cum. Un programator foarte bun intelege algoritmii astia, si si-i formeaza pe ai lui si stilul lui de programare.
Intrebari? M-am exprimat aiurea pe undeva? Postati un comment si va voi lamuri cat de bine pot.