21
1 Informatica. Clasa a 11-a GREEDY Metoda optimului loca

Tehnici de Programare Greedy

Embed Size (px)

DESCRIPTION

descrierea metodei Greedy. Exemple

Citation preview

Page 1: Tehnici de Programare Greedy

1

Informatica. Clasa a 11-a

GREEDY

Metoda optimului local

Page 2: Tehnici de Programare Greedy

2

Ideea metodei optimului local

},,,{ 21 naaaA • Metoda rezolvă probleme de optim în care soluţia se

construieşte pe parcurs.

• Optimul global se determină prin estimări succesive ale optimului local.

• Metoda greedy permite determinarea unei singure soluţii care corespunde unui anumit criteriu de optim

• Se aplică în cazul problemelor în care soluţia se construieşte ca submulţime a unei mulţimi date.

Page 3: Tehnici de Programare Greedy

3

Prezentarea problemei

Se dă o mulţime A cu n elemente şi se cere să se determine o submulţime a sa(B) care satisface anumite restricţii. Această submulţime se numeşte soluţie posibilă. Se cere să se determine o soluţie posibilă care fie să maximizeze fie să minimizeze o anumită funcţie obiectiv dată. Această soluţie posibilă se numeşte soluţie optimă.

Page 4: Tehnici de Programare Greedy

4

Metoda Greedy lucrează în paşi astfel: se iniţializează mulţimea soluţiilor (B) cu mulţimea

vidă (B=) se alege un anumit element x A se verifică dacă elementul ales poate fi adăugat la

mulţimea soluţiilor, dacă da atunci va fi adăugat (B=B{x})

procedeul continuă astfel, în mod repetat, până când au fost determinate toate elementele din mulţimea soluţiilor

Paşii de execuţie ai metodei

Page 5: Tehnici de Programare Greedy

Exemplu:

Se consideră o mulţime cu n numere reale. Se cere o submulţime a sa cu număr maxim de elemente, astfel încât suma elementelor sale să fie maximă.

Rezolvare:Se poate observa uşor că trebuie selectate doar

elemente mai mari sau egale cu 0(valoarea 0 va fi selectată pentru a avea număr maxim de elemente). Soluţia va fi memorată pe un vector b care va avea k elemente.

5

Page 6: Tehnici de Programare Greedy

6

procedura greedyk ← 0 { k este numărul de elemente din B} pentru i←1,n execută dacă (a[i]>=0) atunci

k ← k + 1 b[k] ← a[i]

smax←smax+a[i]sf_procedura

Descrierea algoritmului în pseudocod

Page 7: Tehnici de Programare Greedy

Observaţii

Metoda Greedy nu caută să determine toate soluţiile 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 soluţia optimă.Ordinul de complexitate al unui astfel de algoritm este redus considerabil prin faptul că se încearcă obţinerea soluţiei printr-o singură parcurgere a mulţimii din care se construieşte soluţia optimăÎn practică, înainte de aplicarea metodei, se fac prelucrări asupra acestei mulţimi care măresc ordinul de complexitate.

7

Page 8: Tehnici de Programare Greedy

Probleme pentru care metoda Greedy determină soluţia optimă

PROBLEMA: Se dă un graf G. Se cere determinarea arborelui parţial de cost minim

REZOLVARE:Algoritmul de rezolvare pe care îl folosim se bazează pe tehnica Greedy:

La început nu avem un arbore (avem mai mulţi arbori, fiecare dintre aceştia fiind format dintr-un singur nod), sortăm muchiile în ordine crescătoare a costurilorSe alege o muchie x (muchiile se aleg de la cea mai mică la cea mai mare)Verificăm dacă muchia poate fi adăugată (dacă nu se produc cicluri)Continuăm până când avem n-1 muchii (n = numărul de noduri)

8

Page 9: Tehnici de Programare Greedy

Probleme pentru care metoda Greedy determină soluţia optimă

PROBLEMA: Problema rucsaculuiSe dă un rucsac de volum V şi mai multe obiecte de greutăţi G1, G2,…, Gn ce au

volumele V1, V2,…, Vn. Se cere să se încarce rucsacul la greutatea maximă utilizând câte un obiect din fiecare tip.

REZOLVARE:Se observă că cea mai bună metodă de încărcare a rucsacului ar fi să introducem obiectele în ordine descrescătoare a densităţii acestora. Deci vom calcula densităţile obiectelor 1=G1/V1, 2=G2/V2, …,n=Gn/Vn şi vom sorta obiectele în ordine descrescătoare a densităţii. Acestea fiind realizate aplicăm metoda Greedy:La început volumul obiectelor adăugate Vo=0

Se alege un obiect (în ordine descrescătoare a densităţii)Verificăm dacă putem adăuga obiectul ( dacă prin adăugare nu se depăşeşte volumul admis)Repetăm până când s-au terminat obiectele sau s-a atins volumul dorit 9

Page 10: Tehnici de Programare Greedy

Probleme pentru care metoda Greedy nu determină soluţia optimă

PROBLEMA: Problema plăţii unei sume cu bancnote de valoare dată

Să se efectueze plata unei sume S utilizând un număr minim de monezi. Valorile monezilor se cunosc.

Metoda Greedy se poate aplica astfel:Fie suma care a mai rămas de plătit X=SSe alege moneda de valoare maximă Mi (astfel încât Mi<=X)

Se calculează nr. maxim de monezi Mi ce pot fi date

(n = X div Mi )

Repetăm până când restul sumei de plată e zero10

Page 11: Tehnici de Programare Greedy

Analiza unui caz pentru care metoda Greedy nu furnizează soluţia optima pentru problema plăţiiPresupunem că avem 5 monezi de valori : 100, 50, 20, 3.

Dacă suma care trebuie plătită este 370 atunci avem evoluţia :

Suma curentă de plată

Monede selectatevaloare număr

370 100 370 50 120 10 2

Dacă suma care trebuie plătită este 365 atunci avem evoluţia:

Suma curentă de plată

Monede selectatevaloare număr

365 100 365 50 115 10 15 3 12 … …

11

Se observă că în al doilea caz nu s-a ajuns la o soluţie ( soluţia corectă era 3x100+1x50+5x3=365). Această soluţie ar fi fost găsită dacă , în caz de insucces, s-ar fi făcut o revenire modificând una din selecţiile anterioare, dar aceasta estebacktracking.

Page 12: Tehnici de Programare Greedy

Problemă propusă

Să se scrie un program care determină toate secvenţele binare de lungime n, fiecare din ele conţinînd nu mai puţin de k cifre de 1.

Intrare: numere naturale n, 1<n<20, şi k, k<n, se citesc de la tastatură.

Ieşire: fiecare linie a fişierului text OUT.TXT va conţine câte o secvenţă binară distinctă, ce corespunde condiţiilor din enunţul problemei.

Page 13: Tehnici de Programare Greedy

Analiza problemei

Numărul secvenţelor binare de lungime n este 2n, finit. (vezi: Informatica, manual pentru clasa X)

Prin urmare, pentru problema dată poate fi aplicată metoda trierii(greedy).

Page 14: Tehnici de Programare Greedy

Modelul matematic

;1211...111

;2210...111

...

;2010...00

;101...000

;000...000

n

n

n

n

n

n

n

Elementele mulţimii S pot fi interpretate ca numere {0, 1, 2, ..., 2n-1}, reprezentate pe n poziţii binare.

Pentru generarea consecutivă a secvenţelor binare se va utiliza formula:

s0 = 0; si = si-1 + 1; i=1, ..., 2n-1

Page 15: Tehnici de Programare Greedy

Separarea subproblemelor

Generarea secvenţelor binare de lungime n cu r, r>k unităţi

Generarea secvenţelor binare de lungime n

Determinarea numărului de

unităţi în secvenţa curentă

Prelucrarea soluţiei curente

Page 16: Tehnici de Programare Greedy

Structuri de date

tablou unidimensional cu n elemente, ce pot primi valoarea 0 sau 1. Pentru problema propusă n nu depăşeşte valoarea 20.

fişier text pentru stocarea soluţiei.

Page 17: Tehnici de Programare Greedy

Algoritm

Iniţializăm variabilele n şi k, fişierul de ieşire, tabloul B.Pasul 1. Cercetarea secvenţei curente

Se calculează numărul de unităţi (r) în secvenţa curentă BPasul 2. Prelucrarea soluţiei

Dacă r k, secvenţa curentă B este înscrisă în fişierul de ieşire. Pasul 3. Verificarea prezenţei secvenţelor necercetate

Dacă r = n se închide fişierul de ieşire, apoi STOP. Pasul 4. Generarea secvenţei următoare

Dacă B[n]=0 atunci B[n] 1în caz contrar: i n

atât timp cât B[i] = 1 repetămB[i] 0; i i–1;

pentru indicele curent i B[i] 1Revenim la Pasul 1.

Page 18: Tehnici de Programare Greedy

Declaraţii

Program Triere;Const Nmax=20;type secventa01 = array [ 1 .. Nmax ] of

0..1;var b : secventa01; r, i , n , k : integer; f : text;

Page 19: Tehnici de Programare Greedy

Funcţii

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

Page 20: Tehnici de Programare Greedy

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;

Page 21: Tehnici de Programare Greedy

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.