Académique Documents
Professionnel Documents
Culture Documents
- metoda Greedy;
- metoda Divide et impera;
- metoda Backtracking;
3
Pot apărea următoarele situaţii :
a) x[k] îndeplineşte condiţiile de continuare. Daca s-a ajuns la
soluţia finală (k = n) atunci se afişează soluţia obţinută. Daca nu
s-a ajuns la soluţia finală se trece la generarea elementului
următor – x [k-1];
b) x[k] nu îndeplineşte condiţiile de continuare. Se încearcă
următoarea valoare disponibila din S[k]. Daca nu se găseşte nici
o valoare în S[k] care să îndeplinească condiţiile de continuare,
se revine la elementul x[k-1] şi se reia algoritmul pentru o nouă
valoare a acestuia. Algoritmul se încheie când au fost luate in
considerare toate elementele lui S1.
Este o tehnica de programare aplicabila algoritmilor care oferă mai multe soluţii şi
are ca rezultat obţinerea tuturor soluţiilor problemei. Fiecare soluţie se memorează într-o
structura de date de tip stivă implementată cu ajutorul unui vector. Deci fiecare soluţie
poate fi pusă sub forma unui vector.
Respectivul nivel a mai fost vizitat dar l-am abandonat după ce am pus
o valoare care a generat o soluţie validă. Deci este posibil să fi rămas aici valori
neîncercate. Dacă nici pe acest nivel nu mai avem valori neîncercate mai facem un pas
înapoi în stivă. Mecanismul revenirilor a determinat denumirea de metoda backtracking.
4
Plecând de la nivelul 1 şi repetând algoritmul până când pe toate
nivelele au fost încercate toate valorile din mulţimea valorilor se obţin soluţii finale care se
tipăresc.
1) Varianta iterativă
Algoritm generare
start
k1
x[k]1
cât timp (k>0) execută
sem0
cât timp (in mulţimea Mk mai sunt valori netestate pentru xk) şi (sem=0)
executa
x[k]x[k]+1
dacă (x[k] are o valoare validă) atunci sem1
sfârşit dacă
sfârşit cât timp
dacă (sem=1) atunci
dacă (k=n) atunci
tipăreşte
altfel
kk+1
x[k]valoare iniţiala;
sfârşit dacă
altfel
kk-1
sfârşit dacă
sfârşit cât timp
stop
5
Descrierea algoritmului iterative
Pe prima poziţie din tabloul soluţie X (k=1) se pune o valoare iniţiala. In cazul
general, aceasta valoare este minima admisibila pe care o poate lua primul element
x[1] din mulţimea de valori M1 din care se scade o unitate.
Iniţializarea unui element xk se face astfel pentru ca la prima incrementare a
acestuia să i se atribuie prima valoare din mulţimea Mk de valori.
Variabila k păstrează poziţia curentă din tabloul X în care se va depune noul
element.
Variabila sem are rolul de a semnala situaţia în care elementul xk respecta
condiţiile interne. Se căuta în mulţimea Mk de valori (prin
incrementarea valorii curente a elementului xk : X[k] :=X[k]+1) prima valoare care
respecta condiţiile interne. Aceasta valoare xk, se compara cu elementele depuse in
tablou pentru a se verifica condiţiile de validare (valid(xk)). Daca valoare este valida
atunci sem1.
Dacă valoarea găsita pentru xk poate participa la generarea soluţiei, atunci se
verifică dacă s-au completat cu valori toate elementele din soluţie ; dacă s-a generat
o soluţie, aceasta este tipărita ; astfel, se trece la următorul element candidat la
generarea soluţiei (kk+ 1) ; x[k+1] este iniţializat cu o valoare corespunzătoare şi
sunt reluate verificările precedente.
Dacă in mulţimea Mk nu mai exista valori pe care sa le poate lua xk sem
rămâne 0 şi se caută o noua valoare pentru elementul xk-1.
Generarea soluţiilor are loc cat timp pentru primul element al tabloului soluţie
mai există valori în mulţimea M1 de valori. Dacă nu mai există astfel de valori,
poziţia curenta k, în tablou devine zero şi algoritmul se opreşte.
6
2) Varianta recursivă
Algoritm generare(k)
Start
pentru i valoare iniţiala, valoare maxima admisibilă din Mk execută
x[k]i
dacă (x[k] are o valoare validă) atunci
dacă(k=n) atunci tipăreşte
altfel generare (k+1)
sfârşit dacă
sfârşit dacă
sfârşit pentru
Stop.
7
recursiv (prin extragerea din vârful stivei a fiecărei valori depuse, se coboară in
stiva).
Generarea soluţiilor are loc cat timp, pentru primul element al tabloului
soluţie, mai exista valori in mulţimea M1. Daca nu mai exista astfel de valori, poziţia
curenta k, in tablou, devine zero si algoritmul de generare se opreşte.
Observaţii:
8
Problema comis-voiajorului
Enunţ:
Un comis voiajor trebuie să viziteze un număr n de oraşe.
Iniţial, el se află într-unul dintre ele, notat 1. Comis – voiajorul
doreşte să nu treacă de două ori prin acelaşi oraş, iar la întoarcere
să revină în oraşul 1. Cunoscând legăturile existente între oraşe, se
cere să se tipărească toate drumurile posibile pe care le poate
efectua comis – voiajorul.
Rezolvare in pseudocod:
procedura tipar
j nr natural
pentru j <- 1,n executa
scrie a[j]
altfel
pentru i <- 1,n executa
a[k] <- i
cont <-1
daca k>1
pentru t <-1,k-1
daca a[k]=a[t]
atunci cont <- 0
9
daca a[m[k-1][k]] =0
atunci cont <- 0
daca a[m[n][1]]=0
atunci cont <- 0
daca cont=1
atunci back(k+1)
start
citeşte n (n nr natural)
pentru b<-1,n (b nr natural)
pentru c<- 1,n (c nr natural)
scrie m[b][c] (valori naturale)
back(1).
Rezolvare Pascal:
program comisv;
type stiva=array[1..100] of integer;
var st:stiva;
i,j,n,k:integer;
as,ev:boolean;
a:array[1..20,1..20] of integer;
10
end;
function solutie(k:integer):boolean;
begin
solutie:=(k=n)
end;
procedure tipar;
var i:integer;
begin
for i:=1 to n do
write('nodul=',st[i]);
writeln('------');
end;
begin
write('nr. de noduri=');readln(n);
for i:= 1 to n do
for j:=1 to i-1 do begin
write('a[',i,',',j,']='); readln(a[i,j]);
a[j,i]:=a[j,i];
end;
end;
st[1]:=1; k:=2;
init(k,st);
while k>0 do
begin
repeat
succesor(as,st,k);
if as then valid(ev,st,k);
11
until (not as) or (as and ev);
if as then if solutie(k) then tipar
else begin
k:=k+1;
init(k,st);
end
else k:=k-1;
end;
end.
2 3
1 4
6 5
12
A(i,j) =
0, altfel
2
De la oraşul 1 la oraşul 2 există drum, deci se va urca în stivă;
1
2
2 Oraşul 2 se mai găseşte în stivă, deci nu este acceptat;
1
3
De la oraşul 2 la oraşul 3 se găseşte drum; prin oraşul 3 nu s-a mai
2
trecut, deci oraşul 3 este acceptat.
1
13
BILBIOGRAFIE
14
CUPRINS
15