Documente Academic
Documente Profesional
Documente Cultură
Temă
Galați
2021
Cerință:
Utilizând un algoritm evolutiv (AE) să se determine minimul global ce
respectă restricțiile
Xi ≥0, pt. i=1,….,n
Xi ≤10, pt. i=1,….,n
Nume :Irimia
Vocale: v1 = i și v2 = i
Rezultă: A=g(v1) = 3
B=g(v2) = 3
Funcția aleasă pentru n = A = 3
4 2 4
f ( x 1 , x 2, x 3 )=18+2 ∙(x 1−1.7) +3 ∙ ( x 2−5 ) +2.5 ∙(x 3−2)
B=3
α = B / 10 → 0.3
Programele utilizate:
DELT.m
function [d]=DELT(y)
global g NGen;
r=random('unif',0.,1.);
d=y*(1-r^((1-g/NGen)^0.2));
end
incrucisare1.m
function incrucisare1(i,j,indice,n,xmin,xmax )
global pop;
%global ngene;
global N;
alf=0.3;
m=random('unif',-alf,1.+alf);
pop(N-indice+1,:)=pop(i,:)+m*(pop(j,:)-pop(i,:));
for k=1:n
if(pop(i,k)<xmin)
pop(i,k)=xmin;
end
if(pop(i,k)>xmax)
pop(i,k)=xmax;
end
end
end
EvalFitness.m
function J=EvalFitness(x)
J = 18+2*(x(1)-1.7)^4 + 3*(x(2)-5.)^2 + 2.5*(x(3)-2.)^4 ;
end
mutatie1.m
function mutatie1(icrom)
%MUTATIE pe cromozomul pop(i,:)
global ngene xmax xmin;
global pop;
k=randi(ngene); %for k=1:ngene
r=random('unif',0.,1.);
if r>0.5
y=xmax-pop(icrom,k);
f=1.;
else
y=pop(icrom,k)-xmin;
f=-1.;
end
de=DELT(y);
pop(icrom,k)=pop(icrom,k)+f*de;
if(xmin>=pop(icrom,k))
pop(icrom,k)= xmin;
end
if(xmax<=pop(icrom,k))
pop(icrom,k)= xmax;
end
%end
End
ScaleRank.m
function [P] = ScaleRank(R,miu,s)
% Primeste rank-urile celor miu cromozomi si
% presiunea de selectie (1. < s <2.)
P=zeros(1,miu);
for i=1:miu
P(i)=(2.-s+(2.*(R(i)-1)*(s-1.)/(miu-1)))/miu;
end
End
Sector.m
function [i]=Sector(x,A,miu)
%Gaseste pozitia sectorului pe roata
%norocului descrisa de valorile din A(miu)
%Vectorul A are miu elemente
if(x<0)
disp('eroare x<0');end
gasit=0;
i=1;
while (gasit==0)&&(i<=miu)
if x<=A(i)
gasit=1;
else i=i+1;
end
end
if(gasit==0)
disp('eroare: Nu s-a gasit');
end
end
StUnSamp.m
function [C] = StUnSamp( Fit,miu,lambda )
%Intoarce vectorul C de dimesiune lambda cu indicii
% pentru cromozomii selectati conform Stochastic
Universal Sampling
% miu: nr de cromozomi
% lambda: dimensiunea selectiei
% Fit: vector de dimensiune miu cu vaolrile fitness (sau
% echivalente) ale cromozomilor
%Generez A cu sumele partiale din Fit
A=zeros(miu,1);
B=zeros(lambda,1);
C=zeros(lambda,1);
Aim1=0; %Aim1 = A(i-1)
for i=1:miu
A(i)=Aim1+Fit(i);
Aim1=A(i);
end
a=360/A(miu);
A=a*A;
b=360/lambda;
b0=random('unif',0,b);
%Generare vector B[lambda]
for j=1:lambda
B(j)=b0+(j-1)*b;
end
%disp('B=');disp(B);
for j=1:lambda
C(j)=Sector(B(j),A,miu);
end
end
function J=EvalFitness(x)
J = 18+2*(x(1)-1.7)^4 + 3*(x(2)-5.)^2 + 2.5*(x(3)-2.)^4 ;
End
PRG_Principal.m
clear
clc
global n N;
global pop;
global ngene NGen;
global g;
global xmin xmax;
n=3;
ngene=n; % ngene=nr. gene maxim dintr-un cromozom
N=20; % N=nr de cromozomi din populatie
nr_fii=20;
NGen=3500; % NGen=nr de generatii
fc=zeros(N,1);
xmin=-10;
xmax=10;
pop=zeros(N,ngene);
s=1.8;
parinti=zeros(nr_fii,1);
str=sprintf('Selectie cu Stochastic Universal
Sampling,utilizare Rank si Scalare Rank');
disp(str);
str=sprintf('Replacement: in ultimele lambda pozitii din
cele N ale populatiei');
disp(str);
str=sprintf('Incrucisare: BLX-0.6');disp(str);
str=sprintf('cu cel mai bun si producerea unui singur
urmas');disp(str);
str=sprintf('Mutatie: neuniforma pe o gena cu
b=0.5');disp(str);
str=sprintf('N=%d ngene=%d NGen=%d xmin=%g xmax=
%g',N,ngene,NGen,xmin,xmax);
disp(str);
for i=1:N
for j=1:ngene
%pop(i,j)=1.;
pop(i,j)=random('unif',xmin,xmax);
end
end
for i=1:N
fc(i)=EvalFitness(pop(i,:));
end
[fc,IX]=sort(fc,1,'ascend');
pop=pop(IX,:);
R=N:-1:1; % Rangurile populatiei. Solutiile sunt
ordonate;
% miu=N
P=ScaleRank(R,N,s);%P contine rangurile scalate
lambda=nr_fii;
gasit=0;
g=1;
%CICLU MARE de T ITERAII
%
while(g<=NGen)&&(gasit==0) %&&(gasit==0)
% SELECTIE PARINTI
parinti=StUnSamp(P,N,lambda);%indicii parintilor
per=randperm(lambda);
parinti=parinti(per);%permutare aleatorie a indicilor
%INCRUCISARE
for ii=1:lambda
jj=randi(lambda);
i1=parinti(ii);
i2=parinti(jj);%=1
incrucisare1(i1,i2,ii,n,xmin,xmax); %un singur
copil
end
%MUTATIE
for irand=N-lambda+1:N
daca_mut=randi(100);
if(daca_mut<=90)
%disp(irand);
mutatie1(irand); %Fac mutatie pe pop(irand,:)
end
%LIMITARE
end
%Evaluare si reordonare
for i=N-lambda+1:N
fc(i)=EvalFitness(pop(i,:));
end
[fc,IX]=sort(fc,1,'ascend');
pop=pop(IX,:);
%Afisare intermediara
if(mod(g,100)==0)
str=sprintf('gen=%g J*=%g - %g %g %g %g',g,
fc(1),fc(2),fc(3),fc(4), fc(5));
disp(str);
end
g=g+1;
% if(g==NGen)
% c=input('Continuam ? n/d=','s');
% if c=='d'
% NGen=NGen+20;
% end
% end
end %while
%Tiparire rezultate