You are on page 1of 18

Aplicaii ale metodei

de programare Greedy
Iridon Olimpia, IEM, AN I

Considerente generale
Metoda Greedy, denumita si Metoda Optimului Local sau Metoda Trierii,
este una dintre cele mai directe tehnici de proiectare a algoritmilor care poate fi
aplicat la o gam larg de probleme. n general, aceast metod se aplic
problemelor de optimizare, precum:
determinarea celor mai scurte drumuri in grafuri (Dijkstra)
determinarea arborelui minimal de acoperire (Prim, Kruskal)
planificarea activitatilor
problema spectacolelor
problema fractionara a rucsacului,etc.

cautare web

teoria jocurilor
Algoritmii Greedy sunt algoritmi de cautare euristica, folositi in cazurile care
implica gasirea unor solutii pentru probleme ce nu au o rezolvare directa.

Avantaje
Simplitate
Algoritmi Greedy sunt de multe ori mai usor de scris efectiv intr-un limbaj de programare
in comparativ cu alti algoritmi (precum Backtracking) .
Eficien
Algoritmi Greedy pot fi de multe ori implementati mai eficient in comparatie cu alti
algoritmi, in ceea ce priveste timpul efectiv de lucru, de la proiectare la solutia finala,
avand avantajul unui timp polinomial O(n^2).

Dezavantaje

Limitat
Tehnica Greedy ofer o singur soluie - nu dispune de mecanismul ntoarcerii, specific
tehnicii Backtracking
Solutie rapid, dar nu neaprat optim
Algoritmii Greedy nu conduc n mod necesar la o solutie optim, nefiind recomandata o
implementare pe termen lung. Pentru a fi siguri ca solutia generata prin metoda Greedy

Pasi de implementare
Primul pas in rezolvarea unei probleme folosind algoritmi euristici de explorare este definirea
exacta a problemei. O problema este bine definita daca se cunosc urmatorii parametrii:
1. Starea initiala a problemei reprezinta configuratia de plecare.
2. Functie de expandare a nodurilor in cazul general este o lista de perechi (actiune,
stare_rezultat). Astfel, pentru fiecare stare se enumera toate actiunile posibile precum si
starea care va rezulta in urma aplicarii respectivei actiuni.
3. Predicat pentru starea finala functie care intoarce adevarat daca o stare este stare
scop si fals altfel
4. Functie de cost atribuie o valoare numerica fiecarei cai generate in procesul de
explorare. De obicei se foloseste o functie de cost pentru fiecare actiune/tranzitie, atribuind,
astfel, o valoare fiecarui arc din graful starilor.
Sarcina algoritmilor de cautare este de a gasi o cale din starea initiala intr-o stare scop. Daca
algoritmul gaseste o solutie atunci cand multimea solutiilor este nevida spunem ca algoritmul
este complet. Daca algoritmul gaseste si calea de cost minim catre starea finala spunem ca
algoritmul este optim.

Exemplificare

Se doreste identificarea unei rute de cost minim intre Arad si Bucuresti.

Conform pasilor descrisi anterior, identificam:


1. Starea initiala = orasul Arad
2. Starea finala = orasul Bucuresti
3. Functia de expandare = returneaza toate orasele in care putem ajunge dintr-un
dat
4. Functia de cost = nr. de km al fiecarei rute intre doua orase

Presupunem ca viteza de deplasare este constanta.


Pentru fiecare oras vom utiliza distanta geometrica ( in linie dreapta) pana la Buc

Alcatuim graful starilor.

Pasul I

Identificam functia euristica

Algoritmii euristici de cautare sunt algoritmi care lucreaza pe grafuri si


folosesc o informatie suplimentara, necontinuta in definirea problemei,
prin care se accelereaza procesul de gasirea a unei solutii.
In cadrul explorarii starilor, fiecare algoritm genereaza un arbore, care in
radacina va contine starea initiala. Fiecare nod al arborelui va contine
urmatorele informatii:
Starea continuta - stare(nod)
Parintele nodului (nod)
Cost cale costul drumului de la starea initiala pana la nod g(nod)
Functie de evaluare f indica cat de promitator este un nod in
perspectiva gasirii unui drum catre solutie
Functie h indica drumul estimat de la nod la cea mai apropiata staresolutie

In cadrul algoritmului folosim doua multimi:


Multimea CLOSED indica nodurile deja explorate si expandate
Multumea OPEN indica nodurile descoperite dar neexpandate
Multimea OPEN se initializeaza cu nodul corespunzator starii initiale.
Iterativ, se alege din multimea OPEN, nodul cu valoarea f(n)=h(n) cu
valoarea cea mai mica.
Daca nodul este o solutie a problemei atunci intoarce ca rezultat calea de la
starea initiala pana la nod
Daca nodul nu a fost explorat, atunci se expandeaza, iar nodurile
corespunzatoare starilor rezultate sunt introduse in multimea OPEN.
Daca multimea OPEN ramane fara elemente, atunci nu exista nici un drum
catre solutie si algoritmul va genera eroare.
Algoritmul Greedy urmareste mereu solutia care pare cea mai aproape de
sursa. Din acest motiv nu se vor analiza stari care desi par mai departe de
solutie, produc o cale catre solutie mai scurta. Astfel, algoritmul nu este
optim. Pentru grafuri infinite este posibil ca algoritmul sa ruleze la infinit chiar

Pasul II Parcurgea grafului


Arad

In primul pas, algoritmul


exploreaza nodul Arad.
Nodul urmator de
explorat va fi Sibiu,
intrucat are valoarea h(n)
minima, deci drumul
estimat de la nod la cea
mai apropiata stare-solutie
este minim.

Arad
366

Fagar
as
176

366

1. Stare initiala

Arad
Sibiu
253

Timisoa
ra
329

2. Expandarea nodului
Arad
Zerind
374

Arad
Sibiu

Orade
a
380

Timisoa
ra
329
Ramni
cu
Valcea
193

Zerind
374

3. Expandarea nodului
Sibiu

Continuam cu nodul Fagaras, apoi cu nodul


Bucuresti, care reprezinta nodul final.
Arad
Sibiu

Timisoa
ra

Zerind
374

329
Arad
366

Sibiu
253

Fagar
as

Orade
a
380

Ramni
cu
Valcea
193

4. Expandarea nodului
Fagaras

Bucure
sti
0

Se observa insa ca acest drum nu este minimal. Desi Fagaras este mai aproape ca distanta
geometrica de Bucuresti, in momentul in care starea curenta este Sibiu alegerea optimala
este Ramnicu-Valcea. In continuare ar fi urmat Pitesti si apoi Bucuresti obtinandu-se un
drum cu 32 km mai scurt.

Pentru demonstrarea optimalitatii solutiei Greedy se poate folosi


inductia matematica sau, se poate alege compararea solutiei Greedy
cu solutia data de un alt algortim de cautare euristica.
In cazul de fata, am ales sa compar solutia Greedy cu solutia data de
algoritmul A*.
A* reprezinta cel mai cunoscut algoritm de cautare euristica. Diferenta
intre acesta si algoritmul Greedy este ca A* intoarce mereu solutia
optima daca o solutie exista atat timp cat ramanem optimisti si nu
supraestimam distanta pana la solutie. De asemenea, pentru a ne
asigura ca vom gasi drumul optim catre o solutie chiar daca acest
drum nu este analizat primul, A* permite scoaterea nodurilor din
multimea closed si reintroducerea lor in open daca o cale mai
buna pentru un nod din multimea CLOSED (g(n) mai mic) a fost gasita.
Inconvenientul utilizarii A* este ca sunt necesare reevaluarea nodurilor
din multimea CLOSED, si poate fi de multe ori imposibil de rulat

Parcurgerea grafului folosind A*


1. Stare initiala

Arad

2. Expandarea nodului
Arad

Arad
Sibiu
393 = 140 +
253

3. Expandarea nodului
Sibiu

Sibiu

Timisoa
ra
447 = 118 +
329
Arad

366 = 0
+366

Zerind
449 = 75 +
374

Zerind

Timisoa
449 = 75 +
ra
374
447 = 118 +
329
Ramni
Fagar
Orade
cu
Arad
as
a
Valcea
415 = 239 + 671 = 291 +
646 = 280 +
413 = 220 +
176
380
366
193

Arad
Sibiu

Zerind

Timisoa
ra
447 = 118 +
329
Ramni
Fagar
Orade
cu
Arad
as
a
Valcea
646 = 280 + 415 = 239 + 671 = 291 +
413 = 220 +
176
366
380
193
Craio
Pitesti
va
526 = 366 + 417 = 317 +
100
160

449 = 75 +
374

4. Expandarea nodului Ramnicu


Valcea

Sibiu
553 = 300 +
253

Arad
Sibiu

Zerind

Timisoa
ra
447 = 118 +
5. Expandarea nodului Fagaras
329
Ramni
Fagar
Orade
cu
Arad
as
a
Valcea
415
=
239
+
646 = 280 +
671 = 291 +
413 = 220 +
176
366
380
193
Sibiu
591 = 338 +
253

Craio
Bucures
Pitesti
va
ti
450 = 450 + 526 = 366 + 417 = 317 +
100
0
160

449 = 75 +
374

Sibiu
553 = 300 +
253

Arad
Sibiu

Arad

Sibiu

Zerind

Timisoa
ra
447 = 118 +
329
Ramni
Fagar
Orade
cu
as
a
Valcea
415 = 239 + 671 = 291 +
413 = 220 +
176
380
193
Craio
Bucures
Pitesti
va
ti
450 = 450 + 526 = 366 + 417 = 317 +
100
0
160
Bucures
ti
418 = 418 + 0

449 = 75 +
374

Sibiu

6. Expandarea nodului Pitest

553 = 300 +
253
Ramni
Craio
cu
va
Valcea
615 = 445 +
607 = 414 + 193
160

Concluzii
Dupa expandarea nodului Fagaras desi exista o solutie in multimea open aceasta
nu este aleasa pentru explorare, precum s-a efectuat cu algoritmul Greedy. Se
va alege Pitesti, intrucat f(nod(Bucuresti)) = 450 > f(nod(Pitesti)) = 417,
semnificatia acestei inegalitati fiind ca e posibil sa existe prin Pitesti un drum
mai bun catre Bucuresti decat cel descoperit pana acum.
Observam ca pasii urmati in algoritmul Greedy sunt considerabil mai putini (4
noduri explorate), comparativ cu A*, unde avem 6 noduri explorate.
Avand in vedere complexitatea algoritmului A*, in practica, poate fi de multe ori
imposibil de rulat datorita dimensiunii prea mari a spatiului de cautare.
Solutia finala a problemei date:
Prin Metoda Greedy, ruta minima Arad-Bucuresti = 450 km
Prin Metoda A*, ruta minima Arad-Bucuresti = 418 km
Astfel, concluzionam ca in cazul de fata, solutia data de algoritmul Greedy este
una completa,dar nu optima.
Metoda Greedy este mai mult o sugestie de rezolvare, avand in vedere ca nu

Bibliografie

Daniela Alexandra Crisan - Ingineria Programarii- Proiectarea Si Analiza


Algoritmilor, Editura Pro Universitaria, 02-2007, pg. 181-206
Daniela Alexandra Crisan, Justina Lavinia Stanica - Limbajul C/C++, Editura
Prouniversitaria, Aplicatii si teste grila vol. III, Editura Pro Universitaria, 01-2007
Witold Bednorz - Greedy Algorithms, ISBN 978-953-7619-27-5, Editura InTech, An
aparitie: 2008

V mulumesc!

You might also like