Documente Academic
Documente Profesional
Documente Cultură
FUNDAMENTELE
PROGRAMRII
Metode de rezolvare a problemelor
Backtracking
Divide et impera
Laura Dioan
Coninut curs
Backtracking
Divide et impera
Programare dinamic
Greedy
Algoritmi de cutare
Algoritmi de sortare
Recapitulare
Decembrie, 2013
Sumar
Rezolvarea problemelor
Tipologie
Tehnici
Divide et impera
Backtracking
Decembrie, 2013
Probleme
Tipologie
n funcie de structur
Cu
Cu
Decembrie, 2013
o singur soluie
Sortarea unui vector
mai multe soluii
Generarea permutrilor
Fundamentele programrii - tehnici de rezolvare a problemelor
Probleme
Tipologie
Decembrie, 2013
Probleme
Tipologie
Decembrie, 2013
Probleme
Tipologie
n funcie de scop
Probleme de cutare/optimizare
intrri
Probleme de modelare
Predicii, clasificri
intrri
model
ieiri
Probleme de simulare
Decembrie, 2013
model
ieiri
intrri
model
ieiri
Rezolvarea problemelor
Cum?
Decembrie, 2013
Definirea problemei
Analiza problemei
cutare
reprezentarea cunotinelor
abstractizare
Decembrie, 2013
Decembrie, 2013
10
Decembrie, 2013
11
Decembrie, 2013
12
Decembrie, 2013
13
Metode exacte
Metode euristice
Decembrie, 2013
Metoda greedy
14
Gnereaz i testeaz
Ideea de baz
Mecanism
Decembrie, 2013
15
Genereaz i testeaz
Algoritm
#D = D(D1) = D(D1(D2))...
def generate_test(D):
while (True):
sol = generate_solution()
if (test(sol) == True):
return sol
Decembrie, 2013
16
Genereaz i testeaz
Exemple
def permut3():
for i in range(1,4):
for j in range(1,4):
for k in range(1, 4):
#generate
possibleSolution = [i,j,k]
#test
if ((i != j) and (j != k) and (k != i)):
print(possibleSolution)
[1,
[1,
[2,
[2,
[3,
[3,
2,
3,
1,
3,
1,
2,
3]
2]
3]
1]
2]
1]
Analiza complexitii
1
1
1
2
3
Decembrie, 2013
3
3
1
3
2
3
3
3
1
3
2
3
3
3
17
Genereaz i testeaz
Algoritm
Backtracking
Decembrie, 2013
18
Genereaz i testeaz
Exemple
def init():
return 0
def permut_back(n):
k = 0
solution = []
initValue = init()
solution.append(initValue)
while (k>= 0):
isSelected = False
while ((isSelected==False) and
(solution[k]<getLast(n))):
solution[k] = getNext(solution, k)
isSelected = isConsistent(solution)
if (isSelected == True):
if (isSolution(solution,n) == True):
print(solution)
else:
k = k + 1
solution.append(init())
else:
del(solution[k])
k = k - 1
permut_back(3)
Decembrie, 2013
19
Genereaz i testeaz
Exemple
def init():
return 0
sol = []
permut_back_rec(3, sol)
Decembrie, 2013
20
Genereaz i testeaz
Exemple
Backtracking
Analiza complexitii
start
1
1
1
2
3
Decembrie, 2013
3
3
1
3
2
3
3
3
1
3
2
3
3
3
21
Genereaz i testeaz
Exemple
cubes = [10,2, 5, 6, 7]
def init():
return 0
def getNext(sol, pos):
return sol[pos] + 1
def getLast(n):
return n
def isConsistent(sol):
isCons = True;
i = 0
while ((i<len(sol)-1) and (isCons==True)):
if (sol[i] == sol[len(sol) - 1]):
isCons = False
else:
i = i + 1
if (len(sol) > 1):
if (cubes[sol[len(sol) - 1] - 1] >
cubes[sol[len(sol) - 2] - 1]):
return False
return isCons
def isSolution(solution, n):
return len(solution) == n
def print_sol(solution):
tower = []
for s in solution:
tower.append(cubes[s - 1])
print(tower)
Decembrie, 2013
k = 0
solution = []
initValue = init()
solution.append(initValue)
while (k>= 0):
isSelected = False
while ((isSelected == False) and
(solution[k] < getLast(n))):
solution[k] = getNext(solution, k)
isSelected = isConsistent(solution)
if (isSelected == True):
if (isSolution(solution,m) == True):
print_sol(solution)
else:
k = k + 1
solution.append(init())
else:
del(solution[k])
k = k - 1
towers(len(cubes), 4)
22
Divide et impera
Ideea de baz
Mecanism
Decembrie, 2013
23
Divide et impera
Algoritm
#D = d1 U d2 U d3...U dn
def div_imp(D):
if (size(D) < lim):
return rez
rez1 = div_imp(d1)
rez2 = div_imp(d2)
...
rezn = div_imp(dn)
return combine(rez1, rez2, ..., rezn)
Decembrie, 2013
24
Divide et impera
Exemple
Size(problema) = n
Versiunea 1
Size(sub-problema1) = n -1
Size(sub-problema2) = n-2 def
...
adic:
D = l = [l1,l2,..,ln],
d1 = [l2,..,ln],
d2 = [l3,..,ln],
...
1,
n 1
T ( n)
T (n 1) 1, altfel
T (n) T (n 1) 1
T (n 1) T (n 2) 1
...
T (2) T (1) 1
T (n) 1 1 .. 1 n O(n)
Decembrie, 2013
findMax(l):
'''
descr: finds the maximul elem of a list
data: a list
res: the maximal elem of list
'''
if (len(l) == 1):
return l[0]
max = findMax(l[1:])
if (max > l[0]):
return max
else:
return l[0]
def test_findMax():
assert findMax([2,5,3,6,1]) == 6
assert findMax([12,5,3,2,1]) == 12
assert findMax([2,5,3,6,11]) == 11
test_findMax()
25
Divide et impera
Exemple
Size(problema) = n
Versiunea 2
Size(sub-problema1) = n/2
Size(sub-problema2) = n/2
adic:
D = l = [l1,l2,..,ln],
d1 = [l1,..,ln/2],
d2 = [ln/2+1,..,ln]
1,
n 1
T ( n)
2 * T (n / 2) 1, altfel
n 2 k k log 2 n
T (2 k ) 2 * T (2 k -1 ) 1
2 * T (2 k -1 ) 2 2 * T (2 k -2 ) 2
2 2 * T (2 k -2 ) 23 * T (2 k -2 ) 2 2
...
2
k 1
* T ( 2) 2 * T ( 2 ) 2
k
k 1
T (n) 1 21 2 2 .. 2 k (2 k 1 1) /( 2 1)
T (n) 2 k * 2 1 2n 1 O(n)
Decembrie, 2013
def findMax_v2(l):
'''
descr: finds the maximul elem of a list
data: a list
res: the maximal elem of list
'''
if (len(l) == 1):
return l[0]
middle = len(l) // 2
max_left = findMax_v2(l[0:middle])
max_right = findMax_v2(l[middle:len(l)])
if (max_left < max_right):
return max_right
else:
return max_left
def test_findMax_v2():
assert findMax_v2([2,5,3,6,1]) == 6
assert findMax_v2([12,5,3,2,1]) == 12
assert findMax_v2([2,5,3,6,11]) == 11
test_findMax_v2()
26
Recapitulare
Divide et impera
Genereaz i testeaz
exhaustiv
backtracking
Decembrie, 2013
27
Cursul urmtor
Metode exacte
Metode euristice
Metoda greedy
Decembrie, 2013
28
Limbajul Python
http://docs.python.org/3/reference/index.html
2.
3.
Tutorial Python
http://docs.python.org/3/tutorial/index.html
4.
5.
6.
Decembrie, 2013
29
Decembrie, 2013
30