Sunteți pe pagina 1din 21

Informatica.

Clasa a 11-a

Metoda optimului loca


GREEDY
1

Ideea metodei optimului


local

A {a1, a2, , an}

Metoda rezolv probleme de optim n care soluia se


construiete pe parcurs.
Optimul global se determin prin estimri succesive
ale optimului local.
Metoda greedy permite determinarea unei singure
soluii care corespunde unui anumit criteriu de optim
Se aplic n cazul problemelor n care soluia
se construiete ca submulime a unei mulimi date.

Prezentarea problemei

Se d o mulime A cu n elemente i se cere s se


determine o submulime a sa(B) care satisface
anumite restricii. Aceast submulime se numete
soluie posibil. Se cere s se determine o soluie
posibil care fie s maximizeze fie s minimizeze o
anumit funcie obiectiv dat. Aceast soluie posibi
se numete soluie optim.

Paii de execuie ai metodei


Metoda Greedy lucreaz n pai astfel:
se iniializeaz mulimea soluiilor (B) cu
mulimea vid (B=)
se alege un anumit element x A
se verific dac elementul ales poate fi
adugat la mulimea soluiilor, dac da
atunci va fi adugat (B=B{x})
procedeul continu astfel, n mod
repetat, pn cnd au fost determinate
toate elementele din mulimea soluiilor
4

Exemplu:
Se consider o mulime cu n numere reale.
Se cere o submulime a sa cu numr
maxim de elemente, astfel nct suma
elementelor sale s fie maxim.
Rezolvare:
Se poate observa uor c trebuie selectate
doar elemente mai mari sau egale cu
0(valoarea 0 va fi selectat pentru a avea
numr maxim de elemente). Soluia va fi
memorat pe un vector b care va avea k

Descrierea algoritmului n pseudoc

procedura greedy
k0
{ k este numrul de elemente din B}
pentru i1,n execut
dac (a[i]>=0) atunci
k k+1
b[k] a[i]
smaxsmax+a[i]
sf_procedura

Observaii
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.
Ordinul de complexitate al unui astfel de
algoritm este redus considerabil prin faptul c
se ncearc obinerea soluiei printr-o singur
parcurgere a mulimii din care se construiete
soluia optim
n practic, nainte de aplicarea metodei, se
7
fac prelucrri asupra acestei mulimi care

Probleme pentru care


metoda Greedy determin
soluia optim
PROBLEMA: Se d un graf G. Se cere determinarea
arborelui parial de cost minim
REZOLVARE:
Algoritmul de rezolvare pe care l folosim se bazeaz pe
tehnica Greedy:
La nceput nu avem un arbore (avem mai muli arbori,
fiecare dintre acetia fiind format dintr-un singur nod),
sortm muchiile n ordine cresctoare a costurilor
Se alege o muchie x (muchiile se aleg de la cea mai
mic la cea mai mare)
Verificm dac muchia poate fi adugat (dac nu se
produc cicluri)
8
Continum pn cnd avem n-1 muchii (n = numrul de

Probleme pentru care


metoda Greedy determin
soluia optim
PROBLEMA: Problema rucsacului
Se d un rucsac de volum V i mai multe obiecte de greuti
G1, G2,, Gn ce au volumele V1, V2,, Vn. Se cere s se
ncarce rucsacul la greutatea maxim utiliznd cte un
obiect din fiecare tip.
REZOLVARE:
Se observ c cea mai bun metod de ncrcare a rucsacului
ar fi s introducem obiectele n ordine descresctoare a
densitii acestora. Deci vom calcula densitile obiectelor
1=G1/V1, 2=G2/V2, ,n=Gn/Vn i vom sorta obiectele n ordine
descresctoare a densitii. Acestea fiind realizate aplicm
metoda Greedy:
La nceput volumul obiectelor adugate Vo=0
Se alege un obiect (n ordine descresctoare a densitii)
Verificm dac putem aduga obiectul ( dac prin adugare nu9

Probleme pentru care


metoda Greedy nu determin
soluia optim
Problema plii unei sume cu
bancnote de valoare dat

PROBLEMA:

S se efectueze plata unei sume S utiliznd un


numr minim de monezi. Valorile monezilor se
cunosc.
Metoda Greedy se poate aplica astfel:
Fie suma care a mai rmas de pltit X=S
Se alege moneda de valoare maxim Mi (astfel
nct Mi<=X)
Se calculeaz nr. maxim de monezi Mi ce pot fi
date

10

soluia optima pentru problema


plii
Presupunem c avem 5 monezi de valori : 100,
50, 20, 3.
Dac suma care trebuie
pltit este 370 atunci
avem evoluia :
Suma
Monede
curent
selectate
de valoare numr
plat

Dac suma care trebuie


pltit este 365 atunci
avem evoluia:
Suma
curent
de
plat

Monede
selectate
valoare numr

365
100
3
370
100
3
65
50
1
70
50
1
15
10
1
10 caz nu
2 s-a ajuns la o soluie
erv c20
n al doilea
(
soluia
corect
5
3
1 era
+1x50+5x3=365). Aceast soluie ar fi fost
2 gsit dac
, n caz
de insucc
cut o revenire modificnd una din seleciile anterioare, dar aceasta est
acking.
11

Problem
propus
S se scrie un program care determin toate
secvenele binare de lungime n, fiecare din ele
coninnd nu mai puin de k cifre de 1.
Intrare: numere naturale n, 1<n<20, i k,
k<n, se citesc de la tastatur.
Ieire: fiecare linie a fiierului text OUT.TXT
va conine cte o secven binar distinct, ce
corespunde condiiilor din enunul problemei.

Analiza problemei
Numrul secvenelor binare de lungime n
este 2n, finit.
(vezi: Informatica, manual pentru clasa X)
Prin urmare, pentru problema dat poate fi
aplicat metoda trierii(greedy).

Modelul matematic
000
...00 0;
n

000
...01 1;
n

00
...
010
2;
n

...

Elementele mulimii S pot fi interpretate


ca numere {0, 1, 2, ..., 2n-1},
reprezentate pe n poziii binare.
Pentru generarea consecutiv a
secvenelor binare se va utiliza formula:

n
111
...
10

2
2; s0 = 0;

n
si = si-1 + 1; i=1, ..., 2n-1
n
111
...
11

2
1;

n

Separarea subproblemelor
Generarea secvenelor binare de lungime n
cu r, r>k uniti

Generarea
secvenel
or binare
de
lungime n

Determinare
a numrului
de uniti n
secvena
curent

Prelucrar
ea
soluiei
curente

Structuri de date

tablou unidimensional cu n elemente, ce pot primi


valoarea 0 sau 1. Pentru problema propus n nu
depete valoarea 20.

fiier text pentru stocarea soluiei.

Algoritm
Iniializm variabilele n i k, fiierul de ieire, tabloul B.
Pasul 1. Cercetarea secvenei curente
Se calculeaz numrul de uniti (r) n secvena curent
B
Pasul 2. Prelucrarea soluiei
Dac r k, secvena curent B este nscris n fiierul de
ieire.
Pasul 3. Verificarea prezenei secvenelor necercetate
Dac r = n se nchide fiierul de ieire, apoi STOP.
Pasul 4. Generarea secvenei urmtoare
Dac B[n]=0 atunci B[n] 1
n caz contrar: i n
att timp ct B[i] = 1 repetm
B[i] 0; i i1;
pentru indicele curent i B[i] 1

Declaraii
Program Triere;
Const Nmax=20;
type secventa01 = array [ 1 .. Nmax ] of
0..1;
var b : secventa01;
r, i , n , k : integer;
f : text;

Funcii
function numara : integer;
var s , j : integer;
begin
s:=0;
for j:=1 to n do s:=s+b[j];
numara:=s;
end;

Proceduri
procedure scrie_sol;
var j: integer;
begin
for j:=1 to n do write (f, b[j]);
writeln(f);
end;
procedure urmator (var x:secventa01);
var
j:integer;
begin j:=n;
while x[j]=1 do
begin x[j]:=0; j:=j-1; end;
x[j]:=1;
end;

Program principal
begin
readln ( n, k);
assign (f, 'OUT.TXT');rewrite(f);
for i:=1 to n-k do b[i]:=0;
for i:=k+1 to n do b[i]:=1;
repeat
r:= numara;
if r >= k then scrie_sol;
if r < n then urmator(b);
until r=n;
close(f);
end.

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