鲸鱼优化算法WOA及求解函数应用(含代码,简单易懂)
鲸鱼优化算法WOA及求解函数应用(含代码,简单易懂)
鲸鱼优化算法(WOA)是一种基于群体智能的优化算法,灵感来源于座头鲸的特殊捕食方式。该算法通过模拟鲸鱼的包围、螺旋攻击和随机搜索行为来寻找最优解,具有参数少、收敛速度快等特点。本文将详细介绍WOA的数学模型及其在函数优化中的应用,并附有MATLAB实现代码。
一、算法背景与原理
鲸鱼优化算法(WOA)由澳大利亚格里菲斯大学的Mirjalili等人于2016年提出,是一种新的群体智能优化算法。其灵感来源于座头鲸的特殊捕食方式——"发泡网觅食法"。座头鲸通过制造气泡来包围和捕捉猎物,这种捕食行为被分为"向上螺旋"和"双环"两种模式。
二、数学模型及算法
总体来说,鲸鱼优化算法由三部分动作组成:包围猎物、螺旋攻击猎物(发泡网攻击)、随机搜索猎物。下面分别阐述三种动作的数学模型。
2.1 包围猎物
WOA算法将当前最优候选解做为目标猎物(最优解),在知道猎物位置后鲸群开始根据当前自身与猎物位置的关系更新位置。这种行为用以下公式表示:
$$
X_{t+1}^{i} = X^{*} - A \cdot D
$$
其中,
- $X_{t+1}^{i}$ 表示第 $t+1$ 代的解
- $X^{*}$ 表示当前最优候选解的位置
- $A$ 和 $C$ 为系数向量,需要单独计算出
- $D$ 表示当前解与最优解之间的距离
系数向量 $A$ 和 $C$ 的计算公式如下:
$$
A = 2a_1r_1 - a_1
$$
$$
C = 2r_2
$$
其中,
- $r_1$ 和 $r_2$ 表示两个0到1之间的随机数
- $a_1$ 为随着迭代从2线性减小到0的数字,表示为:
$$
a_1 = 2 - \frac{2t}{G}
$$
其中 $G$ 表示迭代总次数。
2.2 螺旋攻击
为模拟座头鲸的螺旋过程,也就是发泡网攻击过程,我们在鲸鱼与猎物之间建立一种螺旋方程,模拟座头鲸的螺旋状运动,其公式及示意图如下:
$$
X_{t+1}^{i} = D_p \cdot e^{bl} \cdot \cos(2\pi l) + X^{*}
$$
其中,
- $D_p$ 表示当前解与最优解之间的距离
- $b$ 为常数,一般设为1
- $l$ 为[-1,1]之间的随机数
- $e$ 是自然对数的底数
包围猎物和螺旋攻击,这两种行为的选择是通过随机的方式选择的,当概率 $p < 0.5$ 时选择包围猎物,反之则选择螺旋攻击。
2.3 随机搜索
随机搜索是WOA中用于全局搜索,跳出局部最优的方式,其数学表示为:
$$
X_{t+1}^{i} = X_{rand} - A \cdot D
$$
其中,
- $X_{rand}$ 为随机选择的鲸鱼(解)
- $D$ 表示当前解与随机解之间的距离
包围猎物和随机搜索行为的发生与否取决于 $p$ 的取值,当 $p < 0.5$ 采用包围猎物行为;当 $p \geq 0.5$ 采用随机搜索行为。
2.4 算法流程图
(此处省略流程图,实际生产时应包含)
三、 求解函数应用
下面通过一个具体的二元函数优化问题来展示WOA的应用:
求解二元函数的最大值,函数表达式为:
$$
f(x_1, x_2) = 21.5 + x_1 \sin(4\pi x_1) + x_2 \sin(20\pi x_2)
$$
约束条件为:
$$
-3.0 \leq x_1 \leq 12.1
$$
$$
4.1 \leq x_2 \leq 5.8
$$
以下是MATLAB实现代码:
% 鲸鱼优化算法——WOA
% max f(x1,x2)=21.5+x1*sin(4*PI*x1)+x2*sin(20*PI*x2)
% s.t. -3.0<=x1<=12.1
% 4.1<=x2<=5.8
clear all
clc
%% 参数列表
whale_num=30; % 鲸鱼数量
dim=2; % 维度:未知数的数量
G=100; % 迭代次数
F=@(x1,x2) 21.5+x1*sin(4*pi*x1)+x2*sin(20*pi*x2); % 待求解函数句柄
up_x1=12.1; % x1的上界
down_x1=-3.0; % x1的下界
up_x2=5.8; % x2的上界
down_x2=4.1; % x2的下界
%% 种群初始化
init_whale_group =[-3.0+(12.1+3.0)*rand(whale_num,1) 4.1+(5.8-4.1)*rand(whale_num,1)];
whale_group=init_whale_group;
% 最优鲸鱼所在位置
whale_max=zeros(G,2);
max_fitness=zeros(G,1);
%% 迭代主体
for t=1:G
% 超出范围鲸鱼的处理
temp_x1=whale_group(:,1);
% 小于x1下界的变为下界
temp_x1(temp_x1<down_x1)=down_x1;
% 大于x2上界的变为上界
temp_x1(temp_x1>up_x1)=up_x1;
whale_group(:,1)=temp_x1;
temp_x2=whale_group(:,2);
% 小于x1下界的变为下界
temp_x2(temp_x2<down_x2)=down_x2;
% 大于x2上界的变为上界
temp_x2(temp_x2>up_x2)=up_x2;
whale_group(:,2)=temp_x2;
% 计算每个鲸鱼的函数值
whale_fitness=zeros(whale_num,1);
for i=1:whale_num
whale_fitness(i,1)=F(whale_group(i,1),whale_group(i,2));
end
% 记录最好位置
[whale_max_fitness,index_max]=max(whale_fitness);
if(whale_max_fitness>max_fitness)
max_fitness(t,1)=whale_max_fitness;
whale_max(t,:)=whale_group(index_max,:);
else
max_fitness(t,1)=max_fitness(t-1,:);
whale_max(t,:)=whale_max(t-1,:);
end
% 计算参数
a1=2-2*t/G;
a2=-1-t/G;
for i=1:whale_num
A=2*a1*rand()-a1;
C=2*rand();
b=1;
l=(a2-1)*rand+1;
p=rand();
for j=1:dim
if(p<0.5)
if(abs(A)<1)
% 一、包围猎物
% 计算移动幅度
D=abs(C*whale_max(t,j)-whale_group(i,j));
% 按照移动幅度包围猎物(更新位置,即更新一次x1,x2)
whale_group(i,j)=whale_max(t,j)-A*D;
else
% 二、随机搜索猎物
whale_rand_index=floor(whale_num*rand()+1);
whale_rand=whale_group(whale_rand_index,:);
D=abs(C*whale_rand(j)-whale_group(i,j));
whale_group(i,j)=whale_rand(j)-A*D;
end
else
% 三、螺旋运动(发泡网攻击)
D_p=abs(whale_max(t,j)-whale_group(i,j));
whale_group(i,j)=whale_max(t,j)+D_p*exp(b.*l)*cos(l.*2*pi);
end
end
end
whale_group;
end
%% 绘图
X=1:G;
plot(X,max_fitness);
运行结果图如下:
可以看出,收敛速度还是很快的,初步学习结束,后续考虑进行鲸鱼算法的多目标应用优化。