Documente Academic
Documente Profesional
Documente Cultură
GENERALITATI
Metoda 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.
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
4
3.Rezolvare teoretica
5
4.SCHEMA LOGICA BLOC
MENIU
PROGRAM IESIRE
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
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