Sunteți pe pagina 1din 3

Tehnici de Programare Udritoiu #tefan

7. Greedy Stoica Spahiu Cosmin


1

Lucrarea 7 Greedy.


Introducere tehnica Greedy

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

nr_monezi = suma/25;
printf(s-au pltit %d monede de 100,nr_monezi);
suma = suma%25;

//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

S-ar putea să vă placă și