www.gusucode.com > 很好用的投影寻踪程序 matlab开发源码 > Monkey_PPE/RAGA.m
function [a,b,mmin,mmax]=RAGA(xx,N,n,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); for z=1:Ci %表示加速次数为20次 z for i=1:N while 1==1 for p=1:n %p为优化变量的数目, bb(p)=unifrnd(mm1(p),mm2(p)); end temp=sum(bb.^2); a=sqrt(bb.^2/temp); y=Feasibility(a); if y==1 v(i,:)=a; break; end end end % step1 end for s=1:DaiNo % step2 计算适应度 for i=1:N fv(i)=Target(xx,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) while 1==1 r3=unifrnd(0,1); v20(i,:)=r3*vtemp4(i,:)+(1-r3)*vtemp4(i+1,:); v20(i+1,:)=(1-r3)*vtemp4(i,:)+r3*vtemp4(i+1,:); temp1=sum(v20(i,:).^2); temp2=sum(v20(i+1,:).^2); v2(i,:)=sqrt(v20(i,:).^2/temp1); v2(i+1,:)=sqrt(v20(i+1,:).^2/temp2); if Feasibility(v2(i,:))==1 & Feasibility(v2(i+1,:))==1 break; end end 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 tempNo=0; while 1==1 tempNo=tempNo+1; v5(i,:)=sqrt(((vtemp5(i,:)+M*DirectionV).^2)./sum((vtemp5(i,:)+M*DirectionV).^2)); y=Feasibility(v5(i,:)); if tempNo==200 v5(i,:)=vtemp5(i,:); break; elseif y==1 break; end M=unifrnd(0,M); end end %step6 end vk=[v5;vtemp6]; v=vk; end %进行两代进化后再进行适应度评价 for i=1:N; fv(i)=Target(xx,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; if abs(mm1-mm2)<=0.00001 break; end end a=fv(1); %最大函数值 b=vv(1,:); %最大函数值对应的变量值 toc