📄 gae.m
字号:
%Genetic Algorithm with the Elitist Selection & Crossover--GAESC,optimizing Needle-in-a Haystack function
function GAESC()
clear all;
clc;
NC=2000; %Max iteration generation
POPSIZE=100; %population size
SUBLEN=30; %subchromosome length
NUM_VAR=2; %variable number,thus chromosome legth=SUBLEN*NUM_VAR
Pc=0.6; %crossover probability
Pkc=0.2; %Elitist-crossover probability
Pm=0.05; %mutation probability
for v=1:1
P=round(rand(POPSIZE,SUBLEN*NUM_VAR)); %initialize population
Obj=CalObj(P,NUM_VAR); %calculate population object function value
Fit=CalFit(Obj); %calculate individual fitness in population
[Elite_fit,index]=max(Fit); %find out the max fitness of the first generation
ObjMax=Obj(index);
Elite=P(index,:); %reserve the best individual to Elite
t=1; %iteration generation
tic %testtimer start
while t<=NC %start iteration
P=Reproduce1(P,Fit,POPSIZE); %reproduction
P=Crossover(P,Pc); %crossover
%P=EliteCrossover(P,Elite,Pkc); %elitist crossover
P=Mutate(P,Elite_fit,Fit,Pm); %mutation
Obj=CalObj(P,NUM_VAR); %calculate population object function value
Fit=CalFit(Obj); %calculate individual fitness in population
P=EliteReserved(P,Elite,Elite_fit,Fit); %make elite reserved
[Elite,Elite_fit,ObjMax]=EliteUpdate(P,Elite,Elite_fit,Fit,ObjMax,Obj); %get the best individual with max fitness
%Fit_avg(t)=sum(Fit)/POPSIZE;
J(t)=ObjMax;
%J_online(t)=sum(Fit_avg)/t;
%Javg(t)=sum(J)/t;
t=t+1; % t plus 1,start next interation
end % end interation
toc
M=find(J>=3689.9999,1)
format long,MaxObjValue=ObjMax
interation=1:NC;
%plot(interation,J,interation,Javg,'red',interation,J_online,'green'),grid
end
%************subfunction definition below***********
function decimal=DecodeChrom(chrom,num_subchrom) %decode chromosome
len=length(chrom);
subl=len/num_subchrom;
point=len;
for i=num_subchrom:-1:1
decimal(i)=0;
k=0;
while point>(i-1)*subl
decimal(i)=decimal(i)+chrom(point)*2^k;
k=k+1;
point=point-1;
end
end
function obj=CalObj(pop,num_var) %calculate populatin object function value
umin=-5.12;umax=5.12;
a=3.0;b=0.05;
[popsize,len]=size(pop);
subl=len/num_var;
for i=1:popsize
temp=DecodeChrom(pop(i,:),num_var);
x=umin+(umax-umin)*temp(1)/(2^subl-1.0);
y=umin+(umax-umin)*temp(2)/(2^subl-1.0);
if (x>=-5.12) && (x<0)
obj(i)=(a/(b+x^2+y^2))^2+(x^2+y^2)^2;
else if (x>=0) && (x<=5.12)
obj(i)=90+(a/(b+x^2+y^2))^2+(x^2+y^2)^2;
end
end
end
function fit=CalFit(obj) %calculate fitness
fit=obj;
function newpop=Reproduce(pop,fit,popsize) %reproduction operation,proportional selcetion
sum_fit=sum(fit);
ps=fit/sum_fit;
for i=1:popsize-1
ps(i+1)=ps(i+1)+ps(i);
end
for i=1:popsize
index=1;
p=rand();
while p>ps(index)
index=index+1;
end
newpop(i,:)=pop(index,:);
end
function newpop=Reproduce1(pop,fit,popsize) %reproduction operation,remainder stochastic sampling with replacement
sigmafit=sum(fit);
ps=fit/sigmafit;
Ni=fix(popsize*ps);
sigmaNi=sum(Ni);
num=1;
for i=1:popsize
pointer=1;
while pointer<=Ni(i)
newpop(num,:)=pop(i,:);
num=num+1;
pointer=pointer+1;
end
end
newfit=fit-sigmaNi*sigmafit/popsize;
sigmafit=sum(newfit);
ps=newfit/sigmafit;
for i=1:popsize-1
ps(i+1)=ps(i+1)+ps(i);
end
for i=num:popsize
index=1;
p=rand();
while p>ps(index)
index=index+1;
end
newpop(i,:)=pop(index,:);
end
function newpop=Crossover(pop,pc) %crossover operation,2 points crossover
[popsize,len]=size(pop);
index=1:popsize;
for i=1:popsize
point=ceil(rand()*(popsize-i));
temp=index(i);
index(i)=index(point+i);
index(point+i)=temp;
end
for i=1:2:popsize-1
p=rand();
if p<pc
p1=ceil(rand()*len); %crossover point 1
p2=ceil(rand()*len); %crossover point 2
direct=(p1<=p2)*1+(p1>p2)*(-1);
for j=p1:direct:p2
temp=pop(index(i),j);
pop(index(i),j)=pop(index(i+1),j);
pop(index(i+1),j)=temp;
end
end
end
newpop=pop;
function newpop=EliteCrossover(pop,elite,pkc) %elite-crossover
[popsize,len]=size(pop);
for i=1:popsize
p=rand();
if p<pkc
p1=ceil(rand()*len); %crossover point 1
p2=ceil(rand()*len); %crossover point 2
direct=(p1<=p2)*1+(p1>p2)*(-1);
for j=p1:direct:p2
pop(i,j)=elite(j);
end
end
end
newpop=pop;
function newpop=Mutate(pop,elite_fit,fit,pm) %mutation operation,bit mutate
[popsize,len]=size(pop);
for i=1:popsize
if fit(i)<=0.95*elite_fit
pmm=pm;
else
pmm=0.1*pm;
%pmm=pm;
end
for j=1:len
p=rand();
if p<pmm
if pop(i,j)==0
pop(i,j)=1;
else
pop(i,j)=0;
end
end
end
end
newpop=pop;
function newpop=EliteReserved(pop,elite,elite_fit,fit) %elitist reserved
newpop=pop;
if find(fit==elite_fit)
;
else
[fit_min,index_min]=min(fit);
newpop(index_min,:)=elite;
end
function [elite,elite_fit,obj_max]=EliteUpdate(pop,elite,elite_fit,fit,obj_max,obj); %update elite with max fitness
[fit_max,index_max]=max(fit);
if elite_fit>=fit_max
elite=elite;
elite_fit=elite_fit;
obj_max=obj_max;
else
elite_fit=fit_max;
elite=pop(index_max,:);
obj_max=obj(index_max);
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -