You are on page 1of 3

Exemplu de implementare SA

Minimizare functie

% Optimizare functie myf1 prin Simulated Annealing


disp('Optimizare myf1 prin Simulated Annealing');
global DSL;

Nx=3;
TA=0.5;
Neps=4;
alfa=0.8;
kmax=20;
lmax=10;
DSL=1.; % valoarea initiala pt delta-sl : current step length
NrMaxEval=100000;
EPS1=10^(-6);
EPS2=10^(-6);
%Limite up si lower

Tmax=+3;
Tmin=-3;

xk=zeros(1,Nx);

%Initializari
Nacc=0;
Nev=0;
TA=0.5; % TA este SA-temperature, pt m=0;
%xk=xk+T0; % initializare stare initiala xk pt k=0

xopt=xk; % initializare solutie optimala

fi_xk=eval_myf1(xk);% fi_xk este valoarea functiei obiectiv in starea xk


fi_xopt=fi_xk; %la inceput este si valoarea optima
jc=0;
converg=0;

% BUCLA dupa m, adica modificare TA si verificare convergenta


while (converg==0) % asa-zisul ciclu dupa m;

% BUCLA dupa l
l=0;
while (l<=lmax)&&(converg==0)

% BUCLA dupa k
k=0;
while (k<=kmax)&&(converg==0)

% ******************GENERARE solutie noua in vecinatate


R=random('unif',-1,1,1,Nx); % R este un vector cu ri, i=1,...,Nx
xk1=xk+DSL*R; % Generare stare noua xk1 fara factor de stare

%Bound constraints
for i=1:Nx
if xk1(i)>Tmax xk1(i)=Tmax;end
if xk1(i)<Tmin xk1(i)=Tmin;end
end

% ******************EVALUARE functie obiectiv


fi_xk1=eval_fi_dejong5(xk1); %Evalueaza fi in starea generata
Nev=Nev+1;

% ******************DEPISTARE convergenta (formula (18))


if(abs(fi_xopt-fi_xk1)<=EPS1)
jc=jc+1;
else
jc=0; % Cand conditia (18) nu este respectata, o iau de la capat

end
if (jc==Neps)&&(TA<EPS2) %conditie de oprire
converg=1;
end
% ******************DEPISTARE depasire NrMaxEval
if (Nev>NrMaxEval) %conditie de oprire fara convergenta
converg=2;
end

% ******************Acceptare sau rejectare xk1


% ******************prin aplicarea criteriului METROPOLIS
if fi_xk1 <=fi_xk % Caut minim si deci nu se inverseaza inegalitatea
xk=xk1; % Se accepta neconditionat noua stare generata
fi_xk=fi_xk1; % Memorez si fi-ul
if(fi_xk1<=fi_xopt)
xopt=xk1; % Se ajusteaza optimul
fi_xopt=fi_xk1; %fi_xopt este noua valoarea optima
jc=0; % Cand se schima optimul anulez jc
disp(fi_xopt);
end

else

% regula METROPOLIS
val=exp(-(fi_xk1-fi_xk)/TA); %Remarc ca fi_xk1>fi_xk si cautam un minim
p=random('unif',0,1);
if val>=p
xk=xk1 ; % Se accepta noua stare generata
fi_xk=fi_xk1; % Memorez si fi-ul
Nacc=Nacc+1; % Actualizez nr de "pasi" acceptati
end
end

k=k+1;
end; %ciclu dupa k

DSL=Actualizare_DSL(Nacc,Nev);
l=l+1;
end; %ciclu dupa l

TA=TA*alfa;
xk=xopt; % Se continua cautarea cu xopt
fi_xk=fi_xopt;
disp(['TA: ',num2str(TA)]);
disp(['q: ',num2str(Nacc/Nev)]);
disp(['step length: ',num2str(DSL)]);
end;
disp('***********');

disp(['Nr de evaluari: ',num2str(Nev)]);


disp(['TA finala: ',num2str(TA)]);
disp(['step length: ',num2str(DSL)]);
xopt
disp(['val min: ',num2str(fi_xopt)]);

function DSL1=Actualizare_DSL(Nacc,Nev)
global DSL;
% global nrk;
% global vq;
q=Nacc/Nev;
% nrk=nrk+1;
% vq=[vq q];

if q>0.6
DSL1=DSL*(1.+(q-0.6)/0.4);
else
if q<0.4
DSL1=DSL*1./(1.+(0.4-q)/0.4);
else
DSL1=DSL;
end
end
end

function fi=eval_myf1(x)

fi=19.+x(1)^4-2*x(1)^2+3*x(2)^2+4*x(3)^2+12*x(2)+8*x(3);
end

You might also like