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