Tehnici de Programare Greedy
-
Upload
felicia-lungu -
Category
Documents
-
view
88 -
download
17
description
Transcript of Tehnici de Programare Greedy
1
Informatica. Clasa a 11-a
GREEDY
Metoda optimului local
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.
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ă.
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
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
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
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
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
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
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
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.
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.
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).
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
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
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.
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.
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;
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;
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.