FUNDAMENTELE
PROGRAMĂRII
Laura Dioşan
Metode de rezolvare a problemelor
Backtracking
UNIVERSITATEA BABEŞ-BOLYAI
Facultatea de Matematică şi Informatică
Conținut curs Introducere în procesul de dezvoltare software Programare procedurală Programare modulară Tipuri definite de utilizator Principii de dezvoltare a aplicațiilor soft Testarea și inspectarea programelor Recursivitate Complexitatea algoritmilor Metode de rezolvare a problemelor
Backtracking Divide et impera Programare dinamică Greedy
Algoritmi de căutare Algoritmi de sortare Recapitulare
Ianuarie, 2016 Fundamentele programării - tehnici de rezolvare a problemelor 2
Sumar
Rezolvarea problemelor
Tipologie
Tehnici
Divide et impera
Backtracking
Ianuarie, 2016 Fundamentele programării - tehnici de rezolvare a problemelor 3
Probleme
Tipologie
În funcție de structură
Care pot fi descompuse în sub-probleme
Căutarea unui element într-un vector
Care nu pot fi descompuse
Amplasarea reginelor pe o tablă de șah
În funcție de numărul de soluții
Cu o singură soluție
Sortarea unui vector
Cu mai multe soluții
Generarea permutărilor
Ianuarie, 2016 Fundamentele programării - tehnici de rezolvare a problemelor 4
Probleme
Tipologie
În funcție de posibilitățile de rezolvare
Rezolvabile în mod determinist
Calculul sinusului unui unghi sau a rădăcinii pătrate dintr-un număr
Rezolvabile în mod stocastic (euristic)
Probleme din lumea reală proiectarea unui ABS
Presupun căutarea unei soluţii
Ianuarie, 2016 5 Fundamentele programării - tehnici de rezolvare a problemelor
Probleme
Tipologie
În funcție de complexitatea temporală a rezolvării
Probleme din clasa P – rezolvabile în timp polinomial (n2, n3, ...)
sortări
Probleme din clasa NP – rezolvabile în timp non polinomial (2n, n!,, ..)
Cel mai scurt drum într-un graf de orașe
Ianuarie, 2016 6 Fundamentele programării - tehnici de rezolvare a problemelor
Probleme
Tipologie În funcție de scop
Probleme de căutare/optimizare
Planificare, proiectare Mersul trenurilor proiectarea sateliţilor
Probleme de modelare
Predicţii, clasificări
Predictia cursului valutar Predictia aparitiei unei maladii
Probleme de simulare
Teoria jocurilor economice
Productie cerere-oferta
Speculatii bursiere
model intrări ieşiri
model intrări ieşiri
model intrări ieşiri
Ianuarie, 2016 7 Fundamentele programării - tehnici de rezolvare a problemelor
Rezolvarea problemelor
Constă în identificarea unei soluţii
În informatică proces de căutare
În inginerie şi matematică proces de optimizare
Cum?
Reprezentarea soluţiilor (parţiale) puncte în spaţiul de căutare
Proiectarea unor operatori de căutare transformă o posibilă soluţie în altă soluţie
Ianuarie, 2016 8 Fundamentele programării - tehnici de rezolvare a problemelor
Paşi în rezolvarea problemelor
Definirea problemei
Analiza problemei
Alegerea unei tehnici de rezolvare
căutare
reprezentarea cunoştinţelor
abstractizare
Ianuarie, 2016 9 Fundamentele programării - tehnici de rezolvare a problemelor
Paşi în rezolvarea problemelor prin căutare –
Alegerea unei tehnici de rezolvare
Rezolvarea prin utilizarea regulilor (în combinaţie cu o strategie de control) de deplasare în spaţiul problemei până la găsirea unui drum între starea iniţială şi cea finală
Rezolvare prin căutare
Examinarea sistematică a stărilor posibile în vederea identificării
unui drum de la o stare iniţială la o stare finală
unei stări optime
Spaţiul stărilor = toate stările posibile + operatorii care definesc legăturile între stări
Ianuarie, 2016 10 Fundamentele programării - tehnici de rezolvare a problemelor
Paşi în rezolvarea problemelor prin căutare –
Alegerea unei tehnici de rezolvare
Rezolvare prin căutare
Multiple strategii de căutare cum alegem o
strategie?
Complexitatea computaţională (temporală şi spaţială)
Completitudine algoritmul se sfârşeşte întotdeauna şi găseşte o
soluţie (dacă ea există)
Optimalitate algoritmul găseşte soluţia optimă (costul optim al
drumului de la starea iniţială la starea finală)
Ianuarie, 2016 11 Fundamentele programării - tehnici de rezolvare a problemelor
Paşi în rezolvarea problemelor prin căutare –
Alegerea unei tehnici de rezolvare
Rezolvare prin căutare Strategii de căutare multiple cum alegem
o strategie? Complexitatea computaţională (temporală şi spaţială)
Performanţa strategiei depinde de:
Timpul necesar rulării
Spaţiul (memoria) necesară rulării
Mărimea intrărilor algoritmului
Viteza calculatorului
Calitatea compilatorului
Se măsoară cu ajutorul complexităţii Eficienţă computaţională
Spaţială memoria necesară identificării soluţiei
S(n) – cantitatea de memorie utilizată de cel mai bun algoritm A care rezolvp o problemă de decizie f cu n date de intrare
Temporală timpul necesar identificării soluţiei
T(n) – timpul de rulare (numărul de paşi) al celui mai bun algoritm A care rezolvă o problemă de decizie f cu n date de intrare
Factori interni
Factori externi
Ianuarie, 2016 12 Fundamentele programării - tehnici de rezolvare a problemelor
Paşi în rezolvarea problemelor prin căutare –
Alegerea unei tehnici de rezolvare
Rezolvarea problemelor prin căutare poate consta în:
Construirea progresivă a soluţiei
Identificarea soluţiei potenţiale optime
Ianuarie, 2016 13 Fundamentele programării - tehnici de rezolvare a problemelor
Paşi în rezolvarea problemelor prin căutare –
Alegerea unei tehnici de rezolvare
Rezolvarea problemelor prin metode clasice
Metode exacte
Metoda generării și testării
backtracking
Metoda divizării -> Divide et Impera
Metoda programării dinamice
Metode euristice
Metoda greedy
Ianuarie, 2016 14 Fundamentele programării - tehnici de rezolvare a problemelor
Gnerează și testează Ideea de bază
Generarea unei posibile soluții și verificarea corectitudinii ei
Trial and error
Căutare exhaustivă
Mecanism Generare:
determinarea tuturor soluțiilor posibile
Testare: căutarea acelor soluții care sunt corecte (respectă anumite
condiții)
Când se poate folosi Probleme care pot avea mai multe soluții
Probleme cu constrângeri (ale căror soluții trebuie să respecte anumite condiții)
Ianuarie, 2016 Fundamentele programării - tehnici de rezolvare a problemelor 15
Generează și testează
Algoritm
Ianuarie, 2016 Fundamentele programării - tehnici de rezolvare a problemelor 16
#D = D(D1) = D(D1(D2))... def generate_test(D): while (True): sol = generate_solution() if (test(sol) == True): return sol
Generează și testează
Exemple
Generarea permutărilor cu n=3 elemente
Analiza complexității
Numărul de soluții posibile: 33, adică nn
Ianuarie, 2016 Fundamentele programării - tehnici de rezolvare a problemelor 17
start
1
1
1 2 3
2
1 2 3
3
1 2 3
2
1
1 2 3
2
1 2 3
3
1 2 3
3
1
1 2 3
2
1 2 3
3
1 2 3
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, 2, 3] [1, 3, 2] [2, 1, 3] [2, 3, 1] [3, 1, 2] [3, 2, 1]
Generează și testează
Algoritm
Adăugarea de condiții la generarea unei soluții
nu se mai explorează toate soluțiile posibile
se construiesc soluții (parțial) corecte
care respectă anumite condiții
Ianuarie, 2016 Fundamentele programării - tehnici de rezolvare a problemelor 18
#D = D(D1) = D(D1(D2))... def generate_test(D): while (True): sol = generate_solution_cond() if (test(sol) == True): return sol
Generează și testează Algoritm
Backtracking Spațiul de căutare a unei soluții s
este S (domeniul de definiție) O soluție
este formată din mai multe elemente (s[0], s[1], s[2],...)
Funcția init generează o valoare nulă pentru domeniul de definiție
al soluției Funcția getNext
returnează succesorul (din domeniul de definiție) al unui element al soluției
Funcția isConsistent verifică dacă o soluție (parțială) este corectă
Funcția isSolution verifică dacă o soluție (parțială) este soluție finală
(completă) a problemei
Ianuarie, 2016 Fundamentele programării - tehnici de rezolvare a problemelor 19
Generează și testează
Exemple
Generarea permutărilor cu n=3 elemente
Backtracking - variantă iterativă
Ianuarie, 2016 Fundamentele programării - tehnici de rezolvare a problemelor 20
def init(): return 0 def getNext(sol, pos): return sol[pos] + 1 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 return isCons def isSolution(solution, n): return len(solution) == n
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)
Generează și testează
Exemple
Generarea permutărilor cu n=3 elemente
Backtracking - variantă recursivă
Ianuarie, 2016 Fundamentele programării - tehnici de rezolvare a problemelor 21
def init(): return 0 def getNext(sol, pos): return sol[pos] + 1 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 return isCons def isSolution(solution, n): return len(solution) == n
def permut_back_rec(n, solution): initValue = init() solution.append(initValue) elem = getNext(solution, len(solution) - 1) while (elem <= n): solution[len(solution) - 1] = elem if (isConsistent(solution) == True): if (isSolution(solution, n) == True): print(solution) else: permut_back_rec(n, solution[:]) elem = getNext(solution, len(solution) - 1) sol = [] permut_back_rec(3, sol)
start
1
1
1 2 3
2
1 2 3
3
1 2 3
2
1
1 2 3
2
1 2 3
3
1 2 3
3
1
1 2 3
2
1 2 3
3
1 2 3
Generează și testează
Exemple
Backtracking
Analiza complexității
Ianuarie, 2016 Fundamentele programării - tehnici de rezolvare a problemelor 22
Generează și testează
Exemple
Generarea turnurilor de m cuburi care nu se răstoarnă având la dispoziție n cuburi
Backtracking - variantă iterativă
Ianuarie, 2016 Fundamentele programării - tehnici de rezolvare a problemelor 23
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)
def towers(n, m): 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)
Recapitulare
Generează și testează
exhaustiv
backtracking
Ianuarie, 2016 Fundamentele programării - tehnici de rezolvare a problemelor 24
Cursul următor
Rezolvarea problemelor prin metode clasice
Metode exacte
Metoda generării și testării
Metoda divizării -> Divide et Impera
Metoda programării dinamice
Metode euristice
Metoda greedy
Ianuarie, 2016 Fundamentele programării - tehnici de rezolvare a problemelor 25
Materiale de citit şi legături utile
1. Limbajul Python http://docs.python.org/3/reference/index.html
2. Biblioteca standard Python http://docs.python.org/3/library/index.html
3. Tutorial Python http://docs.python.org/3/tutorial/index.html
4. Frentiu, M., H.F. Pop, Fundamentals of Programming, Cluj University Press, 2006, 220 pagini
5. Kent Beck.Test Driven Development: By Example. Addison-Wesley Longman, 2002 http://en.wikipedia.org/wiki/Test-driven_development
6. Martin Fowler. Refactoring. Improving the Design of Existing Code. Addison-Wesley, 1999 http://refactoring.com/catalog/index.html
Ianuarie, 2016 Fundamentele programării - tehnici de rezolvare a problemelor 26
Informaţiile prezentate au fost colectate din diferite surse de pe internet, precum şi din cursurile de Fundamentele Programării ţinute în anii anteriori de către:
Lect. Dr. Adriana Guran – www.cs.ubbcluj.ro/~adriana
Lect. Dr. Istvan Czibula - www.cs.ubbcluj.ro/~istvanc
Lect. Dr. Andreea Vescan -www.cs.ubbcluj.ro/~avescan
Lect. Dr. Ioan Lazăr -www.cs.ubbcluj.ro/~ilazar
Ianuarie, 2016 27 Fundamentele programării - tehnici de rezolvare a problemelor