Documente Academic
Documente Profesional
Documente Cultură
Laborator 3
Descriere: Metoda optimului local – Greedy
1. Introducere
Metoda Greedy are ın vedere rezolvarea unor probleme de optim ın care optimul global se
determina din estimari succesive ale optimului local. Metoda Greedy se aplica urmatorului tip de
problema: dintr-o multime de elemente A, se cere sa se determine o submultime B, care
ındeplineste anumite conditii. De exemplu, alegerea ordinii optime de efectuare a unor lucrari,
alegerea traseului optim pentru vizitarea unor obiective turistice, etc. Deoarece este posibil sa existe
mai multe solutii se va alege solutia care maximizeaza sau minimizeaza o anumita functie obiectiv.
O problem a poate fi rezolvata prin tehnica (metoda) Greedy daca ındeplineste proprietatea: daca B
este o solutie, iar C este inclusa ın B, atunci si C este o solutie. Pornind de la aceasta conditie, initial
se presupune ca B este multimea vida si se adauga succesiv elemente din A ın B, ajungand la un
optim local. Dar, succesiunea de optimuri locale nu asigura, ın general, optimul global. Daca se
demonstreaza ca succesiunea de optimuri locale conduce la optimul global, atunci metoda Greedy
este aplicabila.
2. Algoritmi Greedy
Algoritmii greedy sunt ın general simpli si sunt folositi la rezolvarea unor probleme de optimizare.
In cele mai multe situatii de acest fel avem:
Pentru a rezolva problema de optimizare, cautam o solutie posibila care sa optimizeze valoarea
functiei obiectiv.
Un algoritm greedy construieste solutia pas cu pas. Initial, multimea candidatilor selectati este vida.
La fiecare pas, ıncercam sa adaugam la aceasta multime pe cel mai promitator candidat, conform
functiei de selectie. Daca, dupa o astfel de adaugare, multimea de candidati selectati nu mai este
ASD
fezabila, eliminam ultimul candidat adaugat;acesta nu va mai fi niciodata considerat. Daca, dupa
adaugare, multimea de candidati selectati este fezabila, ultimul candidat adaugat va ramane de
acum incolo ın ea. De fiecare data cand largim multimea candidatilor selectati, verificam daca
aceasta multime nu constituie o solutie posibila a problemei. Daca algoritmul greedy functioneaza
corect, prima solutie gasita va fi totodata o solutie optima a problemei.
Solutia optima nu este ın mod necesar unica: se poate ca functia obiectiv sa aiba aceeasi valoare
optima pentru mai multe solutii posibile.
3. Plata restului
Un exemplu simplu de algoritm greedy este cel folosit pentru rezolvarea urmatoarei probleme:
trebuie sa dam restul unui client, folosind un numar cat mai mic de monezi. In acest caz, elementele
problemei sunt:
candidatii: multimea initiala de monezi, pentru care presupunem ca avem un numar
nelimitat din fiecare tip de moneda
o solutie posibila: valoarea totala a unei astfel de multimi de monezi selectate
trebuie sa fie exact valoarea pe care trebuie sa o dam ca rest
o multime fezabila: valoarea totala a monezilor selectate ın aceasta multime nu este mai
mare decat valoarea pe care trebuie sa o dam ca rest
functia de selectie: se alege cea mai mare moneda din multimea de candidate ramasa
functia obiectiv: numarul de monezi folosite ın solutie; se doreste minimizarea acestui
numar
import java.io.*;
else
return a[k]*x[k]==rest;
}
if (suma==val) {
int nrMonede=0;
for (int i=0;i<n;i++) //nr total de monede necare
nrMonede+=x[i];
if(nrMonede<min){
min=nrMonede;
for (int i=0;i<n;i++)
xopt[i]=x[i]; //solutia optima
}
return true;
}
else return false;
}
else if (k<n){
for(int i=0;i<val;i++){
x[k]=i;
if (posibil(k)){
include(k);
cautaSol(k+1);
exclude(k);
}
}
}
}
a=new int[n];
x=new int[n];
xopt=new int[n];
System.out.println("Suma de plata:");
rest=Integer.parseInt(stdin.readLine());
val=rest;
min=10000;
System.out.println("******************");
System.out.println("Nr minim de monede:");
for(int i=0;i<n;i++){
if(xopt[i]!=0){
System.out.print(xopt[i]+"*"+a[i]+" ");
System.out.print("Monede"+"\n");
}
}
} //end main
}
Realizati un program care rezolva problema rucsacului, sau problema selectiei optime. Fiind date n
obiecte, fiecare cu greutatea g[i] si valoarea v[i] si un rucsac cu capacitatea totala gt, sa se
determine ce obiecte trebuie selectate pentru a fi luate in rucsac astfel incat greutatea lor totala sa
nu depaseasca gt si valoarea lor sa fie maxima. Datele de intrare vor fi preluate dintr-un fisier
rucsac.in
Notam cu xi ∈ [0, 1] partea din obiectul i care a fost pusa ın rucsac. Practic, trebuie sa maximizam
functia
Pentru rezolvare vom folosi metoda greedy. O modalitate de a ajunge la solutia optima este de a
considera obiectele ın ordinea descrescatoare a valorilor utilitatilor lor date de raportul
si de a le ıncarca ıntregi ın rucsac pana cand acesta se umple. Din aceasta cauza presupunem ın
continuare ca
iar o solutie posibila este solutie optima daca maximizeaza functia f. Vom nota Gp greutatea
permisa de a se ıncarca ın rucsac la un moment dat. Conform strategiei greedy, procedura de
rezolvare a problemei este urmatoarea:
ASD
import java.io.*;
void scrieSol(int k) {
int i;
if (vmax < vp) {
vmax=vp; nopt=k-1;
for (i=0;i<k;i++)
xopt[i]=x[i];
}
}
boolean solutie(int k) {
int i; // numar obiect
for (i=0;i<n;i++)
if ( sac[i] ==0 && g[i] <= gt-gp)
return false; // un obiect ob incape in sac
return true;
}
else
for (i=0;i<n;i++) {
x[k]=i;
if (posibil(k)) {
include(k);
cautSol (k+1);
exclude(k);
}
}
}
gt=Integer.parseInt(stdin.readLine());
n=Integer.parseInt(stdin.readLine());
g=new int[n];
v=new int[n];
xopt=new int[n];
x=new int[n];
sac=new int[n];
vmax=0; val= 0;
gp=0; vp=0;
r.cautSol (0);
System.out.println("Obiectele ");
for (int i=0;i<=nopt;i++)
5. Exercitii
5.1 Intre insulele unui arhipelag exista n poduri .Un turist isi propune sa viziteze aceste poduri , o
singura data , pornind de la o anumita insula . Pozitia podurilor este data sub forma unei matrici.
ASD
Elementele matricei vor fi preluate dintr-un fisier aflat pe disc. Sa se afiseze toate posibilitatile de
parcurgere a celor n poduri.
5.2 Un comis voiajor trebuie sa viziteze un numar de n orase. Initial el se va afla in orasul notat cu
1. El nu doreste sa treaca de doua ori prin acelasi oras, iar la intoarcere sa revina in orasul 1.
Cunoscand legaturile existente intre orase, sa se gaseasca toate drumurile posibile pe care le poate
efectua comis-voiajorul.