Documente Academic
Documente Profesional
Documente Cultură
dimensiune mai mic. Metoda greedy se aplic si pentru probleme care nu satisfac
aceast conditie, pentru c ea produce o solutie bun, destul de apropiat de solutia
optim ntr-un timp mult mai scurt dect o metod backtracking.
In aceste cazuri metoda greedy este considerat ca o metod euristic, care
ghiceste solutia bun fr s fac o analiz exhaustiv a tuturor solutiilor posibile. O
solutie 'bun' este o solutie al crui cost este cel putin jumtate din costul solutiei
optime.
Schema general a unui algoritm Greedy
Incercarea de a folosi o schem general de algoritm greedy, care apoi s fie
adaptat fiecrei probleme specifice, are avantajul c pune n evident strategia
comun tuturor programelor bazate pe algoritmi greedy, dar si dezavantajul unor
programe neoptimizate. De aceea, n literatur programele de tip greedy apar n
forme foarte diferite si exploateaz particularittile problemei rezolvate pentru a
realiza un cod surs minim si un timp minim de executie.
O procedur greedy general contine un ciclu principal n care, la fiecare pas, se
alege o valoare pentru o component a solutiei x[k]. Alegerea se face dintr-o list de
candidati, list care poate fi unic pentru toti pasii, sau se modific (se genereaz din
nou) la fiecare pas. Vom considera o functie genCand care genereaz aceast list
de candidati si care este apelat la fiecare pas, desi uneori poate fi scoas n afara
ciclului (lista se genereaz o singur dat). Functia optim va selecta candidatul
optim din lista de candidati cand.
Lista de candidati este, ca tip abstract de date, o coad cu prioritti, pentru a
permite extragerea rapid a candidatului optim (maxim sau minim) dintr-o colectie
dinamic, la care se pot aduaga noi candidati. Teoretic, cea mai bun implementare
a unei cozi cu prioritti este un vector heap, dar din motive de simplitate se
foloseste deseori un vector.
Un vector ordonat de candidati este suficient atunci cnd lista initial de candidati
nu se mai modific prin adugarea altor candidati. O alternativ la ordonare o
reprezint selectarea si eliminarea valorii maxime (sau mimine) din vector, la fiecare
pas din ciclul principal greedy.
Selectarea unui candidat ca valoare pentru x[k] antreneaz dup sine si alte
operatii, specifice problemei, care vor fi reunite n functia include. Functia posibil
verific anumite conditii specifice problemei n functie de care candidatul optim este
sau acceptat n solutie.
Functia general greedy presupune c elementele vectorului solutie se
determin n ordinea x[1],x[2],..x[n], desi exist cazuri n care ordinea determinrii
acestor componente este alta.
// variabile globale
int n;
int x[NX];
void greedy()
}
Aceast functie poate fi folosit ca atare si completat cu subprogramele
dependente de aplicatie : genCand, init, posibil, include, optim, solutie. Eventual, mai
intervine o secvent care determin valoarea lui x[k] n functie de candidatul optim
selectat.
De observat c determinarea componentelor vectorului solutie nu se face neaprat
n ordinea x[1], x[2], x[3],...x[n]. Un exemplu n acest sens l constituie algoritmul
greedy pntru colorarea nodurilor unui graf cu numr minim de culori.
O alt posibilitate este de a scrie fiecare program bazat pe un algoritm greedy fr
a defini aceste functii si exploatnd la maxim particularittile problemei date, dar
avnd ca model strategia greedy general descris anterior.
Algoritm Greedy pentru problema restului
Problema restului cere exprimarea unei sume de bani (un rest de plat) printr-un
numr minim de monede cu valori date.
Fie n tipuri de monede cu valori c[1],c[2],..c[n] si o sum R. O solutie este un
vector x[1], x[2], ..x[n] , unde x[k] este numrul de monede de valoare c[k] necesar
pentru achitarea sumei R. deci, R= x[1]*c[1] + x[2]*c[2] + ... + x[n]*c[n]. O parte din
valorile x[k] pot fi zero, dac nu se folosesc monedele corespunztoare.
Vectorul solutie, n aceast problem, poate fi considerat ca un vector de lungime
fix (egal cu numrul de monede distincte) sau ca un vector de lungime variabil, cu
x[k] egal cu numrul de monede stabilit n pasul k si considerat complet la exprimarea
ntregii sume de plat.
Algoritmul greedy ncearc s foloseasc monedele n ordinea descresctoare a
valorii lor, deci ncepe cu moneda de valoare maxim si determin numrul maxim de
monede de acest tip pentru suma de plata, apoi ncearc cu moneda imediat
inferioar s.a.m.d.
Lista de candidati este lista monedelor disponibile, ordonat descresctor; la
fiecare pas se extrage primul element din list. Pentru anumite valori ale monedelor,
acest algoritm conduce la solutia optim pentru orice sum R. Complexitatea este
O(n).
Vom exemplifica cu o instant a a problemei pentru care solutia greedy nu este si
solutia optim. Lista ordonat de monede: c[1]=11, c[2]=5, c[3]=1. Suma de
plat R= 15.
Solutia greedy : x[1]= 1, x[2]=0, x[3]= 4 (5 monede)
Solutia optim : x[1]= 0, x[2]=3, x[3]= 0 (3 monede)
// alg. greedy ptr. determinare numar minim de monede
#define M 20
int n,rest ;
int greedy_rest ()
else
x[k]=0;
}
return (rest==0 ? 1 : -1); // -1 daca rest > 0
}
void main ()
}
Lista valorilor monedelor se introduce n ordine descresctoare sau se ordoneaz n
programul principal, nainte de apelarea functiei greedy_rest. Evolutia programului
pentru exemplul anterior este urmtoarea:
k
c[k]
x[k] R
initial
nm
15
11
Un algoritm greedy ordoneaz obiectele dup valoarea lor unitar (dup raportul
v[i]/g[i]) si verific fiecare obiect din aceast list de candidati dac mai are loc sau n
rucsac. Pentru problema fractionar metoda greedy conduce sigur la solutia optim,
dar pentru varianta 0/1 nu este garantat solutia optim.
Lista candidatilor este lista obiectelor, ordonat dup valoarea lor specific.
Exemplu numeric: n=3, Gt=15
g[i]
10
v[i]
20
10
12
v[i]/g[i]
2.0 1.66
1.5
// obiecte selectate (0 / 1)
// greutati obiecte
// variabile globale
int n,nc ;
int m ;
// nr de culori
int a[M][M];
int x[M];
x[1]=2, x[2]=4 .
#define M 20
void greedy ()
}
printS (cand[imax]);
removeAll (scop,cand[imax]);
} while ( ! emptyS(scop));
}
Secventa anterioar nu a verificat dac problema admite solutie, dar aceast
verificare se poate face imediat dup citirea datelor: se reunesc toate multimile
candidati si se verific dac multimea scop este continut n reuniunea candidatilor.