Sunteți pe pagina 1din 5

Metoda Greedy Exemplul 1.

Problema planificrii optime a activitilor Se folosesc urmtoarele date i structuri de date: Pentru numrul de elemente ale celor dou mulimi se folosesc variabilele n- numrul de activiti (numrul de elemente ale mulimii A) i m - numrul de activiti selectate pentru a forma soluia problemei (numrul de elemente al e mulimii S). Pentru mulimea activitilor (mulimea A) se folosete vectorul o, ale crui elemente sunt de tip

nregistrare activitate - care conine 3 cmpuri , inc i sf pentru ora la care ncepe activitatea, respectiv ora la care se termin activitatea - i k pentru numrul activitii (este folosit ca un indicator al activitii). Soluia (mulimea S) va fi memorata n vectorul s. n fiecare element al vectorului o se

memoreaz indicele elementului selectat din vectorul o, dup ce a fost sortat dup criteriul candidatului optim. Se folosesc urmtoarele subprograme: Subprogramul citete() - pentru citirea datelor din fiierul text. n fiierul text, pe primul rnd este scris numrul de activiti n, iar pe urmtoarele n rnduri- perechi de numere ntregi, separate prin spaiu, care reprezint ora de nceput i ora de sfrit ale unei activiti. Fiecrei activiti i se atribuie c identificator numrul de ordine de la citirea unui fiier. n urma execuiei acestui subprogram, se creeaz vectorul activitilor o. (cmpul sf) Subprogramul greedy() - implementeaz strategia greedy pentru aceast problem Subprogramul afieaz() - afieaz soluia problemei folosind informaiile din vectorul sSubprogramul sort() - se sorteaz vectorul a cresctor dup timpul de terminare a activitilor

indicele fiecrei activiti selectate. Metoda greedy este implementat astfel: PAS1. Se iniializeaz vectorul s cu indicele primului element din vectorul o (se selecteaz, c prima activitate, activitatea care are ora de terminare cea mai mic) PAS2. Pentru urmtoarele n-1 elemente ale vectorului o, execut PAS3. Dac ora la care ncepe activitatea din elementul curent al vectorului o este mai mare sau egal cu ora la care se termin ultima activitate adugat la soluie (n vectorul s), atunci activitatea este adugat la soluie.

Mulimea activitilor Activitatea Ora ncepere Ora de 11 13 10 12 18 16 22 de 1 9 2 12 3 8 4 10 5 16 6 14 7 20 8 1 9 2 1

terminare Mulimea activitilor- dup ce a fost sortat Activitatea Ora ncepere Ora de 10 11 12 13 16 18 21 3 1 9 4 10 2 12 6 14 5 16 8 19

7 20

de 8

22

terminare Soluia problemei Activitatea Ora ncepere Ora de 10 12 13 16 18 21 3 4 10 2 12 6 14 5 16 8 19

de 8

terminare

Programul este: #include<fstream.h> struct activitate {int inc, sf, k;}o[20] , aux; int n, m, s[20];fstream f("greedyl.txt",ios::in); void citeste() {int i; f>>n; for(i=1; i<=n; i++) {f>>o[i] . inc>>o[i] .sf; o[i] . k=i; } f.close();} void sort() {int i,j; for(i=1; i<n; i++) for(j=i+1;j<=n;j++) if (a[i] . sf>o[j].sf) {aux=a[i]; o[i]=o[j];o[j]=aux;} } void greedy() {int i,j, a[1]=1; j=1; for (i=2; i<=n, i++) if ( o[i] .inc>=o [s[j]].sf) {j++; s[j]=i;} m=j;} void afiseaza(){cout<<"Planificarea activitatilor: " << endl; for (int i=1;1<=m;i++) cout<< Activitatea "<<o[s[i]] .k<<" incepe la ora "; cout<<o[s[i]] .inc <<" si se termina la ora "<<o[s[i]] .sf<<endl;} void main () {cisteste (); sort(); greedy(); afiseaza();}

Exemplul2. Problema ocuprii optime a mijlocului de transport (problema rucsacului) Se folosesc urmtoarele date i structuri de date: Pentru urmtoarele elemente ale celor dou mulimi se folosesc variabilele n- numrul de obiecte (numrul de elemnte ale mulimii A) i m - numrul de obiecte selectate pentru a forma soluia problemei (numrul de elemente ale mulimii S) Pentru greutatea maxim care se poate transporta, se folosete variabil G, iar pentru greutatea obiectelor care se mai pot selecta, se folosete variabil Gr (greutatea rmas). Variabil Gr este iniializat cu valoarea G (iniial, greutatea obiectelor care se pot selecta este greutatea maxim de transport), iar dup ce s-a construit soluia, variabila Gr are valoarea 0 (nu se mai pot selecta obiecte, deoarece a fost ocupat toat capacitatea de transport). Pentru mulimea obiectelor (A) se folosete vectorul a, ale crui elemente sunt de tip nregistrare obiect care conine patru cmpuri: g - greutatea obiectului, c - profitul obinut n urma transportului, e eficiena transportului i k - numrul obiectului (este folosit ca un identificator al obiectului). Soluia (mulimea S) va fi memorat n vectorii s i x. n fiecare element al vectorului s se memoreaz indicele obiectului selectat din vectorul a, dup ce a fost sortat dup criteriul candidatului optim, iar n elementul din vectorul x care are acelai indice cu cel din vectorul s se memoreaz fraciunea din cantitatea care se va lua din obiectul selectat. Elementele vectorului x sunt iniializate cu valoarea 0 deoarece vectorul este declarat global.

Mulimea obiectelor - G=20

Obiectul Greutatea Profitul Eficienta

1 5 10 2

2 4 20 5

3 4 10 2,5

4 8 10 1,25

5 10 22 2,2

Mulimea obiectelor dup ce a fost ordonat Obiectul Greutatea Profitul Eficienta Soluia problemei Obiectul Greutatea Fractiunea Greutatea 2 4 1 4 3 4 1 4 5 10 1 10 1 5 0,2 2 4 8 0 0 2 4 20 5 3 4 10 2,5 5 10 22 2,2 1 5 10 2 4 8 10 1.25

Se folosesc urmtoarele subprograme : Subprogramul citete () - pentru citirea datelor din fiierul text. n fiierul text pe primul rnd este scris numrul de obiecte n i greutatea maxim a transportului G, iar pe urmtoarele n rnduri - perechi de numere reale, separate prin spaiu, care reprezint greutatea i profitul trasnportului unui obiect. Fiecrui obiect i se atribuie, c identificator numrul de oridine de la citirea din fiier. Pentru fiecare obiect se calculeaz eficienta transportului. n urma execuiei acestui subprogram se creeaz vectorul obiectelor, a. Subprogramul sort() - sorteaz vectorul a, cresctor dup eficienta transportului obiectelor (cmpul a) Subprogramul greedy () - implementeaz strategia greedy pentru aceast problem. Subprogramul afieaz() - afieaz soluia problemei folosind informaiile din vectorii s i x indicele fiecrui obiect selectat i fraciunea din greutate care se va transporta. Strategia greedy este implementat astfel: PAS1: Se iniializeaz greutatea Gr cu valoarea G i selectarea obiectelor ncepe cu obiectul cu cea mai mare eficient a transportului (primul obiect din vectorul a). PAS2: Ct timp mai exist obiecte care nu au fost selectate i greutatea obiectelor selectate nu este greutatea maxim, execut PAS3: Dac greutatea obiectului din elementul curent al vectorului a este mai mic sau egal cu greutatea rmas, Gr, atunci obiectul este adugat la soluie, lundu-se ntreaga cantitate disponibil din obiect; altfel, se ia din obiect fraciunea egal cu greutatea rmas Gr. Se actualizeaz greutatea Gr diminunand-o cu greutatea obiectului care a fost adugat n rucsac. Programul este:

:#include<fstream.h> struct obiect {int k; float g, c,e;}; obiect a[20]; int n,m s[20]; float G, Gr, x[20]; fstream f("greedy2.txt",ios::in); void citeste() {int i; f>>n>>G; for(i=1;i<=n;i++) {f>>a[i]. g>>a[i].c; a[i] . k=i; a[i]. c=a[i]. c/a[i].g;} f.close();} void sort() {int i,j; obiect aux; for (i=1;i<n;i++) for (j=i+1;j<=n;j++) if (a[i].e<a[j].e) {aux=a[i]; a[i]=a[j]; a[j]=aux;}} void greedy() {int i,j=0; Gr=G; for (i=1;i<=n && Gr!=0;i++) if (Gr>a[i].g) {j++;s[j]=i; x[j]=1; Gr-=a[i].g;} else {j++; s[j]=i; x[j]=Gr/a[i].g; Gr=0;} m=j;} void afiseaza() {for (int i=1;i<=m;i++) {cout<<"Obiectul "<< a[s[i]] .k<<" in cantitatea "; cout<<x[i]*a[s[i]].g<<endl;}} void main() { citeste(); sort(); greedy(); afiseaza(); }

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