⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fun_computefitness.asv

📁 采用标准群粒子优化计算方法
💻 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 + -