Sunteți pe pagina 1din 7

Metoda Greedy

1. Descriere
Metoda Greedy este una din cele mai directe tehnici de proiectare a algoritmilor care se aplic la o varietate larg de probleme.In general,aceasta metoda se aplica problemelor de optimizare.Specificul acestei metode consta in faptul ca se construieste solutia optima pas cu pas,la fiecare pas fiind selectat(sau "inghitit") in solutie elementul care pare "cel mai bun"la momentul respectiv,in speranta ca va duce la solutie optima globala.

2. Prezentare
Metoda rezolva probleme de optim n care solutia se construieste pe parcurs. Optimul global se construieste prin estimari succesve ale optimului local. Dintr-o multime A trebuie determinata o submultime B, care verifica anumite conditii si care de obicei este solutia unei probleme de optimizare. Initial multimea B este multimea vida, se adauga n B succesiv elemente, asigurndu-se de fiecare data un optim local, dar aceasta construire nu asigura atingerea optimului global. De aceea Greedy nu poate fi aplicata dect daca se demonstreaza ca modul de construire a lui B duce la obtinerea unui optim global. De aceea Greedy se mai numeste si metoda optimului local. Daca n cazul unei probleme aceasta metoda gaseste optimul pentru anumite date de test, dar pentru alte date nu gaseste solutia sau ofera o solutie care nu este optima, spunem ca metoda este euristica (n acest caz solutia poate fi determinata folosind tehnica backtracking, care presupune un algoritm de complexitate exponentiala sau la unele probleme folosind programarea dinamica, acesta fiind cazul fericit ). Observaie: Metoda Greedy nu caut s determine toate soluiile posibile ( care ar putea fi prea numeroase) i apoi s aleag din ele pe cea optim, ci caut s introduc direct un element x n soluia optim.Acest lucru duce la eficienta algorimilor Greedy,insa nu conduc in mod necesar la la o solutie optima si nici nu este posibila formularea unui criteriu general conform caruia sa putem stabili excat daca metoda Greedy rezolva sau nu o anumita problema de optimizare.Acest motiv duce la insotirea fiecarei rezolvari prin metoda Greedy a unei demonstratii matematice(in general prin inductie). Schema de proiectare. Problema se prezinta sub forma unei multimi S cu n componente. O parte din submultimile lui S reprezinta solutii care satisfac un anume criteriu si se numesc solutii admisibile. In spatiul solutiilor admisibile prezinta interes o solutie care maximizeaza/minimizeaza o functie obiectiv. Solutiile admisibile au proprietatea ca, odata cu o solutie admisibila, toate submultimile sale sunt de asemenea admisibile. Metoda Greedy sugereaza un algoritm de

constructie a solutiei optimale pas cu pas, pornind de la multimea vida. La ecare pas se selecteaza un element nou care va inghitit in solutie (greedy) in baza unei proceduri de selectie. De exemplu, la problemele de optimizare procedura de selectie alege acel element care face sa creasca cel mai mult valoarea functiei obiectiv. Desigur, nu in toate problemele aceasta strategie conduce la solutia optima, metoda Greedy neind o metoda universala.

3.

Modelul matematic

4. Probleme clasice rezolvate prin metoda Greedy


1. Problema spectacolelor
Managerul artistic al unui festival trebuie sa selecteze o multime cat mai ampla de spectacole ce pot fi jucate in singura sala pe care o are la dispozitie.Stiind ca i s-au propus n spectacole si pentru fiecare spectacol i-a fost anuntat intervalul in care se poate desfasura [Si, Fi] (Si reprezinta ora si minutul de inceput, iar Fi ora si minutul de final al spectacolului i), scrieti un program care sa permita spectatorilor vizionarea unui numar cat mai mare de spectacole. Date de intrare Pe prima linie a fisierului de intrare spectacole.in se afla numarul n, numarul de spectacole propus. Pe urmatoarele n linii se vor afla 4 valori, primele doua reprezentand ora si minutul inceperii spectacolului curent, iar ultimele doua reprezentand ora si minutul terminarii spectacolului.
Date de iesire Fisierul de iesire spectacole.out contine o singura linie, pe aceasta vor fi scrise numerele de ordine ale spectacolelor care indeplinesc solutia problemei, printr-un spatiu. Restrictii n <= 100 Exemplu

spectacole.in
5 12 15 10 18 12 30 16 30 0 18 0 0 18 30 0 20 45 15 13 0

spectacole.out
524

Vom sorta crescator spectacolele dupa ora de final. Vom selecta initial primul spectacol (cel care se termina cel mai devreme). In continuare vom selecta, la fiecare pasa, primul spectacol neselectat, care nu se suprapune peste cele deja selectate. O implementare intuitiva a acestui algoritm va fi prezentata in continuare. Pentru sortat vom folosi metoda BubbleSort, care este indeajuns de buna pentru limitele impuse de problema.

#include <iostream> #include <fstream> using namespace std; ifstream f("spectacole.in"); ofstream g("spectacole.out"); int n,inceput[100],sfarsit[100],nr[100]; void citeste() { int ora,min,i; f>>n; for (i=0;i<n;++i) { nr[i]=i+1; f>>ora>>min; inceput[i]=ora*60+min; f>>ora>>min; sfarsit[i]=ora*60+min; } f.close(); } void sorteaza() { int aux,schimb,i; do { schimb=0; for (i=0;i<n-1;++i) if (sfarsit[nr[i]]>sfarsit[nr[i+1]]) { aux=nr[i]; nr[i]=nr[i+1]; nr[i+1]=aux; schimb=1; } } while (schimb); } void rezolva() { int ultim,i; for (ultim=0,i=1;i<n;++i) if (inceput[nr[i]]>=sfarsit[nr[ultim]]) { g<<nr[i]+1<<" "; ultim=i; } g<<endl; } int main()

{ citeste(); sorteaza(); rezolva(); return 0; }

2. Problema rucsacului
Un hot nepravazator are la dispozitie un singur rucsac cu care poate transporta o greutate maxima Gmax.Hotul are de ales din n <= 50 obiecte si,evident,intentioneaza sa obtina un castig maxim in urma singurului transport pe care il poate face.Cunoscand, pentru fiecare obiect i greutatea Gi si castigul Ci pe care hotul l`ar obtine transportand obiectul respectiv in intregime,scrieti un program care sa determine o incarcare optima a rucsacului,in ipoteza ca hotul poate incarca in rucsac orice parte dintr`un obiect. rucsac.in 5 100 1000 120 500 20 400 200 1000 100 25 1 rucsac.out 2 100.00% 4 79.00% 5 100.00%

Vom reprezenta o solutie a problemei ca un vector x cu n componente,in care retinem pentru fiecare obiect fractiunea incarcata in rucsac de hot.Deci vectorull x trebuie sa indeplineasca urmatoarele conditii : 1. Xi E [0,1], V i E { 1,2,...n }; //unde E = apartine si V = oricare ar fi 2. G1 * X1 + G2 * X2 + .. + Gn * Xn <= GMax; 3. f(x) = C1 * X1 + C2 * X2 + ... + Cn * Xn este maxima. Ordonam obiectele descrescator dupa castigul pe unitatea de greutate(valoare care constituie o masura a eficientei transportarii obiectelor). Cat timp este posibil (incap in rucsac),selectam obiectele in intregime.Completam rucsacul cu un fragment din urmatorul obiect ce nu a fost deja selectat.

#include<stdio.h> int o[50]; //ordinea obiectelor float c[100],g[100],x[100],Gr,GMax; int n; void citeste() { scanf("%d%e",&n,&GMax); for(int i = 0; i < n; i++) { o[i] = i; scanf("%e%e",&c[i],&g[i]); //citim valorile } } void sorteaza() { int i,schimb,aux; do //ordonam obiectele descrescator dupa castigul unitar { schimb = 0; for(i = 0; i < n-1; i++) if(c[o[i]]/g[o[i]] < c[o[i+1]]/g[o[i+1]]) { aux = o[i]; o[i] = o[i+1]; o[i+1] = aux; schimb = 1; } }while(schimb); } void rezolva() { int i; for(i = 0,Gr = GMax; i < n && Gr > g[o[i]]; i++) { x[o[i]] = 1; Gr-= g[o[i]]; } } void afiseaza() { for(int i = 0; i < n; i++) if(x[i]) printf("%d %e \n",i+1,x[i] * 100); } int main() { ifstream f("rucsac.in"); ofstream g("rucsac.out"); citeste(); sorteaza(); rezolva();

afiseaza(); fclose(stdin); fclose(stdout); return 0; }

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