fai=max(g1,0)+max(g2,0);
%------CTP2,CTP3,CTP4,CTP5,CTP6,CTP7
case {'CTP2','CTP3','CTP4','CTP5','CTP6','CTP7'} navars=[-0.2*pi,0.2,10,1,6,1; -0.2*pi,0.1,10,1,0.5,1;
-0.05*pi,40,5,1,6,0; -0.2*pi,0.1,10,2,0.5,1; -0.1*pi,40,0.5,1,2,-2; -0.2*pi,0.75,10,1,0.5,1;];
i=str2double(funcname(4))-1;%%选择的是第几个测试函数 sita=navars(i,1);a=navars(i,2);b=navars(i,3); c=navars(i,4);d=navars(i,5);e=navars(i,6); n=length(x);
cx=41+sum(x(2:n).^2-10*cos(2*pi*x(2:n))); f1=x(1); f2=cx*(1-f1/cx);
g=a*abs(sin(b*pi*(sin(sita)*(f2-e)+cos(sita)*f1)^c))^d-(cos(sita)*(f2-e)-sin(sita)*f1); fai=max(g,0); %------CTP8,CONSTR
case {'CTP8','CONSTR'} g1=6-x(2)-9*x(1); g2=1+x(2)-9*x(1);
fai=max(g1,0)+max(g2,0); %------CTP9,SRN
case {'CTP9','SRN'}
g1=x(1)^2+x(2)^2-255; g2=x(1)-3*x(2)+10;
fai=max(g1,0)+max(g2,0); %------CTP10,TNK,MOP-C4
case {'CTP10','TNK','MOP-C4'}
g1=-x(1)^2-x(2)^2+1+0.1*cos(16*atan(x(1)/x(2))); g2=(x(1)-0.5)^2+(x(2)-0.5)^2-0.5; fai=max(g1,0)+max(g2,0); %-------MOP-C1,BNH函数 case {'MOP-C1','BNH'}
g1=(x(1)-5)^2+x(2)^2-25; g2=7.7-(x(1)-8)^2-(x(2)+3); fai=max(g1,0)+max(g2,0); %------MOP-C2,OSY函数 case {'MOP-C2','OSY'}
g1=2-x(1)-x(2); g2=-6+x(1)+x(2); g3=-2-x(1)+x(2); g4=-2+x(1)-3*x(2); g5=-4-(x(3)-3)^2+x(4); g6=4-(x(5)-3)^2-x(6);
fai = max(g1,0)+max(g2,0)+max(g3,0)+max(g4,0)+max(g5,0)+max(g6,0); %------MOP-C3
case 'MOP-C3'
g1=x(2)+4*x(1)-4; g2=x(1)-x(2)-2;
fai = max(g1,0)+max(g2,0); end end
function fvout=GetLeastFunctionValue(fvin) %将外部种群中的非支配集剔除 fvout=fvin; n=size(fvout,1); i=1;
while(i<=n) j=i+1;
isdominated=false; while(j<=n)
a=fvout(i,:);b=fvout(j,:);
if((a(1)
if((b(1)
if isdominated
fvout(i,:)=[];n=n-1; else
i=i+1; end end end
function [SP,SP1,MS,GD,GD2]=GetEvaluDis(funcname,NP,stdfv) %计算所有评价指标的值 if(iscell(NP))
n=length(NP); SP=Inf*ones(1,n); SP1=Inf*ones(1,n); MS=Inf*ones(1,n); GD=Inf*ones(1,n); GD2=Inf*ones(1,n);
for i=1:n
np=cell2mat(NP(i));
[sp,sp1]=Spacing(funcname,np); ms=MaximumSpread(funcname,np);
gd=GenerationalDistance(funcname,np,stdfv); gd2=GenerationalDistance2(funcname,np); SP(i)=sp; SP1(i)=sp1; MS(i)=ms; GD(i)=gd; GD2(i)=gd2; end else
[SP,SP1]=Spacing(funcname,NP); MS=MaximumSpread(funcname,NP);
GD=GenerationalDistance(funcname,NP,stdfv); GD2=GenerationalDistance2(funcname,NP); end end
function [SP,SP1]=Spacing(funcname,np) %分散性(Spacing,SP) n=size(np,1);
m=size(fitness(np(1,:),funcname),2); f=zeros(n,m); for i=1:n
f(i,:)=fitness(np(i,:),funcname); end
n=size(f,1);%n:解的个数; dd=ones(1,n)*Inf;d=zeros(1,n); for i=1:n k=0; for j=1:n if j==i
continue; end k=k+1;
dd(i,k)=sum(abs(f(i,:)-f(j,:))); end
d(i)=min(dd(i,:)); end
daver=mean(d);
SP=sqrt(sum((d-daver).^2)/n);
SP1=sqrt(sum((d-daver).^2)/(n-1))/daver;
end
function D=MaximumSpread(funcname,np) %最大散布范围(Maximum Spread,MS) n=size(np,1);
m=size(fitness(np(1,:),funcname),2); f=zeros(n,m); if(n==1) D=0; return; end
for i=1:n
f(i,:)=fitness(np(i,:),funcname); end
fmax=Inf*ones(1,m); fmin=-Inf*ones(1,m); switch upper(funcname) %------ZDT1,'ZDT2',ZDT4
case {'ZDT1','ZDT2','ZDT4'} fmax=[1,1;]; fmin=[0,0;]; %------ZDT3 case 'ZDT3'
fmax=[0.851701065645526,1]; fmin=[0,-0.761625883165305]; %------ZDT6 case 'ZDT6'
fmax=[1,0.921164494015440]; fmin=[0.280776612246391,0]; case 'CTP1'
fmax=[1,1];
fmin=[0,0.542143003351532]; case 'CTP2'
fmax=[0.985582138027326,1];
fmin=[0,0.287445806007632]; case 'CTP3'
fmax=[0.971176296100037,1];
fmin=[0,0.295146218332835]; case 'CTP4'
fmax=[1,1.044724051472542]; fmin=[0,0]; case 'CTP5' case 'CTP6' case 'CTP7'
case {'CTP8','CONSTR'} case {'CTP9','SRN'} case {'CTP10','TNK','MOP-C4'}
fmax=[1.040613239483717,1.038423685560876]; fmin=[0.043784286711173,0.045003454162621]; case {'MOP-C2','OSY'}
fmax=[-39.927885357643362,76.394162538483897];
fmin=[-273.9620707900613,4.0370929599649]; end
fimax=min([max(f);fmax]); fimin=max([min(f);fmin]); fimin=min([fimax;fimin]);
D=sqrt(sum((fimax-fimin)./(fmax-fmin))/m); end
function GD=GenerationalDistance(funcname,np,stdfv) %世代距离GD n=size(np,1);
m=size(fitness(np(1,:),funcname),2); f=zeros(n,m); if(n==1) GD=0; return; end
for i=1:n
f(i,:)=fitness(np(i,:),funcname); end
n=size(f,1);%n:解的个数; d=zeros(1,n); for i=1:n
d(i)=GetTrueDis(funcname,f(i,:),stdfv); end
GD=sqrt(sum(d.^2))/n; end
function d=GetTrueDis(funcname,fv,stdfv) %点到真实Pareto前沿的距离 x0=fv(1);y0=fv(2); dd=zeros(1,1001);
switch upper(funcname) %------ZDT1,ZDT4
case {'ZDT1','ZDT4'} x1=(1-y0)^2; for i=1:1001