Sunteți pe pagina 1din 16

1

Metoda relurii

Datele iniiale n metoda relurii

Mulimile:

A1 {a11 , a12, , a1m1 };


A2 {a21 , a22, , a2 m2 };
...

An {an1 , an 2, , anmn }.

Soluia n metoda relurii

Spaiul soluiilor:

S A1 A2 An
Soluia:

X ( x1 , x2 , , xn ),
unde

x1 A1 ; x2 A2 ; ..., xn An .

Ideia metodei relurii


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. Dac ( x1 ,

x2 , , xk , xk 1 ) satisface condiiile

problemei, trecem la pasul k+2.


n caz contrar revenim la pasul k i alegem alt xk.

Cutarea soluiei prin metoda relurii 5

k := 1

1 ,1

1 ,2

2 ,2

k := k + 1
a

2 ,1

1
k := k + 1

k := k -1

k := k + 1
a

0
3 ,1

a 3 ,2

0
0

a 3 ,3

Schema general a algoritmului recursiv


6
bazat pe metoda relurii
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}

Operaii

Procedura Reluare comunic cu programul apelant i subprogramele


apelante prin variabilile globale ce reprezin vectorul X i
mulimile A1, A2, ..., An.
Subprogramele apelante execut urmtoarele operaii:
PrimulElement (k)- returneaz primul element din mulimile Ak ;
Continuare (k)- returneaz valoarea true dac elementele nscrise n primele k componente
ale vectorului X satisfac condiiile de continuare i false n caz contrar;
ExistaSuccesor (k)- returneaz valoarea true dac elementul memorat n componena xk
are un succesor n mulimea Ak i false n caz contrar.
Succesor (k)- returneaz succesorul elementului memorat n componena x
PrelucrareaSolutiei- de obicei, n aceast procedur soluia reinut n vecto
afiat la ecran.

Clasificarea problemelor

1. Mulimile A1, A2, ..., An snt 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 i numrul n snt necunoscute.

Exemplul 1. Problema din manual

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

10

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

11

function PrimulElement(k : integer) : Natural;


begin
PrimulElement:=1;
end; {PrimulElement }

Function Continuare

12

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 }

Function ExistaSuccesor

function ExistaSuccesor(k : integer) : boolean;


begin
ExistaSuccesor:=(X[k]<M[k]);
end; { ExistaSuccesor }
function Succesor (k:integer) : integer;
begin
Succesor :=X[k]+1;
end;{Succesor}
procedure PrelucrareaSolutiei;
var k: integer;
begin
write (Solutia:);
for k:=1 to n do write (A[k, X[k]],);
writeln;
Indicator:=true;
end; {PrelucrareaSolutiei}

13

Procedure Reluare

14

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 }

Exemplul 2. Labirintul

1
1
2
3

2 3 ...

... m

i
C
n

15

Labirintul. Formularea matematic 16

Mulimile:

A1 {Sus, Dreapta , Jos, Stnga}


A2 {Sus, Dreapta , Jos, Stnga}
A3 {Sus, Dreapta , Jos, Stnga}

...
Soluia:

X {Dreapta , Dreapta , Dreapta , Jos, Dreapta ,


Dreapta , Dreapta , Jos, Jos, Jos, Jos}

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