Este greu de spus forma general% a unei probleme rezolvabile cu tehnic% Greedy. Algoritmii greedy (greedy = lacom) sunt n general simpli i sunt folosi(i la probleme de optimizare, cum ar fi: s% se g%seasc% cea mai bun% ordine de executare a unor lucr%ri pe calculator, s% se g%seasc% cel mai scurt drum ntr-un graf etc. In cele mai multe situa(ii de acest fel avem: o mul(ime de elemente (lucr%ri de executat, vrfuri ale grafului etc) o func(ie care verific% dac% o anumit% mul(ime de candida(i constituie o soluie posibil!, nu neap%rat optim%, a problemei o func(ie care verific% dac% pentru o mul(ime de candida(i este posibil s% o complet%m astfel nct s% ob(inem o solu(ie posibil%, nu neap%rat optim%, a problemei o funcie de selecie care alege la orice moment cel mai potrivit element, nc% nefolosit o funcie soluie care spune cnd s-a ajuns la solu(ie. Pentru a rezolva problema o anumit% problem%, un algoritm greedy construiete solu(ia pas cu pas. Ini(ial, mul(imea candida(ilor selecta(i este vid%. La fiecare pas, ncerc%m s% ad%ug%m acestei mul(imi cel mai potrivit element, conform func(iei de selec(ie. Dac%, dup% o astfel de ad%ugare, mul(imea de elemente ob(inut% nu mai poate duce la solu(ie, se elimin% ultimul element ad%ugat; acesta nu va mai fi niciodat% considerat. Dac%, dup% ad%ugare, mul(imea de elemente selectate poate duce la solu(ie, ultimul element ad%ugat va r%mne de acum ncolo n ea. De fiecare dat% cnd l%rgim mul(imea elementelor selectate, verific%m dac% aceast% mul(ime nu constituie o solu(ie posibil% a problemei noastre. Dac% algoritmul Greedy func(ioneaz% corect, prima solu(ie g%sit% va fi totodat% o solu(ie optim% a problemei. O ntrebare fireasc% este aceea dac% algoritmul Greedy duce totdeauna la solu(ie optim%? Evident c% nu Sunt situa(ii cnd solu(ia g%sit% nu este optim%. Mai mult, pentru cele mai multe din probleme nu se cunosc algoritmi Greedy de rezolvare. Spre deosebire de Backtracking, algoritmul Greedy nu permite atunci cnd s-a oservat c% nu se poate ajunge la solu(ie pentru o anumit% secven(% de elemente, revenirea napoi, pe nivelele anterioare. Pentru problemele care nu duc la solu(ia optim% este necesar s% se caute solu(ii, chiar dac% nu optime, dar ct mai apropiate de acestea. Descrierea n pseudocod al algoritmului de rezolvare este urm%toarea:
function greedy(C) {C este multimea candidatilor} S {S este multimea in care construim solutia} while not solutie(S) and C do x un element din C care maximizeaza/minimizeaza select(x) C C \ {x} if corect(S {x}) then S S {x} if solutie(S) PDF created with pdfFactory Pro trial version www.pdffactory.com Tehnici de Programare Udritoiu #tefan 7. Greedy Stoica Spahiu Cosmin 2 then return S else return nu exista solutie
La fiecare pas, procedura alege cel mai bun candidat la momentul respectiv, far% s%-i pese de viitor i f%r% s% se r%zgndeasc%. Daca un candidat este inclus n solu(ie, el r%mne acolo; dac% un candidat este exclus din solu(ie, el nu va mai fi niciodat% reconsiderat. Asemenea unui ntreprinz%tor rudimentar care urm%rete ctigul imediat n dauna celui de perspectiv%, un algoritm Greedy ac(ioneaz% simplist. Totui, ca i n afaceri, o astfel de metod% poate da rezultate foarte bune tocmai datorit% simplit%(ii ei. ntre metoda Greedy i metoda Backtracking putem enumera urm%toarele diferen(e: ambele tehnici ofer% solu(ii sub form% de vector tehnica Backtracking ofer% toate solu(iile problemei, n timp ce Greedy ofer! o singur! soluie tehnica Greedy nu dispune de mecanismul ntoarcerii, specific tehnici Backtracking
Exemplu de problem rezolvat prin metoda Greedy S% presupunem c% de(inem un magazin de soft i dorim s% d%m restul unui client care ne-a dat o sum% oarecare de bani, folosind un num%r ct mai mic de monezi. Presupunem c% avem urm%toare list% de monede disponibile: 100lei, 50lei, 25lei, 1leu. Moneda unitate (1 leu) este obligatoriu s% se reg%seasc% printre ele. De asemenea din fiecare tip de moned% avem un num%r nelimitat de buc%(i.
void function Greedy(int suma) //se primete ca parametru suma pe care trebuie s# o dea rest { int nr_monezi; //initial dam cat se poate din bani n moneda cea mai mare (de 100) Deoarece atat suma cat si 100 sunt numere ntregi, suma/100 va avea ca rezultat un numar ntreg, partea de dup# virgul# ignorndu-se nr_monezi = suma/100; printf(s-au pltit %d monede de 100,nr_monezi); //restul care mai este de achitat este de fapt restul mp#r&irii suma, la 100 suma = suma%100; //se pl#tete ct este posibil n moneda urm#toare nr_monezi = suma/50; printf(s-au pltit %d monede de 50,nr_monezi); suma = suma%50
//Deoarece nu mai avem la dispozi&ie dect moneda unitate, acum se va pl#ti restul care mai este de dat n monede de 1 leu printf(s-au pltit %d monede de 1,suma); }
Se poate demonstra c% algoritmul Greedy va g%si n acest caz mereu solu(ia optim% (restul cu un num%r minim de monezi). PDF created with pdfFactory Pro trial version www.pdffactory.com Tehnici de Programare Udritoiu #tefan 7. Greedy Stoica Spahiu Cosmin 3 Dac% n schimb nu am avea moneda unitate, nu s-ar mai putea o ob(ine solu(ie optim%. Este posibil ca dup% ce am pl%tit tot ce se poate n monedele disponibile, folosind algoritmul de mai sus, s% ne r%mn% o sum% mic% (mai mic% dect cea mai mic% moned%) pe care nu avem cu ce s% o restituim. Cum algoritmul Greedy nu dispune de mecanismul ntoarcerii pentru a ncerca alt% combina(ie de monede pentru restituirea restului, acea sum%. ne va r%mne ca baci.
Probleme propuse 1. s% se rescrie problema casierului n condi(iile n care am avea un num%r citit de la tastatur% de tipuri de monede. (de asemenea trebuie citit pentru fiecare tip n parte valoarea acelei monede)
2. ntr-o sal% de teatru, ntr-o anumit% zi trebuie planificate n spectacole. Pentru fiecare spectacol se cunoate intervalul n care se desf%oar% [inceptermin]. Se cere s% se planifice un num%r maxim de spectacole astfel nct s% nu se suprapun%. Indica(ie: se folosete un vector bidimensional spectacol[i][j], unde i reprezint% ora nceperii spectacolului, iar j ora termin%rii lui. Se sorteaz% spectacolele dup% ora termin%rii lui. Primul spectacol este programat cel care se termin% cel mai devreme. Mai departe alegem primul spectacol care ndeplinete condi(ia c% ncepe dup% ce s-a terminat cel anterior lui. Acest algoritm g!se$te soluia optim!?
3. O persoan% are un rucsac cu care poate transporta o greutate maxim% G. Persoana are la dispozi(ie n obiecte i cunoate pentru fiecare obiect greutatea i valoarea sa. Se pune problema ce obiecte trebuie s% transport persoana n aa fel nct ctigul s% fie maxim. Modifica(i rezolvarea astfel nct s% corespund% situa(iei cnd persoana nu este obligat% s% ia un obiect ntreg, ci poate lua doar un fragment din el.
4. Se dau n numere ntregi nenule b 1 , b 2 b n i m numere ntregi nenule a 1 ,a 2 . a m . S% se determine o submul(ime a mul(imii B= {b 1 , b 2 b n } care s% maximizeze valorile expresiei: E = a 1 x 1 + a 2 x 2 + . + a m x m unde n > m i x i {b 1 , b 2 b n }
5. Un comis-voiajor pleac% dintr-un ora, trebuie s% viziteze un num%r de n orae i s% se ntoarc% n oraul de plecare cu efort minim. Se da matricea de vecin%t%(i a celor n orae, precizndu-se i distan(ele dintre ele.
6. Se d% o tabl% de ah nn. S% se arate punctele prin care trece un cal care pornete din punctul 1,1 n ncercarea de a acoperi ct mai multe puncte posibile. Indica(ie: la fiecare pas se alege acea mutare care plaseaz% calul ntr-o pozi(ie din care la pasul urm%tor exist% ct mai pu(ine posibilit%(i de a muta din nou PDF created with pdfFactory Pro trial version www.pdffactory.com