鲸鱼优化算法(WOA)
1.前言:
一种元启发式优化算法,模拟座头鲸狩猎行为的元启发式优化算法。目前的工作与其他群优化算法相比的主要区别在于,采用随机或最佳搜索代理来模拟捕猎行为,并使用螺旋来模拟座头鲸的泡泡网攻击机制。该算法具有机制简单、参数少、寻优能力强等优点,在经济调度、最优控制、光伏系统、图像分割等方面得到广泛的应用。
2.算法基本原理:
座头鲸有特殊的捕猎方法,这种觅食行为被称为泡泡网觅食法;标准 WOA 模拟了座头鲸特有的搜索方法和围捕机制,主要包括:围捕猎物、气泡网捕食、搜索猎物三个重要阶段。WOA 中每个座头鲸的位置代表一个潜在解,通过在解空间中不断更新鲸鱼的位置,最终获得全局最优解。
(1)围捕猎物(Encircling prey)
鲸鱼的搜索范围是全局解空间,需要先确定猎物的位置以便包围。由于最优设计在搜索速度中的位置不是先验已知的,因此WOA算法假定当前的最佳候选解是目标猎物或接近最优解。在定义了最佳搜索代理之后,其他搜索代理将尝试向最佳搜索代理更新它们的位置。这一行为由以下方程
表示:
t表示当前迭代次数
A和C是系数向量
X*(t)是目前得到的最佳解的位置向量
X(t)向量是位置向量,||是绝对值,·是逐元素相乘
如果存在更好的解决方案,那么应该在每次迭代中更新X*(t)
其中向量A和C的计算方式如下
在整个迭代过程中 a 由2线性降到0; r1 和 r2 是 [0,1] 中的随机向量。
(2)气泡网捕食:
座头鲸捕食主要有两个机制:包围捕食和气泡网捕食。采用气泡网捕食时,座头鲸与猎物间的位置更新用对数螺旋方程表达,如式(2-1)。
(2-1)式中:
D' ——当前搜索个体与当前最优解的距离;
B ——螺旋形状参数;
l ——值域为[-1,1]均匀分布的随机数。
由于靠近猎物过程中有两种捕食行为,因此 WOA 根据概率 p 来选择气泡网捕食或者收缩包围,位置更新公式如(2-2)。
(2-2)式中:
p ——捕食机制概率,值域为[0,1]的随机数。
随着迭代次数 t 的增加,参数 A 和收敛因子 a 逐渐减小,若|A| < 1,则各鲸鱼逐渐包围当前最优解,在 WOA 中属于局部寻优阶段。
(3)搜索猎物:
为保证所有鲸鱼能在解空间中充分搜索,WOA 根据鲸鱼彼此之间的距离来更新位置,达到随机搜索的目的。因此,当|A| ≥ 1|时,搜索个体会游向随机鲸。式(3-1)
(3-1)式中:
D''——当前搜索个体与随机个体的距离。
Xrand(t)——当前随机个体的位置
3.算法基本流程
标准 WOA 主要依靠系数向量 A 选择搜索猎物的路径,并利用概率 p 决定最终捕食机制。标准 WOA 的计算流程如图 1-2,具体如下:
步骤 1:设置鲸鱼数量 N 和算法的最大迭代次数 tmax,初始化位置信息;
步骤 2:计算每条鲸鱼的适应度,找到当前最优鲸鱼的位置并保留,即 ;
步骤 3:计算参数 a、p 和系数向量 A、C。判断概率 p 是否小于 50%,是则直接转入步骤 4,否则采用气泡网捕食机制:利用式(2-1)进行位置更新;
步骤 4:判断系数向量 A 的绝对值是否小于 1,是则包围猎物:按式(1-2)更新位置;否则全局随机搜索猎物:按式(3-1)更新位置;
步骤 5:位置更新结束,计算每条鲸鱼的适应度,并与先前保留的最优鲸鱼的位置比较,若优于,则利用新的最优解替换;
步骤 6:判断当前计算是否达到最大迭代次数,如果是,则获得最优解,计算结束,否则进入下一次迭代,并返回步骤 3。
WOA算法首先随机初始化一组解,在每次迭代中,搜索代理根据随机选择的搜索代理或到目前为止获得的最优解更新它们的位置。将 a 参数由 2 随迭代次数降为 0,从而由探索逐步到利用。当 |A|>1 时选择随机搜索代理,|A|< 1时选择最优解更新搜索代理位置。根据 p 的值,WOA可以在螺旋运动和圆环运动之间进行切换。最后,通过满足终止准则来终止WOA算法。
3.代码
main函数:
%参数初始化,初始时主要设置代理数量和最大迭代次数即可,其他算法相关的参数因为和当前迭代次数相关,需要在迭代中设置。
clc;clear;
dim=2;%变量的维数
SearchAgents_no=30; % 搜索代理数量,种群中个体个数
Max_iteration=500; % 最大迭代次数
ub=15;%上限
lb=-15;%下限
%种群初始化。随机初始化所有代理各个维度上的位置值,需要保证在取值范围内。
Positions=rand(SearchAgents_no,dim).*(ub-lb)+lb;
Leader_score = fobj(Positions(1,:));
for t=1:Max_iteration
fit(t)=Leader_score;
%(评估种群中每个代理的目标值,如有某个代理由于当前最优解,则将其设为最优解。)
for i=1:size(Positions,1)
% 计算每个代理的目标值
fitness=fobj(Positions(i,:));
% 更新最优解
if fitness < Leader_score % 如果是最大化问题,这里就是">"
Leader_score=fitness;
Leader_pos=Positions(i,:);
end
end
%(设置和迭代次数相关的算法参数。)
a=2-t*((2)/Max_iteration); % 等式(3)中a随迭代次数从2线性下降至0
%a2从-1线性下降至-2,计算l时会用到
a2=-1+t*((-1)/Max_iteration);
% Update the Position of search agents(对每个代理的每一维度进行位置更新)
for i=1:size(Positions,1)
r1=rand(); % r1为[0,1]之间的随机数
r2=rand(); % r2为[0,1]之间的随机数
A=2*a*r1-a; % 等式(3)
C=2*r2; % 等式(4)
b=1; % 等式(5)中的常数b
l=(a2-1)*rand+1; % 等式(5)中的随机数l
p = rand(); % 等式(6)中的概率p
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)); % 等式(7)
Positions(i,j)=X_rand(j)-A*D_X_rand; % 等式(8)
elseif abs(A)<1
D_Leader=abs(C*Leader_pos(j)-Positions(i,j)); % 等式(1)
Positions(i,j)=Leader_pos(j)-A*D_Leader; % 等式(2)
end
elseif p>=0.5
distance2Leader=abs(Leader_pos(j)-Positions(i,j));
% 等式(5)
Positions(i,j)=distance2Leader*exp(b.*l).*cos(l.*2*pi)+Leader_pos(j);
end
end
end
end
k=1:1:500;
plot(k,fit,'r');
目标函数:
function y=fobj(x)
y=2*x(1)^2+x(2)^2-x(1)*x(2)-10*x(1)-4*x(2)+60;
end
参考文献与博客(代码参考松间沙路hba博主的,写得十分好,谢谢大佬!):
基于改进鲸鱼算法的风-光-重力储能系统优化配置研究_柴源 群体智能优化算法之鲸鱼优化算法(Whale Optimization Algorithm,WOA)_松间沙路的博客-CSDN博客_鲸鱼优化