met reluarii.pptx
- Количество слайдов: 8
Metoda reluării
Introducere În metoda reluării se presupune că soluția problemei pe care trebuie să o rezolvăm poate fi reprezentată printr-un vector: X=(x 1, x 2, . . , xk, …, xn). Fiecare componentă xk a vectorului X poate lua valori dintr-o anumită mulțime Ak, k=1, 2, . . . , n. Se consideră că cele mk elemente ale fiecărei mulțimi Ak sînt ordonate conform unui criteriu bine stabilit. Cînd voaloarea pentru xk este stabilită, se verifică anumite condiții de continuare referitoare la x 1, x 2, . . . , xk.
Denumirea engleză Menționăm faptul că anume micșorarea lui k dă nume metodei studiate, cuvintul “reluare” semnificînd revenirea la alte variante de alegere a variabilelor x 1, x 2, . . . , xk -1. Evident, aceeași semnificație o are și denumirea engleză a metodei în studiubacktracking (back-înapoi, track-urmă).
Căutarea soluției prin metoda reluării Se observă că primul element a 11 din mulţimea A 1 nu satisface condiţiile de continuare şi, în consecinţă, se trece la elementul al doilea a 12 din aceeaşi mulţime. Mai departe în vectorul X se include primul element a 21 din mulţimea A 2, element care satisface condiţiile de continuare, şi se trece la examinarea elementelor din mulţimea A 3. Întrucît niciunul din elementele a 31 , a 32 , a 33 nu satisface condiţiile de continuare, se revine la mulţimea A 2 din care se alege elementul al doilea, şi anume, a 22. După aceasta se testează din nou elementele mulţimii A 3, elementul a 32 satisfăcînd condiţiile de continuare.
Schema generală Procedura Reluarae comunica cu programul appellant și subprogramele apelate prin variabile globale ce reprezintă vectorul X și mulțimile A 1, A 2, . . . , An. Procedure Reluare (k: integer); Subprogramele apelate excută următoarele begin operații: if k<=n then Primul. Element (k)- returnează primul element begin din mulțimea Ak; X[k]: =Primul. Element(k); Continuare (k) – returnează valoarea true dacă if Continuare(k) then Reluare(k+1); elementele înscrise în primele k componente ale while Exista. Succesor(k) do vectorului X satisfac condițiile de continuare și false în caz contrar; begin ExistăSuccesor (k)- returnează valoarea true X[k]: =Succesor(k); if Continuare(k) then Reluare(k+1) dacă elementul memorat în componenta Xk are un succesor în mulțimea Ak și false în caz end; { while } contrar. end { then } Succesor (k) – returnează succesorul else Prelucrarea. Solutiei; elementului memorat în componenta xk. end; {Reluare} Prelucrarea. Soluției- în aceasta procedură soluția reținută în vectorul X este afișată la ecran.
La execuţia apelului Reluare(1) în componenta x 1 a vectorului X se înscrie primul element al mulţimii A 1: X=(a 11). Întrucît în cazul acestui vector apelul Continuare(1) returnează valoarea false, se trece la execuţia instrucţiunii while. Apelul Exista. Succesor(1) returnează valoarea true şi, prin urmare, în componenta x 1 a vectorului X se înscrie succesorul elementului a 11: X=(a 12). De data aceasta apelul Continuare(1) returnează valoarea true şi, prin urmare, se trece la execuţia recursivă a apelului Reluare(2). Evident, în componenta x 2 a vectorului X va fi înscris primul element din mulţimea A 2: X=(a 12, a 21). Pentru acest vector funcţia Continuare returnează valoarea true, fapt ce declanşează execuţia recursivă a apelului Reluare(3). În cazul apelului Reluare(3) componenta x 3 a vectorului X ia recursiv valorile a 31, a 32 şi a 33: X=(a 12, a 21, a 31); X=(a 12, a 21, a 32); X=(a 12, a 21, a 33), însă nici unul din aceşti vectori nu satisface condiţiile de continuare. După examinarea ultimului element din mulţimea A 3, funcţia Exista. Succesor returnează valoarea false şi, în consecinţă, se revine în contextul apelului Reluare(2). În acest context în componenta x 2 a vectorului X se înscrie succesorul elementului a 21: X=(a 12, a 22). Întrucît şi pentru acest vector funcţia Continuare returnează valoarea true, din nou se execută apelul recursiv Reluare(3). Însă, spre deosebire de apelul precedent, în acest caz vectorul X=(a 12, a 22, a 32) satisface condiţiile de continuare, fapt ce declanşează execuţia apelului recursiv Reluare(4). În acest apel k>n şi, prin urmare, procedura Prelucrarea. Solutiei va afișa coordonatele vectorului X la ecran.
Problemă Fie n aparţine N*. Scrieţi un program recursiv care să genereze toate partiţiile mulţimii {1, 2. . . n}. program Partitii; const NMax = 20; type Element = 1. . NMax; Clasa = 1. . NMax; Partitie = array[Element] of Clasa; var N: Element; NC: Clasa; P: Partitie; Nr. P: word; {numarul de elemente din multime} {numarul de clase} {numarul de partitii} procedure Afisare; var i: Element; j: Clasa; begin inc(Nr. P); write('Partitia ', Nr. P, ': '); for j : = 1 to NC do begin for i : = 1 to N do if P[i]=j then write(i, ' '); write(#8'} '); end; writeln; end; {afisez clasa nr. j} write(' {');
procedure Gen. Partitie(k: Element); {cand apelam Gen. Partitie(k), in vectorul P pe primele k-1 pozitii se afla o partitie a multimii 1, 2, . . . , k-l formata din NC clase} var j: Clasa; begin if k=N+1 then Afisare {partitia este complet construita} else begin {plasam elementul k in una din clasele existente} for j : = 1 to NC do begin P[k] : = j; Gen. Partitie(k + 1); end; {sau elementul k reprezinta o clasa separata} inc(NC) ; {maresc numarul de clase} P[k] : = NC; Gen. Partitie(k+1); dec(NC); {restaurez numarul de clase} end; begin {program principal} write('n= '); readln(n); Gen. Partitie(1); end.


