Sunteți pe pagina 1din 52

Universitatea Constantin Brncui Trgu-Jiu 10

Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu

PROIECTAREA
ALGORITMILOR

Lect. univ. dr. Adrian Runceanu


1
10

Curs 10

Metoda Backtracking

Proiectarea Algoritmilor - curs 2


10

Coninutul cursului

10.1. Prezentarea generala a metodei


10.2. Implementarea metodei backtracking
10.3. Probleme propuse spre rezolvare

Proiectarea Algoritmilor - curs 3


10

10.1 Prezentarea generala a metodei

Aceast tehnic se folosete n rezolvarea


problemelor care ndeplinesc simultan urmtoarele
condiii:
- soluia lor poate fi pus sub forma unui vector S = x1, x2,
..., xn, cu x1 A1, x2 A2 ,, xn 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
- x1, x2 ,, xn pot fi la rndul lor vectori
- A1, A2 ,, An pot coincide
Proiectarea Algoritmilor - curs 4
10

10.1 Prezentarea generala a metodei

La ntlnirea unei astfel de probleme, dac nu


cunoatem aceast tehnic, suntem tentai s
generm toate elementele produsului
cartezian A1,A2, , An si 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.

Proiectarea Algoritmilor - curs 5


10

10.1 Prezentarea generala a metodei

De exemplu, dac dorim s generm toate


permutrile unei mulimi finite A, nu are rost
s generm produsul cartezian AxAx.....xA,
pentru ca apoi, s testm, pentru fiecare
element al acestuia, dac este sau nu
permutare (nu are rost s generm 1,1,1,...,1,
pentru ca apoi s constatm c nu am obinut
o permutare, cnd de la a doua cifr 1 ne
puteam da seama c cifrele nu sunt
distincte).
Proiectarea Algoritmilor - curs 6
10

10.1 Prezentarea generala a metodei

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

Proiectarea Algoritmilor - curs 7


10

10.1 Prezentarea generala a metodei

Concret:
se alege primul element x, ce aparine lui A
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

Proiectarea Algoritmilor - curs 8


10
2) A fost gsit, caz n care se testeaz dac
acesta ndeplinete anumite condiii de
continuare aprnd astfel dou posibiliti:
ndeplinete, caz n care se testeaz dac s-a
ajuns la soluie si apar din nou dou posibiliti:
s-a ajuns la soluie, se tiprete soluia si se reia
algoritmul considernd generate elementele
x1,x2,,xk, (se caut n continuare, un alt element
al mulimii Ak, rmas netestat)
nu s-a ajuns la soluie, caz n care se reia
algoritmul considernd generate elementele
x1,x2,,xk+1, si se caut un prim element xk+2 Ak

Proiectarea Algoritmilor - curs 9


10
nu le ndeplinete, caz n care se reia
algoritmul considernd generate elementele
x1,x2,,xk, iar elementul xk+1 se caut ntre
elementele mulimii Ak, rmase netestate
Algoritmii se termin atunci cnd nu mai exist
nici un element x1 A1 netestat.
Observaie:
Tehnica Backtracking are ca rezultat
obinerea tuturor soluiilor problemei.
n cazul n care se cere o sigur soluie se
poate fora oprirea, atunci cnd a fost gsit.

Proiectarea Algoritmilor - curs 10


10
Am artat c orice soluie se genereaz sub
form de vector.
Vom considera c generarea soluiilor se face
intr-o stiv.
Metoda backtracking se poate implementa i
recursiv, dar implementarea iterativ folosete o
stiv, iar principiul de lucrul este cel specific stivei
LIFO (Last In First Out) Ultimul Intrat
Primul Iesit
Astfel, x1 A1, se va gsi pe primul nivel al stivei,
x2 A2 se va gsi pe al doilea nivel al stivei,..., xk
Ak se va gsi pe nivelul k al stivei.

Proiectarea Algoritmilor - curs 11


10

10.1 Prezentarea generala a metodei

n acest fel, stiva (notat ST) va arta astfel:

...
xk


x2
x1

Proiectarea Algoritmilor - curs 12


10

10.1 Prezentarea generala a metodei

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.

Proiectarea Algoritmilor - curs 13


10

Coninutul cursului

10.1. Prezentarea generala a metodei


10.2. Implementarea metodei backtracking
10.3. Probleme propuse spre rezolvare

Proiectarea Algoritmilor - curs 14


10
Generarea permutrilor
Enun:
Se citete un numr natural n. Se cere s se
genereze toate permutrile mulimii {1, 2,,n}
Dac n=3, mulimile A1 = A2 = A3 = {1, 2, 3}
Soluiile ar fi:
123
132
213
231
312
321
Observaie:
Se observ, c elementele mulimilor sunt n ordine
strict cresctoare i consecutive.
Aadar modul de alegere din mulime nu este
aleatoriu ci se face n funcie de ordinea elementelor.
Proiectarea Algoritmilor - curs 15
10
nainte de a scrie programul care ne va
obine soluiile, trebuie s stabilim unele detalii
cu privire la:
1. vectorul soluie cte componente are, ce
conine fiecare component.
2. mulimea de valori posibile pentru fiecare
component (sunt foarte importante limitele
acestei mulimi).
3. condiiile de continuare (condiiile ca o
valoare xk s fie acceptat).
4. condiia ca ansamblul de valori generat s
fie soluie.

Proiectarea Algoritmilor - curs 16


10
pentru generarea permutrilor mulimii
{1,2.....n}, orice nivel al stivei va lua
valori de la 1 la n.

Iniializarea unui nivel (oarecare) se


face cu valoarea 0.

Procedura de iniializare o vom numi


INIT i va avea doi parametri: k (nivelul
care trebuie iniializat si ST (stiva).

Proiectarea Algoritmilor - curs 17


10
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, in caz contrar (nu a rmas un
element netestat) AS ia valoarea FALSE.
Proiectarea Algoritmilor - curs 18
10
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).
Parametrul EV (este valid) este o variabil
boolean.
n situaia n care elementul ndeplinete
condiiile de continuare, EV ia valoarea
TRUE, in caz contrar (nu ndeplinete
condiiile de continuare) EV ia valoarea
FALSE. 19
Proiectarea Algoritmilor - curs
10

Testul dac s-a ajuns sau nu la soluia


final se face cu ajutorul funciei
SOLUTIE(k)

O soluie se tiprete cu ajutorul procedurii


TIPAR.

Proiectarea Algoritmilor - curs 20


procedura init;
begin
10
st[k]<-valoare initiala de pornire
end;
procedura succesor;
begin
daca st[k]<valoarea ultimului element din S atunci
begin
Schema st[k]<-st[k]+1;
general a end
as<-true

algoritmului end;
altfel as<-false;

n procedura valid;
begin
pseudocod ev<-true;
n continuare se verific condiiile ce trebuiesc ndeplinite de
este: elementele aflate n stiva pn la nivelul dat k.
Condiiile se stabilesc astfel nct n cazul ndeplinirii lor
variabila ev s primeasc de fiecare dat valoarea false
(condiiile se neag!!!)
end;
functia solutie();
begin
daca stiva este plina atunci solutie<-true
altfel solutie<-false;
end;
procedura tipar;
begin
Se parcurge stiva i se tipresc valorile aflate acolo;
end;
Proiectarea Algoritmilor - curs 21
Programul principal este de fapt algoritmul 10
cu revenire backtracking
begin
se citesc date de intrare
k<-1;
init;
cat timp k > 0 executa
begin
repeta
succesor;
daca as atunci valid
pana cand (as si ev) sau (not as);
daca as atunci
daca solutie atunci tipar
altfel
begin
k<-k+1;
init
end
altfel
k<-k-1;
end;
end.
Proiectarea Algoritmilor - curs 22
10
Pentru enunul de la exemplul anterior, generm,
cu ajutorul stivei, soluiile prin metoda backtracking.
Pentru n=3:
pas 1:
Se ia primul element din mulimea A1 i se pune pe
nivelul 1 al stivei.
Nu exist deocamdat nici o restricie deoarece
exist permutri ce ncep cu 1.
Se trece la completarea urmtorului nivel al stivei.

Proiectarea Algoritmilor - curs 23


pas 2: 10
Se ia primul element din mulimea A2 i se pune pe nivelul
2 al stivei.
Se observ c valoarea 1 a mai fost introdus n vectorul
soluie, pe nivelul anterior, i, n acest caz valoarea 1 nu
poate fi ataat la vectorul soluie.
Aadar, se ia urmtorul element din mulimea A2, adic 2.
Se constat c poate fi introdus n vectorul soluie.
Se trece la completarea urmtorului nivel al stivei.

1 2

1 1

Proiectarea Algoritmilor - curs 24


pas 3: 10
Se ia primul element din mulimea A3 i se pune pe nivelul
3 al stivei.
Se observ c valoarea 1 a mai fost introdus n vectorul
soluie, pe nivelul anterior, i, n acest caz valoarea 1 nu
poate fi ataat la vectorul soluie.
Aadar, se ia urmtorul element din mulimea A3, adic 2.
La fel ca valoarea 1, 2 nu poate fi introdus n stiv.
Se trece la urmtorul element din mulime, 3.
Se constat c poate fi introdus n vectorul soluie.
S-au completat toate nivelele stivei i deci soluia este 1 2 3.

1 2 3

2 2 2

1 1 1

Proiectarea Algoritmilor - curs 25


10
pas 4:
Pentru nivelul 3 al stivei nu mai exist o alt
valoare din mulimea A3 ce poate fi adugat.
Din acest motiv, se revine la nivelul 2 al stivei
(napoi) i se completeaz cu urmtoarea
valoare din mulimea A2 ce nu a fost utilizat,
adic 3.
Se trece la completarea urmtorului nivel al
stivei.

Proiectarea Algoritmilor - curs 26


10
10.2. Implementarea metodei
backtracking
Procedeul se repet pn cnd nu se mai
poate introduce o valoare pe nivelul 1 al
stivei.
n acel moment s-au generat toate soluiile
problemei.

Proiectarea Algoritmilor - curs 27


10
Implementarea programului pentru generarea permutarilor:
#include<iostream.h>
int st[20],i,k,p,q,m,n,as,ev;
void init(int k,int st[ ])
{
st[k]=0;
}
int succesor(int k,int st[ ])
{
if ( st[k]<n )
{
st[k]=st[k]+1;
as=1;
}
else as=0;
return as;
}

Proiectarea Algoritmilor - curs 28


10
10.2. Implementarea metodei
backtracking
int valid(int k,int st[ ])
{
ev=1;
for (i=1;i<=k-1;i++)
if (st[i]==st[k]) ev=0;
return ev;
}

Proiectarea Algoritmilor - curs 29


10
int solutie(int k)
{
if ( k==n ) return 1;
else return 0;
}
void tipar(void)
{
for(i=1;i<=n;i++)
cout<<" "<<st[i];
cout<<"\n";
}

Proiectarea Algoritmilor - curs 30


10
int main(void)
{
cout<<"Dati n = "; cin>>n;
k=1; init(k,st);
while (k>0)
{
do{
as=succesor(k,st);
if (as) ev=valid(k,st);
}while (!( !as || (as && ev)));
if (as)
if (solutie(k)) tipar();
else
{
k++;
init(k,st);
}
else
k--;
}
}
Proiectarea Algoritmilor - curs 31
10

Proiectarea Algoritmilor - curs 32


10
Problema 2:
Fiind dat o tabl de ah, de dimensiune n*n, se
cer toate soluiile de aranjare a n regine, astfel nct s
nu se afle dou regine pe aceeai linie, coloan sau
diagonal (reginele s nu se atace reciproc).
Afiarea s se fac astfel:

Exemplu: Pentru n=4 se va afia:


Soluia 1 : Soluia 2 :
*R** **R*
***R R***
R*** ***R
**R* *R**

Proiectarea Algoritmilor - curs 33


# include <iostream.h>
10
# include <math.h>

int st[100];
int k,n,i,a;
int ev,as;

void init(void)
{ st[k]=0; }

int succesor(void)
{
if(st[k]<n)
{
st[k]=st[k]+1;
as=1;
}
else as=0;
return as;
} Proiectarea Algoritmilor - curs 34
int valid(void) 10
{
int i;
ev=1;
for(i=0;i<=k-1;i++)
if(st[k]==st[i]) ev=0;
for(i=0;i<=k-1;i++)
if(abs(k-i)==abs(st[k]-st[i])) ev=0;
return ev;
}

int solutie(void)
{
if(k==n) return 1;
else return 0;
}

Proiectarea Algoritmilor - curs 35


10
void tipar(void)
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
if(st[i]==j) cout<<" R ";
else cout<<" * ";
cout<<endl;
}
}

Proiectarea Algoritmilor - curs 36


10
int main(void)
{
cout<<Dati numarul de regine = ; cin>>n;
k=1; init(k,st);
while (k>0)
{
do{
as=succesor(k,st);
if (as) ev=valid(k,st);
}while (!( !as || (as && ev)));
if (as)
if (solutie(k)) tipar();
else
{
k++;
init(k,st);
}
else
k--;
}
}
Proiectarea Algoritmilor - curs 37
10

Proiectarea Algoritmilor - curs 38


10

Proiectarea Algoritmilor - curs 39


10
Problema 3:
Sa se genereze toate permutarile multimii
{1,2,..,n} cu proprietatea ca diferenta in modul
dintre oricare doua numere consecutive este cel
putin egala cu valoare v citita de la tastatura.

Exemplu:
Pentru n=4 si v=2 singurele solutii sunt:
(2,4,1,3) si (3,1,4,2)

Proiectarea Algoritmilor - curs 40


# include <iostream.h>
10
# include <math.h>

int st[100];
int k,n,i,v;
int ev,as;

void init(void)
{ st[k]=0; }

int succesor(void)
{
if(st[k]<n)
{
st[k]=st[k]+1;
as=1;
}
else as=0;
return as;
} Proiectarea Algoritmilor - curs 41
int valid(void)
10
{
int i;
ev=1;
for(i=0;i<k;i++)
if(st[k]==st[i]) ev=0;
if(k>1)
if(abs(st[k]-st[k-1])<v) ev=0;
return ev;
}
int solutie(void)
{
if(k==n) return 1;
else return 0;
}
void tipar(void)
{
int i;
cout<<"(";
for(i=1;i<=n;i++)
if(i<n) cout<<st[i]<<",";
else cout<<st[i];
cout<<")"<<endl;
}
Proiectarea Algoritmilor - curs 42
int main() 10
{
cout<<"Dati numarul n= ";cin>>n;
cout<<"Dati numarul v= ";cin>>v;
k=1; init();
while(k>0)
{
do
{
as=succesor();
if(as==1) ev=valid();
}while( !((!as) || (as && ev)) );
if(as==1)
if(solutie()==1) tipar();
else
{
k++; init();
}
else k--;
}
}

Proiectarea Algoritmilor - curs 43


10

Proiectarea Algoritmilor - curs 44


10

Coninutul cursului

10.1. Prezentarea generala a metodei


10.2. Implementarea metodei backtracking
10.3. Probleme propuse spre rezolvare

Proiectarea Algoritmilor - curs 45


10

Problema 1
Sa se genereze toate aranjamentele multimii {1, 2, ,
n}, cu cate p elemente.

Exemplu:
Pentru n = 5 si p = 3 se vor afisa multimile:
(1,2,3), (1,3,2), (2,1,3), (2,3,1), (3,1,2), (3,2,1);
(1,2,4), (1,4,2), (2,1,4), (2,4,1), (4,1,2), (4,2,1);
(1,2,5), (1,5,2), (2,1,5), (2,5,1), (5,1,2), (5,2,1);
(1,3,4), (1,4,3), (3,1,4), (3,4,1), (4,1,3), (4,3,1);
(1,3,5), (1,5,3), (3,1,5), (3,5,1), (5,1,3), (5,3,1);
(1,4,5), (1,5,4), (4,1,5), (4,5,1), (5,1,4), (5,4,1),
s.a.m.d.

Proiectarea Algoritmilor - curs 46


10

Problema 2

Sa se genereze toate combinarile multimii


{1, 2, , n}, cu cate p elemente.

Exemplu:
Pentru n = 5 si p = 3 se vor afisa multimile:
(1,2,3), (1,2,4), (1,2,5), (1,3,4), (1,3,5), (1,4,5),
(2,3,4), (2,3,5), (3,4,5).

Proiectarea Algoritmilor - curs 47


10

Problema 3
Se considera un numar n natural nenul si se
cere sa se afiseze toate descompunerile
numarului n in suma de numere naturale.

Exemplu:
Pentru n=5 se vor afisa valorile:
1+1+1+1+1
1+1+1+2; 1+1+2+1; 1+2+1+1; 2+1+1+1
1+2+2; 2+1+2; 2+2+1
1+4; 4+1
2+3; 3+2
5 Proiectarea Algoritmilor - curs 48
10

Problema 4
S se afieze toate posibilitile de
aezare a n ture pe o tabl de ah de n*n
astfel nct s nu se atace una pe celalalt.

Exemplu: pentru n=3


Soluia 1 : Soluia 2 :
*T* *T*
**T T**
T* * **T
s.a.m.d.
Proiectarea Algoritmilor - curs 49
10

Problema 5

S se descompun un numr natural N, n


toate modurile posibile, ca sum de P numere
naturale (P<=N).

Exemplu:
Pentru n=5 si p=3 se obtin solutiile:
1+1+3; 1+3+1; 3+1+1;
1+2+2; 2+1+2; 2+2+1;

Proiectarea Algoritmilor - curs 50


10

Problema 6
Avem la dispoziie 6 culori: alb, galben, rou, verde, albastru i
negru. S se precizeze toate drapelele tricolore care se pot proiecta,
tiind c trebuie respectate urmtoarele reguli:
orice drapel are culoarea din mijloc galben sau verde;
cele trei culori de pe drapel sunt distincte.

Exemple: "alb galben rou", "rou verde galben"


Indicatii: Folosim o stiv cu 3 nivele, reprezentnd cele trei culori de pe
drapel i codificm culorile prin numere:
1 alb
2 galben
3 rou
4 verde
5 albastru
6 - negru
Proiectarea Algoritmilor - curs 51
10

ntrebri?

Proiectarea Algoritmilor - curs 52

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