Sunteți pe pagina 1din 11

1.

GENERALITATI

Limbajul C++ este un limbaj de programare de nivel înalt ca dificultate si permite


celor ce il utilizeaza o mai buna invatare a algoritmilor teoretici.
Enunţ aplicaţie:
Generaţi toate șirurile de “n”(n-numǎr par) paranteze rotunde, astfel
încât acestea sǎ se închidǎ corect.

Metoda backtracking

Probleme de generare. Oportunitatea utilizarii metodei backtracking

Prezentare generala
Aceasta metoda generala de programare se aplca problemelor in care solutia se poate
reprezenta sub forma unui vector X = (x1, ..., xn). Pentru fiecare problema concreta sunt
date anumite relatii intre componentele x1, ..., xn ale vectorului X, numite conditii interne.
Multimea finita S = S1 x S2 x ... x Sn se numeste spatiul solutiilor posibile ( este un produs
cartezian ). Solutiile posibile care satisfac conditiile interne se numesc solutii rezultat.
Ceea ce ne propunem este de a determina toate solutiile rezultat, cu scopul de a le afisa
sau de a alege dintre ele una care maximizeaza sau minimizeaza o eventuala functie
obiectiv data.
O metoda simpla de determinare a solutiilor rezultat consta in generarea intr-un mod
oarecare toate solutiile posibile si de a verifica daca ele satisfac conditiile interne.
Dezavantajul consta in faptul ca timpul cerut de aceasta investigare exhaustiva este foarte
mare. Astfel, chiar pentru |Si| = 2, oricare ar fi i, timpul necesar este de ordinul 2 la
puterea n, deci exponential.
Metoda backtracking urmareste sa evite generarea tuturor solutiilor posibile. In acest
scop, elementele vectorului X primesc pe rand valori in sensul ca lui xk i se atribuie o
valoare numai daca au fost atribuite deja valori lui x1, ..., xk-1. Mai mult, o data o valoare
pentru xn stabilita, nu se trece direct la atribuirea da valori lui xk+1, neindeplinirea lor
exprimand faptul ca oricum am alege xk+1, ..., xn nu vom putea ajunge la o solutie
rezultat, adica o conditite pentru care conditiile interne sa fie satisfacute. Evident ca in
cazul neindeplinirii conditiilor de continuare va trebui sa facem o alta alegere pentru xk,
sau daca Sk a fost epuizat sa micsoram pe k cu o unitate incercand sa facem o noua
alegere pentru xk, etc. Aceasta micsorare a lui k da numele metodei, ilustrand faptul ca
1
atunci cand nu mai putem avansa, urmarim inapoi secventa curenta din solutie. Este
evident ca intre conditiile de continuare si conditiile interne exista o stransa legatura. O
buna alegere pentru conditiile de continuare are ca efect o importanta reducere a
numarului de calcule.
Metoda backtracking poate fi reprezentata usor, pe un arbore construit astfel:
- nivelul 1 contine radacina;
- din orice varf de pe nivelul k pleaca sk muchii spre nivelul k+1 etichetati cu cele sk
muchii ale lui Sk.
Nivelul n+1 va contine s1 * s2 * ... *sn varfuri. Pentru fiecare varf de pe nivelul n+1,
etichetele muchiilor continute pe drumul ce leaga radacina de acest varf reprezinta o
solutie posibila.

Exemplu - Sa consideram problema submultimilor de suma data care consta in


urmatoarele: Fie A = (a1, a2, ..., an) cu ai > 0, oricare ar fi i. Fie M inclus in R. Se cauta
toate submultimile B ale lui A pentru care suma elementelor este M.
Pentru a putea realiza problema prin metoda backtracking vom reprezenta solutia sub
forma x = (x1, ..., xn) unde xi = 1 daca ai inclus in B si xi = 0 in caz contrar. Sa ne situam
in ipoteza ca n = 4.
Castigul obtinut prin introducerea conditiilor de continuare consta in faptul ca, daca intr-
un varf ele nu mai sunt verificate, se va renunta la parcurgerea subarborelui care are ca
radacina acest varf.
Acest exemplu permite prezentarea unei variante a metodei backtracking. Intr-adevar, sa
consideram drept solutie posibila o valoare k <= n impreuna cu cuplul (x1, ...,xk) unde
pentru i inclus in {1, ..., k}, xi reprezinta indicele elementului pe care il introducem in B.
Evident xi este diferit de xj pentru i diferit de j. Pentru a nu se repeta solutii, vom
presupune x1 < x2 < ... < xn.
Diferite variante ale metodei backtracking nu schimba esenta ei care consta in faptul ca
este reprezentabila pe un arbore care este parcurs "coborand" in arbore numai daca
exista sanse de a ajunge la o solutie rezultat.
In continuare, problemele care vor fi prezentate vor urma o schema generala si anume:
- se va testa daca am obtinut o solutie, situatie in care aceasta se va retine;
- daca nu am obtinut o solutie se incearca plasarea unui nou element in vectorul solutie cu
respectarea conditiilor de continuare.
- daca nu se reuseste plasarea unui nou element si spatiul valorilor posibile de plasat s-a
epuizat, se revine la pozitia anterioara si se incearca sa se plaseze pe ea un alt element.
Faptul ca dupa plasarea unui element in vectorul solutie algoritmul presupune plasarea
unui element pe pozitia imediat urmatoare, adica de fapt reluarea algoritmului, conduce
posibilitatea abordarii recursive a algoritmilor de tip backtracking. Acest lucru permite o
scriere mult mai scurta si mai simpla a algoritmilor si apoi a programelor care ii
implementeaza. Astfel, general, un algoritm backtracking poate fi prezentat astfel:

pentru ficare valoare i din multimea Sk executa


xk <-i
daca X respecta conditiile interne atunci
daca X este solutie atunci
afiseaza X
altfel
2
apeleaza back(k+1)
sfdaca
sfdaca
sfpentru

In functie de problema concreta, in algoritmul descris mai sus se vor modifica doar
instructiunea pentru, conditiile interne si cele de solutie, structura algoritmului pastrandu-
se. Problemele care se rezolva prin metoda backtracking pot fi impartite in mai multe
grupuri de probleme cu rezolvari asemanatoare, in functie de modificarile pe care le vom
face in algoritm. Principalele grupuri de probleme sunt:
a) Probleme in care vectorul solutie are lungime fixa si fiecare element apare o singura
data in solutie;
b) Probleme in care vectorul solutie are lungime variabila si fiecare element poate sa
apara de mai multe ori in solutie;
c) Probleme in plan, atunci cand spatiul in care ne deplasam este un tablou
bidimensional.

3
2.MEMORIU JUSTIFICATIV

Am ales aceasta lucrare deoarece trateaza o parte deosebit de importanta a


programarii si anume generarea de subșiruri dintr-un șir dat.
Tema poate constitui un excelent material didactic la orele de informatica dar si un
soft util pentru acei elevi ce doresc sa-si aprofundeze cunostintele in domeniu.

4
3.Rezolvare teoretica

In rezolvarea temei am abordat o implementare modulara a programului, care trateaza


separat fiecare operatie in parte si anume :
-partea de generare a fost tratata prin metoda backtracking,metoda ce include
procedurile de baza:initializari,valid,tipar si bktr .
-paranteza deschisa a fost notata cu 1, cea inchisa cu -1.

5
4.SCHEMA LOGICA BLOC

MENIU

PROGRAM IESIRE

INITIALIZ TIPAR VALID BKTR


ARI

STOP

6
5.LISTING-UL PROGRAMULUI

#include<iostream>
#include<conio.h>
using namespace std;
int st[10], n, k;

void init()
{ int i;
for(i=1; i<=n; i++)
st[i]=0;
}

int valid(int k)
{
int i,s;
s=0;
for(i=1; i<=k; i++)
s=s+st[i];
if((k<n) && (s<0))
return 0;

if((k==n)&&(s!=0))
return 0;
return 1;
}

void tipar()
{
int i;
for(i=1;i<=n;i++)
if(st[i]==-1)
cout<<')'<<' ';
else
cout<<'('<<' ';
cout<<endl;
}
7
void bktr(int k)
{
int i;
for(i=-1; i<=1; i=i+2)
{
st[k]=i;
if(valid(k))
if(k==n)
tipar();
else
bktr(k+1);
}
}

void introducere()
{
cout<<"Introduceti numarul de paranteze: ";
cin>>n;
}

void meniu()
{char c,w;
do
{
cout<<"0-Introducere date"<<endl;
cout<<"1-Afisarea solutii"<<endl;
cout<<"2-Parasire program"<<endl;
cout<<"Introduceti optiunea: ";
cin>>c;
if(c=='0')
{
introducere();
}
if(c=='1')

8
{
init();
bktr(1);
cout<<endl;
cout<<"apasati o litera";
cin>>w;
}
}while(c!='2');
}

int main()
{
meniu();
return 0;
}

9
6.BIBLIOGRAFIE

1.George Daniel Mateescu,Pavel Florin Moraru- Informatica – Manual


clasa a XI-a Niculescu,2001
2.Tudor Sorin – Algoritmi si limbaje de programare – Manual pentru clasa
aIX-a,Teora 1995

10
7.CUPRINS

1.Generalitati………………………………………..1
2.Memoriu justificativ……..………………………4
3.Rezolvare teoretica……………………………..5
4.Schema logica…………………………………..6
5.Listing program……………………………..…7
6.Bibliografie……………………………………10

11

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