You are on page 1of 7

LICEUL DE INFORMATIC TEFAN ODOBLEJA CRAIOVA

PROIECT DE ATESTAT
PROBLEME DE COMBINATORIC

Profesor indrumator:
MIHAELA CODRE

Elev:
Gherghin Mihnea Ctlin clasa a-XII-a G

CRAIOVA

2011

PROBLEME DE COMBINATORIC
ENUNURI: 1. GENERAREA PERMUTRILOR Se d un numr natural n. S se afieze toate permutrile mulimii {1,2,, n}. 2. GENERAREA ARANJAMENTELOR Se dau dou numere naturale n i p cu p<=n i se cere s se afieze toate submulimile de p elemente ale mulimii {1,2,, n}. Observaie: dou submulimi cu aceleai elemente, dar n alt ordine, se consider soluii distincte. 3. GENERAREA COMBINRILOR Se dau dou numere naturale n i p cu p<=n i se cere s se afieze toate submulimile de p elemente ale mulimii {1,2,, n}. Observaie: dou submulimi cu aceleai elemente, dar n alt ordine, se consider soluii identice. Vom rezolva aceste probleme cu ajutorul metodei Backtracking. PREZENTAREA TEHNICII BACKTRACKING Aceast tehnic se folosete n rezolvarea problemelor care ndeplinesc simultan aceleai condiii : -soluia lor poate fi pus sub forma unui vector ex: S=x1,x2,x3,....,xn cu x1 din A1,x2 din A2,...xn din An; -mulimile A1,A2,...,An sunt mulimi finite , iar elementele lor se consider c se afl ntr-o relaie de ordine bine stabilit; -nu se dispune de o alt metod de rezolvare , mai rapid. Observaii -nu pentru toate problemele numarul de soluii este cunoscut de la nceput; -x1,x2,...,xn pot fi la rndul lor vectori; -n multe probleme , mulimile A1,A2,...,An coincid. La ntlnirea unei astfel de probleme , dac nu cunoatem aceast tehnic , suntem tentai s generm toate elementele produsului cartezian A1xA2x...xAn i fiecare element s fie testat dac este soluie. Rezolvnd problema n acest mod , timpul de execuie este att de mare , nct poate fi considerat infinit , algoritmul neavnd nici o valoare practic. De exemplu , dac dorim s generm toate permutrile unei mulimi fnite A , nu are rost s generm produsul cartezian AxAx...xA , pentru ca apoi , s testm , pentru fiecare element al acestuia , dac este sau nu o permutare (nu are rost s generm 1,1,...,1 , pentru ca apoi s constatm c nu am obinut o permutare , cnd de la a doua cifr 1 ne putem da seama c cifrele nu sunt distincte) Tehnica Backtracking are la baz un principiu extrem de simplu : - se construiete soluia pas cu pas : x1,x2,...,xn;

- dac se constat c , pentru o valoare aleas , nu avem cum s ajungem la soluie , se renun la acea valoare i se reia cutarea din punctul n care am rmas. Concret : - se alege primul element x1 , ce aparine lui A1; - presupunnd generate elementele x1,x2,...,xk aparinnd mulimilor A1,A2,...,Ak , se alege (dac exist) Xk+1 , primul element disponibil din mulimea Ak+1 , apar dou posibiliti : 1. nu s-a gsit un astfel de element , caz n care se reia cutarea considernd generate elementele x1,x2,..,xk-1 , iar aceasta se reia de la urmtorul element al mulimii Ak rmas netestat. 2. A fost gsit ,caz n care se testeaz dac acesta ndeplinete anumite condiii de continuare , aprnd astfel doua posibiliti: 2.1 le ndeplinete , caz n care se testeaz dac s-a ajuns la soluie i apar , din nou dou posibiliti : - a fost gsit soluia , se tiprete soluia i se reia algoritmul considernd generate elementele x1, x2, ... ,xk (se caut n continuare , un alt element al mulimii Ak+1 rmas netestat). - nu s-a ajuns la soluie , caz n care se reia algoritmul considernd generate elementele x1,x2,...,xk+1 i se caut un prim element xk+2 aparinnd Ak+2. 2.2 nu le ndeplinete , caz n carese reia algoritmul considerndgenerate elementele x1,x2,...,xk , iar elementul xk+1 se caut ntre elementele mulimii Ak+1 rmase netestate. Algoritmul se termin atunci cnd nu mai exist nci un element x1 aparinnd 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. Pentru uurarea nelegerii metodei , vom prezenta o rutin unic , aplicabil oricrei probleme , rutin care utilizeaz noiunea de stiv. Rutina va apela proceduri i funcii care au ntotdeauna acelai nume i parametrii i care , din punct de vedere al metodei , realizeaz acelai lucru. Sarcina rezolvatorului este de a scrie explicit ,pentru fiecare problem n parte , procedurile i funciile apelate de rutina backtracking . Evident , o astfel de abordare conduce la probleme lungi . Am artat c orice soluie se genereaz sub forma de vector. Vom considera c generarea soluiilor se face ntr-o stiv. Astfel x1 aparine A1 se va gsi pe primul nivel al stivei. n acest fel , stiva (notat ST) va arta ca mai jos :

Xk X2 X1

Nivelul k+1 al stivei trebuie iniializat (pentru a alege n ordine , elementele mulimii k+1). Iniializarea trebuie fcut cu o valoare aflat (n relaia de ordine considerat pentru mulimea Ak+1) naintea tuturor valorilor posibile din mulime . De exemplu pentu generarea permutarilor mulimii {1,2,...,n} , orice nivel al stivei va lua valori de la 1 la n . Iniializarea unui nivel(oarecare) se face cu valoarea zero. Procedura de iniializare o vom numi INIT i va avea doi parametri : k (nivelul care trebiue iniializat) i ST (stiva). Gsirea urmtorului element al mulimii Ak (element care a fost netestat) se face cu ajutorul procedurii SUCCESOR (AS , ST , k) . Parametrul AS (am succesor) este o variabil boolean .n situaia n care am gsit elementul , acesta este pus n stiv i AS ia valoarea TRUE , contrar (nu a rmas nici un element netestat) AS ia valoarea FALSE. Odat ales un element , trebuie vzut dac acesta ndeplinete condiiile de continuare (altfel spus , dac elementul este valid) . Acest test se face cu ajutorul procedurii VALID (EV , ST , k). Testul dac s-a ajuns sau nu la soluia fnal se face cu ajutorul funciei SOLUIE(k) , iar o soluie se tiprete cu ajutorul procedurii TIPAR. Prezentm n continuare rutina Backtracking : K:=1; INIT(ST,k); While k>0 do BEGIN Repeat Succesor(AS , ST , k); If AS then VALID(EV , ST , k) Until (not AS) or (AS and EV); If AS then If SOLUIE(k) then TIPAR ELSE BEGIN INC(K); END ELSE K:=K-1; END.

ANALIZA PROBLEMELOR

1. GENERAREA PERMUTRILOR Date de intrare: - numarul natural n; Date de iesire: - soluiile reprezentate prin vectorul st cu n elemente aparinnd mulimii {1,2,, n}. 2. GENERAREA ARANJAMENTELOR Date de intrare: - numerele naturale n i p; Date de iesire: - soluiile reprezentate prin vectorul st cu p elemente aparinnd mulimii {1,2,, n}.

3. GENERAREA COMBINRILOR Date de intrare: - numerele naturale n i p; Date de iesire: soluiile reprezentate prin vectorul vectorul st cu p elemente aparinnd mulimii {1,2, , n}. Explicatii privind structura subprogramelor apelate de rutina Backtracking:
-

functia SOLUTIE: numarul de elemente al unei solutii = n pentru problema permutrilor i cu p pentru aranjamente i combinri, deci conditia de a ajunge la o solutie va fi: k=n, respectiv k=p; procedura INIT: fiecare element st[k] {1,2,3,,n}; prin urmare initializarea nivelului k de pe stiva se va face cu valoarea 0; procedura SUCCESOR: din observatiile de mai sus rezulta si conditia ca un element sa aiba succesor: st[k]<n (n = cea mai mare valoare posibila pentru st[k]); procedura VALID: trebuie sa verificam dac elementele vectorului st sunt distincte; n plus, pentru problema combinrilor trebuie s punem condiia ca elementele s fie n ordine cresctoare. procedura TIPAR: se tipareste vectorul st . 3.Combinri: pentru n=3 i p=2, se afieaz soluiile: 12 13 14 23 24 34

Exemple de execuie: 1.Permutri: pentru n=3 se afieaz soluiile: 123 132 213 231 312 321 2.Aranjamente: pentru n=3 i p=2 se afieaz soluiile: 12 13 14 21 23 24 31 32 34 41 42 43