【蝗虫算法】基于混合柯西变异和均匀分布改进蝗虫优化算法求解单目标优化问题matlab代码

274 阅读2分钟

1 简介

传统蝗虫优化算法在处理优化问题时依然存在收敛速度慢,易陷入局部最优的不足.为此,提出了融合混沌映射和柯西变异机制的非线性蝗虫优化算法CCGOA.通过融合混沌Tent映射与反向学习机制,对种群初始化,在确保初始种群质量较优前提下,使种群尽可能均匀分布于搜索空间;利用余弦函数设计非线性自适应系数更新机制,更好均衡个体全局搜索与局部开发能力;引入柯西变异对当前最优个体进行变异扰动,避免算法陷入局部最优.通过基准函数寻优测试,证实提出的算法可以有效提升寻优精度和收敛速度.设计了特征选择算法CCGOA-FS并应用于特征选择问题求解.通过若干数据集测试,证实该算法可以有效进行最优特征子集选取,提升数据分类准确率.

2 部分代码

%_________________________________________________________________________%
% Grasshopper Optimization Algorithm (GOA) source codes demo V1.0       %
%                                                                         %
%_________________________________________________________________________%

% The Grasshopper Optimization Algorithm
function [TargetFitness,TargetPosition,Convergence_curve,Trajectories,fitness_history, position_history]=GOA(N, Max_iter, lb,ub, dim, fobj)

tic
disp('GOA is now estimating the global optimum for your problem....')

flag=0;
if size(ub,1)==1
   ub=ones(dim,1)*ub;
   lb=ones(dim,1)*lb;
end

if (rem(dim,2)~=0) % this algorithm should be run with a even number of variables. This line is to handle odd number of variables
   dim = dim+1;
   ub = [ub; 100];
   lb = [lb; -100];
   flag=1;
end

%Initialize the population of grasshoppers
GrassHopperPositions=initialization(N,dim,ub,lb);
GrassHopperFitness = zeros(1,N);

fitness_history=zeros(N,Max_iter);
position_history=zeros(N,Max_iter,dim);
Convergence_curve=zeros(1,Max_iter);
Trajectories=zeros(N,Max_iter);

cMax=1;
cMin=0.00004;
%Calculate the fitness of initial grasshoppers

for i=1:size(GrassHopperPositions,1)
   if flag == 1
       GrassHopperFitness(1,i)=fobj(GrassHopperPositions(i,1:end-1));
   else
       GrassHopperFitness(1,i)=fobj(GrassHopperPositions(i,:));
   end
   fitness_history(i,1)=GrassHopperFitness(1,i);
   position_history(i,1,:)=GrassHopperPositions(i,:);
   Trajectories(:,1)=GrassHopperPositions(:,1);
end

[sorted_fitness,sorted_indexes]=sort(GrassHopperFitness);

% Find the best grasshopper (target) in the first population 
for newindex=1:N
   Sorted_grasshopper(newindex,:)=GrassHopperPositions(sorted_indexes(newindex),:);
end

TargetPosition=Sorted_grasshopper(1,:);
TargetFitness=sorted_fitness(1);

% Main loop
l=2; % Start from the second iteration since the first iteration was dedicated to calculating the fitness of antlions
while l<Max_iter+1
   
   c=cMax-l*((cMax-cMin)/Max_iter); % Eq. (2.8) in the paper
   
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     for i=1:size(GrassHopperPositions,1)
       temp= GrassHopperPositions';
      % for k=1:2:dim  
           S_i=zeros(dim,1);
           for j=1:N
               if i~=j
                   Dist=distance(temp(:,j), temp(:,i)); % Calculate the distance between two grasshoppers
                   
                   r_ij_vec=(temp(:,j)-temp(:,i))/(Dist+eps); % xj-xi/dij in Eq. (2.7)
                   xj_xi=2+rem(Dist,2); % |xjd - xid| in Eq. (2.7) 
                   
                   s_ij=((ub - lb)*c/2)*S_func(xj_xi).*r_ij_vec; % The first part inside the big bracket in Eq. (2.7)
                   S_i=S_i+s_ij;
               end
           end
           S_i_total = S_i;
           
     % end
       
       X_new = c * S_i_total'+ (TargetPosition); % Eq. (2.7) in the paper      
       GrassHopperPositions_temp(i,:)=X_new'; 
     end
     
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   % GrassHopperPositions
   GrassHopperPositions=GrassHopperPositions_temp;
   
   for i=1:size(GrassHopperPositions,1)
       % Relocate grasshoppers that go outside the search space 
       Tp=GrassHopperPositions(i,:)>ub';Tm=GrassHopperPositions(i,:)<lb';GrassHopperPositions(i,:)=(GrassHopperPositions(i,:).*(~(Tp+Tm)))+ub'.*Tp+lb'.*Tm;
       
       % Calculating the objective values for all grasshoppers
       if flag == 1
           GrassHopperFitness(1,i)=fobj(GrassHopperPositions(i,1:end-1));
       else
           GrassHopperFitness(1,i)=fobj(GrassHopperPositions(i,:));
       end
       fitness_history(i,l)=GrassHopperFitness(1,i);
       position_history(i,l,:)=GrassHopperPositions(i,:);
       
       Trajectories(:,l)=GrassHopperPositions(:,1);
       
       % Update the target
       if GrassHopperFitness(1,i)<TargetFitness
           TargetPosition=GrassHopperPositions(i,:);
           TargetFitness=GrassHopperFitness(1,i);
       end
   end
       
   Convergence_curve(l)=TargetFitness;
   disp(['In iteration #', num2str(l), ' , target''s objective = ', num2str(TargetFitness)])
   
   l = l + 1;
end


if (flag==1)
   TargetPosition = TargetPosition(1:dim-1);
end

time=toc

3 仿真结果

4 参考文献

[1]兰娅勋. 混沌和柯西变异的蝗虫优化算法及特征选择[J]. 微电子学与计算机, 2021, 38(11):10.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。