Sunteți pe pagina 1din 38

Universitatea Constantin Brncui Trgu-Jiu 13

Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu

PROIECTAREA
ALGORITMILOR

Lect. univ. dr. Adrian Runceanu


1
13

Curs 13

Metoda
Greedy

Proiectarea Algoritmilor - curs 2


13

Coninutul cursului

13.1. Prezentarea generala a metodei


13.2. Schema generala a metodei
13.3. Implementari ale metodei

Proiectarea Algoritmilor - curs 3


13

13.1. Prezentarea generala a metodei


Algoritmii de tip greedy, backtracking si de
programare dinamic se aplic unor probleme
a cror solutie poate fi exprimat sub forma
unui vector de numere ntregi (cu valori ntre 1
si n).
Intr-o problem de optimizare trebuie gsit
solutia optim dintre toate solutiile posibile.
Alte clase de probleme cu solutie vectorial
sunt probleme de enumerare a tuturor solutiilor
posibile si probleme de decizie, la care trebuie
spus dac exist sau nu cel putin o solutie.
Proiectarea Algoritmilor - curs 4
13

13.1. Prezentarea generala a metodei

Metoda Greedy se poate aplica unor


probleme de optimizare cu solutie vectorial,
ca alternativ mai eficient la o cutare
exhaustiv (de tip 'backtracking').
Un algoritm Greedy este un algoritm iterativ
(nerecursiv) care determin n fiecare pas k o
component x[k] a vectorului solutie si nu mai
revine ulterior la aceast alegere.

Proiectarea Algoritmilor - curs 5


13

13.1. Prezentarea generala a metodei

Numele metodei ('Greedy'= lcomie)


sugereaz modul de lucru:
la stabilirea valorii lui x[k] se alege dintre
candidatii posibili pe acela care este optim n
pasul k, deci un optim local.
In general, aceast alegere precipitat,
grbit si care nu tine seama de valorile ce
vor fi stabilite n pasii urmtori pentru
x[k+1],..x[n] nu poate garanta solutia optim a
problemei.
Proiectarea Algoritmilor - curs 6
13

13.1. Prezentarea generala a metodei


In functie de specificul problemei, un algoritm
greedy poate conduce la solutia optim sau la o
solutie destul de bun, desi suboptimal.
Rezultatul unui algoritm greedy pentru o
problem dat depinde si de datele concrete ale
problemei, sau chiar de ordinea introducerii lor.
De exemplu, n problema exprimrii unei sume de
bani printr-un numr minim de monede de valori date
rezultatul (optim sau suboptim) depinde de valorile
monedelor si de valoarea sumei.

Proiectarea Algoritmilor - curs 7


13

13.1. Prezentarea generala a metodei


Algoritmul greedy foloseste monedele n
ordinea descresctoare a valorilor lor, deci se
repede la monedele de valoare maxim, care
vor fi n numr mai mic pentru aceeasi sum.
Fie monede de valori 11,5 si 1:
pentru suma 12 rezultatul algoritmului greedy va
fi optim (dou monede de valori 11 si 1)
dar pentru suma 15 rezultatul algoritmului
greedy nu va fi optim (5 monede de valori
11,1,1,1,1 n loc de 3 monede de valori 5,5,5).

Proiectarea Algoritmilor - curs 8


13

Coninutul cursului

13.1. Prezentarea generala a metodei


13.2. Schema generala a metodei
13.3. Implementari ale metodei

Proiectarea Algoritmilor - curs 9


13

13.2. Schema generala a metodei


Pentru a exemplifica aceast metod
considerm o mulime A cu n elemente.
Problema care ar trebui rezolvat const din
determinarea unei submulimi B a lui A.
Aceasta trebuie s ndeplineasc anumite
condiii pentru a fi acceptat ca soluie.
Dintre toate submulimile acceptate (numite
soluii posibile), se va alege una singur numit
soluie optim.

Proiectarea Algoritmilor - curs 10


13

13.2. Schema generala a metodei


Dintre soluiile posibile trebuie aleas cea optim
tinnd cont de proprietatea urmtoare:
Dac B este soluie posibil i CB atunci i C este
soluie posibil.
Multimea este ntotdeauna soluie posibil.
Iniial se pornete de la mulimea vid.
Se alege ntr-un anumit fel un element din A, neales
la paii precedeni.
Dac acest adugare la soluia parial construit
conduce la o soluie posibil atunci construim noua
soluie posibil prin adugarea elementului
procedura Greedy1.

Proiectarea Algoritmilor - curs 11


13

13.2. Schema generala a metodei


procedure Greedy1 (A, n, B)
begin
B<-
for i=1 to n do
begin
ALEGE(A, i, x)
POSIBIL(B, x, v)
if v=1 then ADAUG(B, x)
end
end

Proiectarea Algoritmilor - curs 12


13

13.2. Schema generala a metodei

Procedura ALEGE selecteaz un element x =


aj { aI, . . ., an } i efectueaz interschimbarea ai
aj.
Procedura POSIBIL verific dac B {x} este
soluie posibil, caz n care variabila boolean v
va lua valoarea 1, altfel ea va lua valoarea 0.
Procedura ADAUG nlocuiete pe B cu B {x}.

Proiectarea Algoritmilor - curs 13


13

13.2. Schema generala a metodei

Procedura ALEGE nu precizeaz deloc cum


se selecteaz un element x, de aceea trebuie
stabilit o procedur de prelucrare ( PREL ),
care va preciza ordinea n care vor fi
introduse elementele lui A n soluie -
procedura Greedy2 .

Proiectarea Algoritmilor - curs 14


13

13.2. Schema generala a metodei

procedure Greedy2(A, n, B)
begin
PREL
B<-
for i=1 to n do
begin
POSIBIL(B, ai, v )
if v=1 then ADAUG(B, ai)
end
end

Proiectarea Algoritmilor - curs 15


13

Coninutul cursului

13.1. Prezentarea generala a metodei


13.2. Schema generala a metodei
13.3. Implementari ale metodei

Proiectarea Algoritmilor - curs 16


13
13.3.1. Algoritm Greedy pentru problema
rucsacului
Problema rucsacului, sau problema selectiei
optime, se poate enunta astfel:
Fiind date n obiecte, fiecare cu greutatea g[i] si
valoarea v[i] si un rucsac cu capacitatea total Gt, s
se determine ce obiecte trebuie selectate pentru a fi
luate n rucsac astfel nct greutatea lor total s nu
depseasc Gt si valoarea lor s fie maxim.
Problema poate avea dou variante :
- varianta fractionar, dac se pot lua prti din fiecare
obiect;
- varianta 0/1, dac nu se pot lua dect obiecte ntregi.

Proiectarea Algoritmilor - curs 17


13
13.3.1. Algoritm Greedy pentru problema
rucsacului
In varianta 0/1 vectorul solutie are n
componente si fiecare x[k] poate fi 1 sau 0
dup cum obiectul k a fost sau nu selectat.
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.

Proiectarea Algoritmilor - curs 18


13
Lista candidatilor este lista obiectelor, ordonat dup
valoarea lor specific.
Exemplu numeric: n=3, Gt=15
i 1 2 3
g[i] 10 6 8
v[i] 20 10 12
v[i]/g[i] 2.0 1.66 1.5
Solutia greedy spune c trebuie selectat obiectul 1,
valoarea selectiei fiind 20.
Vectorul solutie: x[1]=1, x[2]=0, x[3]=0
Solutia optim este cea care ia obiectele 2 si 3, cu
valoarea total 22 si greutatea total 14:
x[1]=0, x[2]=1, x[3]=1

Proiectarea Algoritmilor - curs 19


13
Implementarea acestui algoritm:
#include<iostream.h>
float c[20],g[20],ef[20];
// c - vectorul in care se trec castigurile pt.
fiecare obiect in parte
// g - vectorul in care se trec greutatile fiecarui
obiect
// ef - vectorul eficientei transportului fiecarui
obiect
// de fapt, eficienta este castigul impartit la
greutate (castigul obtinut prin transportul
unitatii de greutate)

Proiectarea Algoritmilor - curs 20


13
int ordine[20];
// ordine - vector folosit la sortarea in ordine
descrescatoare a eficientei de transport
int i, n, aux1, invers;
// n - numarul de obiecte
// i - contor de lucru
// aux1 - variabila de interschimbare
// invers - variabila folosita la sortarea vectorului
ordine
float gr, aux, castig;

Proiectarea Algoritmilor - curs 21


13
int main(void)
{
cout<<"Greutatea ce poate fi transportata ";
cin>>gr;
cout<<endl<<" Dati numarul de obiecte ";
cin>>n;
for(i=1;i<=n;i++)
{
cout<<endl<<"cost["<<i<<"]= "; cin>>c[i];
cout<<"greutate["<<i<<"]= "; cin>>g[i];
ordine[i] = i;
ef[i] = c[i] / g[i];
cout<<"eficienta pt. obiectul "<<i<<" este "<<ef[i];
}
Proiectarea Algoritmilor - curs 22
do{ 13
invers=0;
for(i=1;i<=n-1;i++)
if(ef[i] < ef[i+1])
{
//sortam vectorul ef
aux=ef[i]; ef[i]=ef[i+1]; ef[i+1]=aux;
//sortam vectorul c
aux=c[i]; c[i]=c[i+1]; c[i+1]=aux;
//sortam vectorul g
aux=g[i]; g[i]=g[i+1]; g[i+1]=aux;
invers=1;
//sortam vectorul ordine
aux1=ordine[i];
ordine[i]=ordine[i+1];
ordine[i+1]=aux1;
}
}while(invers!=0);
Proiectarea Algoritmilor - curs 23
castig=0;i=1; 13
cout<<endl;
cout<<"Posibilitatea de incarcare eficienta a rucsacului este : "<<endl;
while( (gr > 0) && (i <= n) )
{
if(gr > g[i])
{
cout<<"se incarca obiectul "<<ordine[i]<<" : "<<1<<endl;
gr=gr-g[i];
castig=castig+c[i];
}
else
{
cout<<"se incarca obiectul "<<ordine[i]<<" :
"<<gr/g[i]<<endl;
gr=0;
castig=castig+c[i]*gr/g[i];
}
i++;
}
cout<<"Castig total = "<<castig;
}
Proiectarea Algoritmilor - curs 24
13

Proiectarea Algoritmilor - curs 25


13
13.3.2. Algoritm Greedy pentru problema
submultimii de suma data

Se da o multime de numere pozitive, P


si un numar M.
Se cere determinarea unei submultimi
a lui P a carui suma a elementelor sa fie
cel mult M.

Proiectarea Algoritmilor - curs 26


13
#include <iostream.h>
int main()
{
int n, p[200], rez[200], k, M, i, j, sum, temp, x;
cout<<"introduceti n: "; cin>>n;
for (i=0; i<n; i++)
{
cout<<"p["<<i<<"]=";
cin>>p[i];
}
cout<<"Introduceti suma: "; cin>>M;
/* incepem abordarea greedy a problemei */
/* ordonam crescator multimea de numere p */
for (i=0; i<n-1; i++)
for (j=i+1; j<n; j++)
if (p[i]>p[j])
{ temp = p[i]; p[i] = p[j]; p[j] = temp; };
Proiectarea Algoritmilor - curs 27
13
k = 0;
sum = 0;
for (i=0; i<n; i++)
{
x = p[i]; /* alege(A, i , x) */
if ( sum + x <= M )
{
rez[k++] = x;
sum += x;
}
else break;
}
cout<<"submultimea rezultat: ";
for (i=0; i<k; i++) cout<<" "<<rez[i];
}

Proiectarea Algoritmilor - curs 28


13

Proiectarea Algoritmilor - curs 29


13
13.3.3. Algoritm Greedy pentru problema
determinarii sumei maxime

Se da o multime X= { x1, x2, . . ., xn }


cu elemente reale.
Sa se determine o submultime a lui X
astfel nct suma elementelor submultimii
sa fie maxima.

Proiectarea Algoritmilor - curs 30


13
13.3.3. Algoritm Greedy pentru problema
determinarii sumei maxime
#include <iostream.h>
int n,i,k;
float s[20],x[20];
int main(void)
{
cout<<"Dati numarul de elemente n = ";cin>>n;
cout<<endl<<"Dati elementele vectorului "<<endl;
for(i=1;i<=n;i++)
{
cout<<"x["<<i<<"]= ";
cin>>x[i];
}

Proiectarea Algoritmilor - curs 31


13
13.3.3. Algoritm Greedy pentru problema
determinarii sumei maxime
k=0;
for(i=1;i<=n;i++)
if(x[i]>0)
{
k++;
s[k]=x[i];
}
cout<<"Submultimea ceruta este formata din : ";
for(i=1;i<=k;i++) cout<<s[i]<<" ";
}

Proiectarea Algoritmilor - curs 32


13

Proiectarea Algoritmilor - curs 33


13
13.3.4. Algoritm Greedy pentru problema
determinarii a k divizori

Fiind dat numarul natural k > 1, se cere


sa se determine cel mai mic numar natural
n avnd exact k divizori naturali proprii
(diferiti de 1 si n).

Proiectarea Algoritmilor - curs 34


13
13.3.4. Algoritm Greedy pentru problema
determinarii a k divizori
#include<iostream.h>
int n,i,k,s,v;
int verif(int n,int k)
{
int i=0,j;
for(j=2;j<=n-1;j++)
if(n%j==0) i++;
if(i==k) v=1;
else v=0;
return v;
}

Proiectarea Algoritmilor - curs 35


13
int main(void)
{
cout<<"Dati numarul de divizori k > 1 ";cin>>k;
cout<<endl<<"Cel mai mic numar care are exact "<<k<<"
divizori este "<<endl;
n=k+2;
s=0;
while(s==0)
{
v=verif(n,k);
if(v==1)
{
cout<<n;
s=1;
}
n++;
}
}

Proiectarea Algoritmilor - curs 36


13

Proiectarea Algoritmilor - curs 37


13

ntrebri?

Proiectarea Algoritmilor - curs 38

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