Sunteți pe pagina 1din 17

Metoda Reluarii

Tehnica Greedy
Datele initiale:
multimea A={a1,a2,...,an};
Solutia problemei:
vectorul X=(x1,x2,...xn), x~A
Ideia tehnicii Greedy:
alegem cite un element din multimea A si
il includem in vectorul X
Schema generala a algoritmului Greedy
while ExistaElemente do
begin
AlegeUnElement(x);
IncludeElementul(x);
end

Datele initiale in metoda reluarii

Multimele:
A1={a11,a12,...,a1m1};
A2={a21,a22,...,a2m2};
...
An={an1,an2,...,anmn};
Solutia in metoda reluarii

Spatiul solutiilor:
S=A1*A2*...*An
Solutia:
X=(x1,x2,...,xn),
unde x1~A1,a2~A2,...,xn~An.
Ideia metodii reluarii
1.Presupunem c la pasul k am calculat deja valorile:
(x1,x2,...,xk)
2. Selectm din mulimea Ak+1 valoarea xk+1:
(x1,x2,...,xk,xk+1)
3.Daca (x1,x2,...,xk,xk+1) satisface conditiile ,trecem
la pasul k+2. In caz contrar revenim la pasul
k si alegem alt xk.
Cautarea solutiei prin metoda reluarii
0
1
1
1
0
k:=1
k k := +1
a
1,1
a
2,1
a
1 2 ,
a
2,2
a
3,1
a
3,2
a
3,3
0
k k := +1
k k- := 1
k k := +1
1
A
1
A
2
A
3
0
0
Schema generala a algoritmului recursiv
bazat pe metoda reluarii
procedure Reluare(k:integer);
begin
if k<=n then
begin
X[k]:=PrimulElement(k);
if Continuare(k) then Reluare(k+1);
while ExistaSuccesor(k) do
begin
X[k]:=Succesor(k);
if Continuare(k) then Reluare(k+1)
end; { while }
end { then }
else PrelucrareaSolutiei;
end; {Reluare}
Clasificare problemelor
1.Multimele A1,A2,...,An sint cunoscute.

2. Snt cunoscute elementele din care snt
formate mulimile A1,A2,...,An, numrul n
fiind necunoscut.
3. Elementele din care snt formate mulimile A1,
A2, ..., An si numrul n snt necunoscute.

Exemplul 1
Se consider mulimile A1, A2, ..., An, fiecare
mulime fiind format din mk numere naturale.
Selectai din fiecare mulime cte un numr n
aa mod nct suma lor s fie egal cu q.
Exemplul 1.Reprezentarea datelor
const mmax=50; { numrul maximal de mulimi }
nmax=50; { numrul maximal de elemente }

type Natural = 0..MaxInt;
Multime = array[1..nmax] of Natural;

var A : array[1..nmax] of Multime;
n : 1..nmax; { numrul de mulimi }
M : array[1..nmax] of 1..mmax; { cardinalul mulimii S[k] }
X : array[1..nmax] of 1..mmax; { indicii elementelor selectate }
q : Natural;
k, j : integer;
Indicator : boolean;

Function PrimulElement
function PrimulElement(k : integer) : Natural;
begin
PrimulElement:=1;
end; {PrimulElement }
Function Continuare
function Continuare(k : integer) : boolean;
var j : integer;
suma : Natural;
begin
suma:=0;
for j:=1 to k do suma:=suma+A[j, X[j]];
if ((k<n) and (suma<q)) or ((k=n) and (suma=q))
then Continuare:=true
else Continuare:=false;
end; { Continuare }

Funciton ExistaSuccesor
function ExistaSuccesor(k : integer) : boolean;
begin
ExistaSuccesor:=(X[k]<M[k]);
end; { ExistaSuccesor }
function ExistaSuccesor(k : integer) : boolean;
begin
ExistaSuccesor:=(X[k]<M[k]);
end; { ExistaSuccesor }
Procedure Reluare
procedure Reluare(k : integer);
{ Metoda reluarii - varianta recursiva }
begin
if k<=n then
begin
X[k]:=PrimulElement(k);
if Continuare(k) then Reluare(k+1);
while ExistaSuccesor(k) do
begin
X[k]:=Succesor(k);
if Continuare(k) then Reluare(k+1);
end { while }
end { then }
else PrelucrareaSolutiei;
end; { Reluare }

Va multumesc pentru atentie!!!

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