📄 fun_computefitness.asv
字号:
function fun=Fun_ComputeFitness(pop,flag,D,popsize)
% flag 选择标志,flag不同时,目标函数不同
% D 搜索空间维数(未知数个数)
% popsize 种群规模
% 返回值为计算完适应值后的pop数组
% flag=1-->Spherical函数,表达式为f(x1,x2)=x1^2+x2^2
% flag=2-->Rosenbrock函数,表达式为f(x1,x2)=100*(x1^2-x2)^2+(1-x1)^2
% flag=3-->Shaffer'sf6函数,表达式为f(x1,x2)=(sin(sqrt(x1^2+x2^2))^2-0.5)/((0.001*(x1^2+x2^2)+1)^2)-0.5
% flag=4-->Rastrigrin函数,表达式为f(x1,x2)=x1^2-10*cos(2*pi*x1)+10+x2^2-10*cos(2*pi*x2)+10
% flag=5-->Griewank函数,表达式为f(x1,x2)=(1/4000)*(x1^2+x2^2)-cos(x1/sqrt(1))*cos(x2/sqrt(2))+1
% flag=6-->Ackley函数,表达式为f(x1,x2)=-20*exp(-0.2*sqrt((x1^2+x2^2)/2))-exp((cos(2*pi*x1)+cos(2*pi*x2))/2)+20+exp(1)
% flag=7-->Axis Parallel hyper-ellipsoid函数,表达式为f(x1,x2)=x1^2+2*x2^2
% flag=8-->Schwefel函数,表达式为f(x1,x2)=x1*sin(sqrt(abs(x1)))+x2*sin(sqrt(abs(x2)))+418.9829*2
%计算个体适应值并赋值给pop(:,4*D+2)
for i=1:popsize
switch flag
%----------------------Spherical函数-----------------------%
case 1
sum=0;
for j=1:D
sum=sum+pop(i,j)^2;
end
pop(i,4*D+2)=sum;
%----------------------------------------------------------%
%----------------------Rosenbrock函数-----------------------%
case 2
sum=0;
for j=1:D-1
sum=sum+100*(pop(i,j)^2-pop(i,j+1))^2+(1-pop(i,j))^2;
end
pop(i,4*D+2)=sum;
%-----------------------------------------------------------%
%----------------------Shaffer'sf6函数----------------------%
case 3 %这个函数比较特殊,维数固定为2维
temp1=sin(sqrt(pop(i,1)^2+pop(i,2)^2))^2-0.5;
temp2=(0.001*(pop(i,1)^2+pop(i,2)^2)+1)^2;
pop(i,4*D+2)=temp1/temp2-0.5;
%-----------------------------------------------------------%
%---------------------Rastrigrin函数-------------------------%
case 4
sum=0;
for j=1:D
sum=sum+pop(i,j)^2-10*cos(2*pi*pop(i,j))+10;
end
pop(i,4*D+2)=sum;
%-----------------------------------------------------------%
%-----------------------Griewank函数------------------------%
case 5
sum=0;
product=1;
for j=1:D
sum=sum+(1/4000)*pop(i,j)^2;
product=product*cos(pop(i,j)/sqrt(j));
end
pop(i,4*D+2)=sum-product+1;
%-----------------------------------------------------------%
%------------------------Ackley函数--------------------------%
case 6
sum1=0;
sum2=0;
for j=1:D
sum1=sum1+pop(i,j)^2;
sum2=sum2+cos(2*pi*pop(i,j));
end
pop(i,4*D+2)=-20*exp(-0.2*sqrt(sum1/D))-exp(sum2/D)+20+exp(1);
%-----------------------------------------------------------%
%-------------Axis Parallel hyper-ellipsoid函数--------------%
case 7
sum=0;
for j=1:D
sum=sum+j*pop(i,j)^2;
end
pop(i,4*D+2)=sum;
%-----------------------------------------------------------%
%-----------------------Schwefel函数-------------------------%
case 8
sum=0;
for j=1:D
sum=sum+pop(i,j)*sin(sqrt(abs(pop(i,j))));
end
pop(i,4*D+2)=sum+418.9829*D;
%-----------------------------------------------------------%
%-----------------------Schwefel函数-------------------------%
otherwise
sum=0;
for j=1:D
sum=sum+pop(i,j)*sin(sqrt(abs(pop(i,j))));
end
pop(i,4*D+2)=sum+418.9829*D;
%-----------------------------------------------------------%
end
%-------个体最优信息的更新,更新个体最优粒子适应值以及对应的个体最优粒子位置-------%
if pop(i,4*D+1)>pop(i,4*D+2) %若当前适应值优于个体最优值,则进行个体最优信息的更新
pop(i,4*D+1)=pop(i,4*D+2); %个体最优粒子适应值更新(pop(:,4*D+1)为个体最优解适应值)
pop(i,2*D+1:3*D)=pop(i,1:D); %个体最优粒子位置更新
end
%-----------------------------------------------------------------------------%
%计算完适应值后寻找当前每个粒子的局部最优值
%LocalPSO采用Ring型拓扑结构,粒子的邻居数为2,即
%任一个粒子i与i-1和i+1之间的粒子形成邻居,粒子i的社会经验lbest来自于它的邻居中
%特殊的,第1个粒子与popsize和第2个粒子形成邻居,第popsize个粒子与popsize-1和第1个粒子形成邻居
%-----------------------------------------------------------------------------%
if i == 1 %第1个粒子与popsize和第2个粒子形成邻居
temp=[pop(popsize,4*D+1) pop(1,4*D+1) pop(2,4*D+1)];
[pop(1,4*D+3),idex]=min
temp1=min(pop(popsize,4*D+1),pop(1,4*D+1));
temp2=min(temp1,pop(2,4*D+1));
pop(1,4*D+3)=temp2; %pop(1,4*D+3)为局部最优解的适应值
%寻找局部最优解
if pop(popsize,4*D+1) == pop(1,4*D+3)
pop(1,3*D+1:4*D)=pop(popsize,2*D+1:3*D);
end
if pop(1,4*D+1) == pop(1,4*D+3)
pop(1,3*D+1:4*D)=pop(1,2*D+1:3*D);
end
if pop(2,4*D+1) == pop(1,4*D+3)
pop(1,3*D+1:4*D)=pop(2,2*D+1:3*D);
end
elseif i == popsize %第popsize个粒子与popsize-1和第1个粒子形成邻居
temp1=min(pop(popsize-1,4*D+1),pop(popsize,4*D+1));
temp2=min(temp1,pop(1,4*D+1));
pop(popsize,4*D+3)=temp2; %pop(popsize,4*D+3)为局部最优解的适应值
%寻找局部最优解
if pop(popsize-1,4*D+1) == pop(popsize,4*D+3)
pop(popsize,3*D+1:4*D)=pop(popsize-1,2*D+1:3*D);
end
if pop(popsize,4*D+1) == pop(popsize,4*D+3)
pop(popsize,3*D+1:4*D)=pop(popsize,2*D+1:3*D);
end
if pop(1,4*D+1) == pop(popsize,4*D+3)
pop(popsize,3*D+1:4*D)=pop(1,2*D+1:3*D);
end
else
% temp1=min(pop(i-1,4*D+1),pop(i,4*D+1));%任一个粒子i与i-1和i+1之间的粒子形成邻居
% temp2=min(temp1,pop(i+1,4*D+1));
% pop(i,4*D+3)=temp2; %pop(i,4*D+3)为局部最优解的适应值
%任一个粒子i与i-1和i+1之间的粒子形成邻居
%pop(i,4*D+3)为局部最优解的适应值
%idex为局部最优解的下标值
[pop(i,4*D+3),idex]=min(pop(i-1:i+1,4*D+1));
%寻找局部最优解位置坐标
if idex == 1
pop(i,3*D+1:4*D)=pop(i-1,2*D+1:3*D);
end
if idex == 2
pop(i,3*D+1:4*D)=pop(i,2*D+1:3*D);
end
if idex == 3
pop(i,3*D+1:4*D)=pop(i+1,2*D+1:3*D);
end
%寻找局部最优解
% if pop(i-1,4*D+1) == pop(i,4*D+3)
% pop(i,3*D+1:4*D)=pop(i-1,2*D+1:3*D);
% end
% if pop(i,4*D+1) == pop(i,4*D+3)
% pop(i,3*D+1:4*D)=pop(i,2*D+1:3*D);
% end
% if pop(i+1,4*D+1) == pop(i,4*D+3)
% pop(i,3*D+1:4*D)=pop(i+1,2*D+1:3*D);
% end
end
end
fun=pop; %返回值为计算完适应值后的pop数组
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -