Sunteți pe pagina 1din 2

METODA GREEDY Descrierea metodei - dandu-se o multime finita A, trebuie determinata o submultime a sa (S) care sa indeplineasca anumite conditii.

Metoda furnizeaza o singura solutie (solutia optima) - Solutia problemei este un vector ale carei elemente apartin unei singure multimi. Studiu de caz 1. Sa se repartizeze optim o resursa mai multor activitati care concureaza pentru a obtine resursa respectiva. 2. Sa se ocupe un mijloc de transport care are o capacitate maxima de ocupare cu n obiecte, fiecare obiect avand greutatea gi si un profit obtinut in urma transportului ci, iar din fiecare obiect putand sa se ia o fractiune xi din [0,1]. Metoda greedy construieste solutia prin selectarea, dintr-o multime de elemente, a elementelor care indeplinesc o anumita conditie. Pentru ca elementele care se selecteaza sa apartina solutiei optime, la pasul k se alege candidatul optim pentru elementul xk al solutiei. OBS alegerea elementului xk al solutiei este irevocabila. P1. Se initializeaza multimea S cu multimea vida P2. Cat timp S nu este solutie a problemei si A mai are elemente, executa P3. Se alege din A elementul a care este candidatul optim al solutiei P4. Se elimina elementul a din A P5. Daca el poate fi element al solutiei, atunci elementul a se adauga la multimea S. Se revine la P2 P6. Daca multimea S este solutia problemei, atunci se afiseaza solutia, altfel se afiseaza mesajul Nu s-a gasit solutie Pentru ca algoritmul greedy sa conduca la obtinerea solutiei optime, trebuie sa fie indeplinite 2 conditii: 1. Alegerea optimului local pentru fiecare element al solutiei duce la alegerea solutiei optime globale 2. Solutia optima a problemei contine solutiile optime ale subproblemelor. C1. multimea A este ordonata dupa criteriul candidatului optim. Ex. Repartizarea optima a resurselor o activitate nu poate incepe decat daca se termina cea anterioara. Din multimea de activitati se alege cel care are timpul de terminare cat mai mic. Ex. Ocuparea optima a mijlocului de transport trebuie ca eficienta transportului sa fie maxima. Din multimea obiectelor, se aleg obiectele care au eficienta de transport cat mai mare. METODA BACKTRACKING Descrierea metodei backtracking sa se genereze toate solutiile, o solutie a problemei putand fi data de un vector: S={x1, x2, , xn} ale carui elemente apartin, fiecare, unor multimi finite Ai (xi din Ai), iar asupra elementelor unei solutii exista anumite restrictii specifice problemei care trebuie rezolvata, numite conditii interne. Multimile Ai sunt multimi ale caror elemente sunt in relatii bine stabilite, multimile pot sa coincida sau nu. Metoda clasica de rezolvare: Pas 1. Se genereaza toate elementele produsului cartezian A1xxAn Pas 2. Se verifica fiecare element al produsului cartezian, daca indeplineste conditiile interne impuse ca sa fie solutie a problemei. Studiu de caz permutarile Metoda backtracking construieste progresiv vectorul solutiei, pornind de la primul element si adaugand la vector urmatoarele elemente, cu revenire la elementul anterior din vector, in caz de insucces. Elementul care trebuie adaugat se cauta in multime, printre elementele care respecta conditiile interne. Exemplu permutari Algoritmul metodei backtracking poate fi generalizat pentru orice problema care indeplineste urmatoarele conditii: 1. Solutia problemei poate fi pusa sub forma unui vector S={x 1,,xn} ale carui elemente xi apartin fiecare unei multimi Ai; 2. Multimile Ai sunt finite, iar elementele lor sunt numere intregi si se gasesc intr-o ordine bine stabilita. P1 Se alege primul element al solutiei S: x1 din A1. P2 Cat timp nu au fost parcurse toate elementele multimii A1 executa: P3 Pentru fiecare element al solutiei executa P4 Se presupune ca s-au gasit primele k elemente ale solutiei (x1, , xk) apartinand multimilor A1,,Ak si se trece la cautarea celui de al k+1-lea element al solutiei, xk+1, printre elementele multimii Ak+1.

Cautarea se va face astfel: se atribuie, pe rand, lui xk+1, elementele multimii Ak+1, pana se gaseste primul element care indeplineste conditia de continuare. P5 Daca exista un element ai in multimea Ak+1, astfel incat xk+1=ai sa apartina solutiei problemei, atunci se atribuie elementului xk+1 valoarea ai si se trece la P7; altfel, se trece la P6. P6 Deoarece s-au parcurs toate elementele multimii Ak+1 si nu s-a gasit niciun element ai care sa indeplineasca conditia de continuare, se revine la elementul xk si se considera generate primele k-1 elemente ale solutiei si pentru elementul xk se reia cautarea cu urmatorul element din multimea Ak, adica se reiau operatiile de la P4 pentru elementul xk al solutiei, insa nu cu primul element din multimea Ak ci cu elementul din multimea Ak care se gaseste imediat dupa cel care a fost atribuit anterior elementului xk. P7 Se verifica daca s-a gasit solutia problemei. Daca s-a gasit solutia problemei, atunci se afiseaza solutia: altfel, se trece la cautarea urmatorului element al solutiei, reluandu-se operatiile de la P4. Implementarea metodei Date si structuri - elementele xk se memoreaza intr-o structura de date de tip stiva (implementata static); - k varful stivei initial stiva are dimensiunea 1, corespunzatoare pozitiei de pornire si contine valoarea primului element al solutiei; - asr indica daca elementul xk din solutie mai are succesor; - ev pentru a sti daca succesorul gasit respecta conditia de continuare si poate fi elementul x k al solutiei; - n dimensiunea solutiei. Subprograme - init se initializeaza elementul din varful stivei, in acest element se va inregistra urmatorul element al solutiei. - succesor verifica daca in multimea Ak un element pentru nivelul k al solutiei - valid verifica daca valoarea atribuita elementului xk al solutiei indeplineste conditia de continuare, adica poate fi considerata ca face parte din solutia problemei - solutie verifica daca s-au obtinut toate elementele solutiei - tipar afiseaza elementele solutiei. Algoritmul iterativ
k = 0 init(0, st) While k > -1 Do succesor(asr, k, st) If asr Then valid(ev, k, st) End If Loop Until (Not asr) Or (asr And ev) If asr Then If solutie(k) Then tipar() Else k = k + 1 init(k, st) End If Else k = k - 1 End If End While