Documente Academic
Documente Profesional
Documente Cultură
Curs12 PDF
Curs12 PDF
Technici de programare
strategii de rezolvare a problemelor mai dificile
algoritmi generali pentru rezolvarea unor tipuri de
probleme
de multe ori o problem se poate rezolva cu mai multe
technici se alege metoda mai eficient
problema trebuie s satisfac anumite criterii pentru a
putea aplica technica
descriem algoritmul general pentru fiecare technic
Complexitate timp
Recurena:
T (n)=
1 for n=1
{T (n1)+1
otherwise
T ( n)= T (n1)+1
T (n1)= T (n2)+1
T (n2)= T (n3)+1 => T (n)=1+1+...+1=n (n)
...= ...
T (2)= T (1)+1
Complexitate ca timp:
Recurena:
for n=1
{2 T (n /12)+1
otherwise
T (n)=
Notm:
n=2 k
2.
=>
(k 1)
T (2 )= 2 T (2
)+1
(k1)
2
(k 2)
2 T (2
)= 2 T ( 2
)+2
k =log2 n 2 2 T ( 2(k 2))= 2 3 T (2(k 3))+22
...= ...
2(k 1) T (2)= 2 k T (1)+2(k1)
k
(k +1)
=>
T (n) ( n)
(k / 2) (k /2)
x k = x(k / 2) x(k / 2) for k even
x
x
x for k odd
Backtracking
se aplic la probleme de cutare unde se caut mai multe soluii
genereaz toate soluiile (dac sunt mai multe) pentru problem
caut sistematic prin toate variantele de soluii posibile
este o metod sistematic de a itera toate posibilele configuraii n spaiu de cutare
este o technic general trebuie adaptat pentru fiecare problem n parte.
Dezavantaj are timp de execuie exponenial
[0,
[0,
[1,
[1,
[2,
[2,
1,
2,
0,
2,
0,
1,
2]
1]
2]
0]
1]
0]
numerele 0,1,2
Testare: se testeaz fiecare variant pentru a verifica dac este soluie.
x1
x2
x3
Probleme:
iniial se genereaz toate componentele listei, apoi se verifica dac lista este o permutare in
unele cazul nu era nevoie sa continum generarea (ex. Lista ce incepe cu 1,1 sigur nu conduce
la o permutare
nbuntiri posibile
s evitm crearea comlet a soluiei posibile n cazul n care tim cu siguran c nu se
ajunge la o soluie.
Dac prima component este 1, atunci nu are sens s asignam 1 s pentru a doua component
x1
x2
x3
[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,
[1,
...
0,
0,
0,
1,
1,
1,
2,
2,
2,
0,
0]
1]
2]
0]
1]
2]
0]
1]
2]
0]
[0,
[0,
[1,
[1,
[2,
[2,
1,
2,
0,
2,
0,
1,
2]
1]
2]
0]
1]
0]
[0,
[0,
[1,
[1,
[2,
[2,
1,
2,
0,
2,
0,
1,
2]
1]
2]
0]
1]
0]
backtracking([], 3)
Este mai bine dect varianta genereaz i testeaz, dar complexitatea ca timp de execuie este tot
exponenial.
Permutation problem
rezultat:
e o solutie:
8 Queens problem:
Plasai pe o tabl de sah 8 regine care nu se atac.
Ar trebui sa generm doar poziii care pot conduce la un rezultat (sa reducem spaiu de cutare)
Dac avem deja 2 regine care se atac nu ar trebui s mai continum cu aceast
configuraie
avem nevoie de toate soluiile
Backtracking
x[1..k] n S1 x S2 x ... x Sk este o soluie candidat; este o configuraie parial care ar putea conduce la rezultat; k
este numrul de componente deja construit;
consistent o funcie care verific dac o soluie parial este soluie candidat (poate conduce la rezultat)
soluie este o funcie care verific dac o soluie candidat x[1..k] este o soluie pentru problem.
Algoritm mai general (componentele soluiei pot avea domenii diferite (iau valori din domenii
diferite)
def backRec(x):
el = first(x)
x.append(el)
while el!=None:
x[-1] = el
if consistent(x):
if solution(x):
outputSolution(x)
backRec(x[:])
el = next(x)
Backtracking
Cum rezolvm problema folosind algoritmul generic:
trebuie sa reprezentm soluia sub forma unui vector X =( x 0, x1, ... x n ) S 0 x S 1 x ... x S n
definim ce este o soluie candidat valid (condiie prin care reducem spaiu de cutare)
definim condiia care ne zice daca o soluie candidat este soluie
def consistent(x):
"""
The candidate can lead to an actual
permutation only if there are no duplicate elements
"""
return isSet(x)
def solution(x):
"""
The candidate x is a solution if
we have all the elements in the permutation
"""
return len(x)==DIM
Backtracking iterativ
def backIter(dim):
x=[-1]
#candidate solution
while len(x)>0:
choosed = False
while not choosed and x[-1]<dim-1:
x[-1] = x[-1]+1 #increase the last component
choosed = consistent(x, dim)
if choosed:
if solution(x, dim):
solutionFound(x, dim)
x.append(-1) # expand candidate solution
else:
x = x[:-1] #go back one component