鲸鱼算法matlab代码详解(二)

WOA核心代码

[Leader_score,Leader_pos,Convergence_curve]=WOA(SearchAgents_no,Max_iter,lb,ub,dim,fobj)
Leader_pos=zeros(1,dim);%定义种群初始位置
Leader_score=inf; %定义最优初始值,可根据求极大值和极小值进行更换,此处为求极小值,若求极大值则换成-inf


Positions=initialization(SearchAgents_no,dim,ub,lb);%生成初始种群

Convergence_curve=zeros(1,Max_iter);%记录迭代的状况

t=0;%迭代次数初始为0


while t<Max_iter
    for i=1:size(Positions,1)%给种群个体进行编号
        
        Flag4ub=Positions(i,:)>ub;%若某个种群个体超出上边界
        Flag4lb=Positions(i,:)<lb;%若某个种群个体超出下边界
        Positions(i,:)=(Positions(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;%将种群个体限制在约束边界之内
        
    
        fitness=fobj(Positions(i,:));%计算每个种群个体的适应度值
        
       以下为判定条件
        if fitness<Leader_score % 若适应度值小于最优值
            Leader_score=fitness; % 将适应度值定义为最优值
            Leader_pos=Positions(i,:);%将此适应度值对应的种群个体定为最优种群个体
        end
        
    end
    
    a=2-t*((2)/Max_iter); % 迭代步长因子
    
    
    a2=-1+t*((-1)/Max_iter);%后续更新种群需要的参数
    
   
    for i=1:size(Positions,1)
        r1=rand(); % r1 is a random number in [0,1]
        r2=rand(); % r2 is a random number in [0,1]
        
        A=2*a*r1-a;  % 种群变更公式
        C=2*r2;      % 种群变更公式
        
        
        b=1;               %后续更新种群需要的参数
        l=(a2-1)*rand+1;   %后续更新种群需要的参数
        
        p = rand();        % %后续更新种群需要的参数


        以下都为鲸鱼算法公式放进去的
        for j=1:size(Positions,2)
            
            if p<0.5   
                if abs(A)>=1
                    rand_leader_index = floor(SearchAgents_no*rand()+1);
                    X_rand = Positions(rand_leader_index, :);
                    D_X_rand=abs(C*X_rand(j)-Positions(i,j)); 
                    Positions(i,j)=X_rand(j)-A*D_X_rand;      
                    此判定为鲸鱼进行随机行走机制更新位置
                elseif abs(A)<1
                    D_Leader=abs(C*Leader_pos(j)-Positions(i,j)); 
                    Positions(i,j)=Leader_pos(j)-A*D_Leader;      
                end
                此判定为鲸鱼进行收缩包围机制更新位置
            elseif p>=0.5
              
                distance2Leader=abs(Leader_pos(j)-Positions(i,j));
           
                Positions(i,j)=distance2Leader*exp(b.*l).*cos(l.*2*pi)+Leader_pos(j);
                此判定为鲸鱼进行螺旋上升机制更新位置
            end
            
        end
    end
    t=t+1;
    Convergence_curve(t)=Leader_score;%记录当前迭代次数下的最优值
    [t Leader_score]
end

猜你喜欢

转载自blog.csdn.net/Ferry88/article/details/126342342