function [a,b,mmin,mmax]=RAGA(N,n,Xa,Pc,Pm,M,DaiNo,Ci,ads)
tic;
% N为种群规模,Pc为交叉概率,Pm为变异概率,DaiNo为了在进行两代进化之后加速一次而设定的限制数
% n优化变量数目,M变异方向所需要的随机数,Ci为加速次数,xmin为优化变量的下限向量,xmax为优化变量的上限向量
% 变量的数目n必须等于xmin和xmax的维数;ads为0是求最小值,为其它求最大值。
% mmin和mmax为优秀个体变化区间的上下限值
if ads==0
ad='ascend';
else
ad='descend';
end
% ======================step1 生成初始父代==================================
mm1=zeros(1,n);mm2=ones(1,n);
znum=0;
for z=1:Ci %表示加速次数为20次
for i=1:N
for p=1:n %p为优化变量的数目,
bb(p)=unifrnd(mm1(p),mm2(p));
end
temp=sum(bb.^2);
v(i,:)=sqrt(bb.^2/temp);
end
% step1 end
for s=1:DaiNo
% step2 计算适应度
for i=1:N
fv(i)=Target(Xa,v(i,:));
end
%按适应度排序
[fv,i]=sort(fv,ad);
v=v(i,:);
%step2 end
%step3 计算基于序的评价函数
arfa=0.05;
q(1)=0;
for i=2:N+1
q(i)=q(i-1)+arfa*(1-arfa)^(i-2);
end
%step3 end
%step4 选择操作
for i=1:N
r=unifrnd(0,q(N+1));
for j=2:N+1
if r>q(j-1) & r<=q(j)
vtemp1(i,:)=v(j-1,:);
end
end
end
%step4 end
%step5 交叉操作
while 1==1
CrossNo=0;
v1=vtemp1;
for i=1:N
r1=unifrnd(0,1);
if r1 < Pc
CrossNo=CrossNo+1;
vtemp2(CrossNo,:)=v1(i,:);
v1(i,:)=zeros(1,n);
end
end
if CrossNo~=0 & mod(CrossNo,2)==0
break;
elseif CrossNo==0|mod(CrossNo,2)==1
vtemp2=[];
end
end
shengyuNo=0;
for i=1:N
if v1(i,:)~=zeros(1,n)
shengyuNo=shengyuNo+1;
vtemp3(shengyuNo,:)=v1(i,:);%vtemp3表示选择后剩余的父代
end
end
%随机选择配对进行交叉操作
for i=1:CrossNo
r2=ceil(unifrnd(0,1)*(CrossNo-i+1));
vtemp4(i,:)=vtemp2(r2,:);
vtemp2(r2,:)=[];
end
%=====================随机配对结束,按顺序2数为一对==========================
for i=1:2:(CrossNo-1)
r3=unifrnd(0,1);
v2(i,:)=r3*vtemp4(i,:)+(1-r3)*vtemp4(i+1,:);
v2(i+1,:)=(1-r3)*vtemp4(i,:)+r3*vtemp4(i+1,:);
temp1=sum(v2(i,:).^2);
v2(i,:)=sqrt(v2(i,:).^2/temp1);
end
%step5 end
v3=[vtemp3;v2]; %合并交叉部分和剩余部分
%step6 变异操作
while 1==1
MutationNo=0;
v4=v3;
for i=1:N
r4=unifrnd(0,1);
if r4<Pm
MutationNo=MutationNo+1;
vtemp5(MutationNo,:)=v4(i,:);
v4(i,:)=zeros(1,n);
end
end
if MutationNo~=0
break;
end
end
%选择进行变异操作的父代结束
shengyuNo1=0;
for i=1:N
if v4(i,:)~=zeros(1,n)
shengyuNo1=shengyuNo1+1;
vtemp6(shengyuNo1,:)=v4(i,:);%vtemp6表示选择后剩余的父代
end
end
%变异开始
DirectionV=unifrnd(-1,1,1,n);
for i=1:MutationNo
v5(i,:)=vtemp5(i,:)+M*DirectionV;
temp3=sum(v5(i,:).^2);
v5(i,:)=sqrt(v5(i,:).^2/temp3);
M=unifrnd(0,M);
end
%step6 end
vk=[v5;vtemp6];
v=vk;
end
%进行两代进化后再进行适应度评价
for i=1:N;
fv(i)=Target(Xa,v(i,:));
end
%根据适应度排序
[fv,i]=sort(fv,ad);
v=v(i,:);
vk=v;
vv=vk(1:20,:); %选取前20个为优秀个体
t=1:n;
mm1(t)=min(vv(:,t));
mm2(t)=max(vv(:,t));
mmin(z,:)=mm1;
mmax(z,:)=mm2;
fv1(z)=fv(1);
znum=znum+1;
if abs(mm1-mm2)<=0.00001
break;
end
end
a=fv(1); %最大函数值
b=vv(1,:); %最大函数值对应的变量值
index=1:znum;
plot(index,fv1,'b-');
hold on;
title('最优函数值变化趋势');
xlabel('迭代次数');
ylabel('目标函数值');
grid on;
toc