De multe ori, n aplicaii apar probleme n care se cere gsirea unor
soluii de forma x=x1x2xn, unde xiAi, i=1,,n, n care x1...xn trebuie s ndeplineasc anumite condiii. Am putea s generm toate combinaiile posibile de valori i apoi s le alegem doar pe cele convenabile. Considernd mulimile Ai={ai,1, ai,2,,ai,n(i)}, aceste combinaii s-ar putea construi astfel: pentru fiecare valoare posibil fixat pentru componenta x i, vom alege toate valorile posibile pentru componenta x i+1 i pentru fiecare astfel de valoare fixat pentru xi+1 vom alege toate valorile posibile pentru componenta xi+2 etc. Rezolvnd problema n acest mod, deci genernd toate elementele produsului cartezian A1xA2x...An i verificnd abia apoi dac fiecare combinaie este o soluie, eficiena este sczut. Astfel, dac de exemplu ne propunem s generm toate cuvintele formate cu literele a, b, c, aa nct fiecare liter s apar o singur dat, combinaiile posibile sunt n numr de 27, dintre care convin doar 6. Tehnica Backtracking propune generarea soluiei prin completarea vectorului x n ordinea x1x2...xn i are la baz un principiu de bun sim: dac se constat c avnd o combinaie parial de forma v 1v2...vk-1 (unde v1, ..., vk-1 sunt valori deja fixate), dac alegem pentru x k o valoare vk i combinaia rezultat nu ne permite s ajungem la o soluie, se renun la aceast valoare i se ncearc o alta (dintre cele netestate n aceast etap). ntr-adevr, oricum am alege celelalte valori, dac una nu corespunde nu putem avea o soluie. []
nainte de a scrie programul care ne va obine soluiile, trebuie s
stabilim unele detalii cu privire la: vectorul soluie (cte componente are, ce menine fiecare component), mulimea de valori posibile pentru fiecare component (sunt foarte importante limitele acestei mulimi), condiiile de continuare (condiiile ca o valoare x[k] s fie acceptat), condiia ca ansamblul de valori generat s fie soluie.
Procesare de texte
Pe baza acestor date vom scrie apoi procedurile i funciile pe care le
vom apela n algoritmul general al metodei []. Aceste proceduri i funcii au o semnificaie comun, prezentnd ns particulariti n funcie de fiecare problem n parte. Astfel, se va nota cu x vectorul care va conine soluia; x[k]=v va avea ca semnificaie faptul c elementul al v-lea din mulimea de valori posibile A k a fost selectat pentru componenta x k. Dac mulimea Ak are m elemente, a1a2...am, pentru uurin, ne vom referi la ele prin indicii lor, 1, 2, ..., m. Observaie: De obicei valorile posibile sunt chiar succesive i n acest caz se poate considera c x[k]=v are semnificaia c pentru componenta x k s-a ales chiar valoarea v. [] Exerciii i probleme [] 1. Dac pentru nivelul k oarecare al vectorului soluie am verificat toate valorile posibile: a) algoritmul se ncheie; b) se revine pe nivelul anterior; c) se trece pe nivelul urmtor. 2. Dup ce s-a gsit o valoare convenabil pentru componenta k, urmtorul pas este: a) se trece la componenta urmtoare, k+1 (dac nu s-a ajuns la soluie); b) se rmne la componenta k, cutnd n continuare o alt valoare convenabil; c) se revine la componenta k-1. 3. n ce condiii se revine la componenta anterioar? a) dup ce am gsit o valoare convenabil pentru componenta k; b) dac valoarea testat pentru componenta k nu convine; c) dac am testat toate valorile posibile pentru componenta k. Fiecrei situaii din prima coloan i corespund una sau mai multe operaii din coloana a doua realizai asocierile corecte.
Nr.crt
Situaie
Operaie
Se revine de la componenta k+1
la k Se trece de la componenta k-1 la k Se rmne pe nivelul k
Iniializare pentru x[k]
2 3
Se testeaz urmtoarea valoare
posibil pentru x[k] Se tiprete o soluie
(Adaptat dup Manualul de Informatic, clasa a X-a, Livia oca, AndreeaRuxanda Demco, Cristian Opincaru, Adrian Sindile)