Скачать презентацию Metoda reluării Introducere În metoda reluării se Скачать презентацию Metoda reluării Introducere În metoda reluării se

met reluarii.pptx

  • Количество слайдов: 8

Metoda reluării Metoda reluării

Introducere În metoda reluării se presupune că soluția problemei pe care trebuie să o 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 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 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 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 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 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 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.