Documente Academic
Documente Profesional
Documente Cultură
While ExistaElemente do
begin
AlegeUnElement(x);
IncludeElementul(x)
end;
NU întotdeauna există un algoritm de tip
Greedy care găseşte soluţia optimă.
Vom identifica fisierele printr-un numar natural cuprins оntre [1, n], iar
lungimea fisierului i prin valoarea Lpi.
Solutie
1 2 n
Lp1 Lp2............................... Lpn
Metoda Greedy are două componente:
- stabilirea soluţiei de început;
- optimizarea acesteia.
Să luăm un exemplu concret , pe baza căruia vom ilustra cum se ‘’construieşte’’ soluţia.
Fie secvenţa :
8, 7, 8, 4, 9, 7, 5, 5, 4, 8, 7, 5, 9.
Deoarece A (1) este 8, nefiind număr prim se porneşte cu soluţia iniţială S:=0 (dacă
A (1) ar fi fost număr prim, am fi pornit cu soluţia s:=A(1)).
Apoi valorile lui S vor fi:
S:=0
S:=0+7=7
S:=7+5=12
De remarcat caracterul constructiv al soluţiei. Un termen curent (fie acesta A( i ))
contribuie la valoarea lui S dacă îndeplineşte două condiţii :
- este un număr prim;
- n-a mai fost utilizat.
Dacă in prealabil ordonăm crescător secvenţa considerată obţinem:
4, 4, 5, 5, 5, 7, 7, 7, 8, 8, 8, 9, 9
şi astfel se “vede’’ mult mai uşor repetabilitatea unui numar prim( faţă de situaţia iniţială
când pentru a constata dacă un număr prim a fost sau nu utilizat trebuie să
parcurgem întreaga secvenţă de fiecare dată ).
Pe baza afirmaţiilor anterioare rezultă un model de rezolvare pentru problema
propusă, model care dă structura generală a metodei Greedy :
Citire ( n , A);
Ordonare ( n , A );
If A [1] = NumarPrim Then S := A[1]
Else S:=0;
I := 2;
While I n do
begin
If (A[ I] <> A(I-1) )and (A [I] =Numarprim ) Then S := S +A [I]
I := I+1;
End;
Fie o planificare optimă a spectacolelor (un număr maxim k de
spectacole i1, i2,...,ik unde i1, i2,...,ik{1,2,…N} şi spectacolul ij
are loc înaintea spectacolului i j+1). O astfel de planificare
îndeplineşte condiţia: spectacolul ij+1 începe după terminarea
spectacolului ij.
o consecinţă imediată a condiţiei de mai sus este: spectacolul i j
ia sfîrşit înaintea terminării spectacolului ij+1(consecinţa nu
implică un efort de gîndire deosebit).
Vom construi o soluţie după următorul algoritm:
P1. Sortăm spectacolele după ora terminării lor;
P2 . Primul spectacol programat este cel care se termină cel
mai devreme;
P3. Alegem primul spectacol dintre cele care urmează în şir
după ultimului spectacol programat care îndeplineşte
condiţia că începe după ce s-a terminat ultimul spectacol
programat;
P4. Dacă tentativa de mai sus a eşuat (nu am găsit un astfel
Lemă. Algoritmul de mai sus conduce la soluţie optimă (număr maxim de
spectacole programate).
Demonstraţie:
Fie s1, s2,...,sl spectacole ordonate ca mai sus şi o soluţie optimă i1, i2,...,ik.
Dacă l=k rezultă că soliţia găsită este optimă;
Dacă l>k rezultă că soluţia i1, i2,...,ik nu este optimă (se contrazice ipoteza);
Dacă l<k procedăm ca mai jos.
Presupunem că i1s1. În acest caz putem înlocui i1 (în cadrul soluţiei opime) cu s1
(s1 este primul spectasol care se termină şi dacă ar figura pe altă poziţie în cadrul
soluţiei optime, se contrazice ipoteza). În concluzie, soluţia s1, i2,...,ik rămîne
optimă.
Fie lt primul indice pentru care stit. Soluţia s1, s2,...,st-1 it... este optimă.
Înlocuim it cu st. Înlocuirea este posibilă pentru că:
St nu figurează în cadrul soluţiei optime între primele t-1 componente;
St nu figurează între ultimile poziţii ale soluţiei optime (începînd cu poziţia t+1)
pentru că în acest caz înseamnă că st începe după terminarea lei it, caz în care se
contrazic modul în care a fost obţinut de algoritm alegerea lui st.
Procedînd astfel, la un mment dat soluţia optimă aete de forma: s1, s2,...,sl...ik.
Aceasta înseamnă că după sl a mai fost posibil să adăugăm alte spectacole. Se
contrazicemodul de obţinere al soluţiei de către algoritm. De aici rezultă k=i şi că
algoritmul obţine soluţia optimă.
Program SPECT;
Type spectacol=array[1..2, 1..10] of integer; ordine=array[1..10] of integer;
var s:spectacol; o:ordine; n,i,h1,m1,h2,m2:integer;
procedure sortare; var gata:boolean; m,i:integer;
begin
repeat
gata:=true;
for I:=1 to n-1 do if s[2,o[i]]>s[2,[I+1]] then
begin
m:=o[i]; o[i]:=o[I+1]; o[I+1]:=m;
gata:=false
end
until gata; end;
begin
write(‘n’); readln(n);
for I:=1 to n do
Begin o[i]:=i; write(‘ora de ]nceput pentru spestacolul’,I,’(hhmm)=’);
readln(h1,m1); s[1,i]:=h1*60+m1; write(‘ora de sfrsit pentru
spestacolul’,I,’(hhmm)=’); readln(h2,m2); s[2,i]:=h1*60+m2;
end;
sortare; writeln(‘ordinea spectacolelor este ’); writeln(o[1]);
for I:=2 to n do
if s[1,o[i]]>=s[2,o[I-1]]
then writeln(o[i]); end.
Tehnica Greedy conduce la timp de calcul polinomial.