一、基础灰狼算法
1.算法背景
灰狼算法(Grey Wolf Optimization, GWO)是一种受灰狼群体捕猎行为启发的群智能优化算法,由Mirjalili等人于2014年提出。该算法模仿了灰狼群体的领导阶层和狩猎机制,通过模拟灰狼追踪、包围、攻击猎物的行为来实现优化目标。灰狼算法的核心思想是将灰狼种群中的个体分为四个等级:α、β、γ和ω,分别代表狼群中的领导者和追随者。算法通过模拟灰狼的捕猎行为,包括追踪、包围和攻击猎物,来更新种群中各个个体的位置,从而逐步逼近最优解。
图1 灰狼包围猎物 图2 灰狼追击猎物
2.数学模型
灰狼包围猎物的数学模型为:
其中:
为灰狼和猎物的距离;
和为系数向量:
为收敛因子,随迭代次数由2线性减小至0;
、是[0,1]之间的随机数;
为当前猎物的位置;
为个体位置;
3.算法过程
(1)初始化种群;
(2)找出种群中适应度前三高的首领狼;
(3)开始迭代:
A.狼向着首领狼所在位置更新,更新公式如下:
其中,表征灰狼个体到三条领头狼的距离;
表征个体朝首领前进的步长与方向; 个体位置更新:
B.限制位置范围;
通过上述更新后,若灰狼个体位置超出空间位置上限,则令其等于上限;
若灰狼个体位置低于空间位置下限,则令其等于下限。
C.找出新的适应度前三高的首领狼;
D.更新历史最佳位置;
E.若满足迭代次数要求,则输出历史最佳位置,迭代结束;否则返回步骤(3)A.
二、改进思路
局部开发能力是指在一定小范围内搜索最优解的能力,局部开发能力强可以增强算法的收敛精度。对于智能算法而言,全局搜索能力和局部开发能力是算法寻优的关键。GWO 搜索过程中,需要在前期搜索更多的解,即保持较强的全局开发能力;在搜索后期,需要提高算法解的精度,即需要较强的局部开发能力。因此要获得良好的解,需要平衡算法前期和后期的全局开发和局部开发的能力。
算法执行过程中,|A|>1时,个体与首领狼分开,全局寻优能力增强,|A|<1时,个体靠近首领狼,收敛精度和速度有所提高,作为代价,容易陷入局部最优;
问题一:的线性变化不完全适应算法过程
问题二:只根据首领狼位置进行更新,缺少自身记忆项
问题三:更新次数少,容易陷入局部最优
三、改进方法
1.动态非线性参数的引入
针对问题一:为提高算法的全局搜索能力,避免陷入局部最优,提出一种新的非线性收敛因子更新公式为:
其中,是最大迭代次数,是当前迭代次数;
由图三可直观看出随迭代次数增加而减小的趋势,在迭代的前期和后期,的减小速度有所减慢,在中期加快,这在一定程度上改善了算法前期的全局搜索能力和后期的收敛精度及速度;
图三 随迭代次数变化趋势 图四 、随迭代次数变化趋势
2.个体记忆项的引入
针对问题二:为防止由于三条首领狼陷入局部最优而导致其他个体陷入局部最优,引入基于个体记忆的位置更新公式(类似于粒子群算法):
其中:、是[0,1]之间的随机数;
、 为群体影响和个体记忆所占的权重;
为灰狼个体的历史最优位置;
当灰狼个体适应度弱于种群平均适应度时,我们希望其在大空间空间寻优,增加其自身认知项权重,令;
否则,依照以下公式确定权重:
,;
迭代前期小而大,个体记忆权重大,全局搜索能力强,避免陷入局部最优;
迭代后期大而小,群体影响全重大,收敛速度快,精度高;
3.增加更新次数
为进一步加强算法跳出局部最优的能力,在上述两种优化方法的基础上,制定扰动策略:
在上述算法的基础上,如果更新后的灰狼个体适应度弱于种群平均适应度,在限定范围内随机生成一个新个体:
如果更新后的灰狼个体适应度强于种群平均适应度,用一个基于非线性函数的高斯扰动,以加强跳出局部最优的能力:
其中:l 和 u 为解空间的最小边界和最大边界;δ (0,1) 为服从期望为0,方差为1的高斯分布,
最后依据贪心思想进行更新:
当更新后个体的适应度优于更新前个体的适应度时,更新公式为:
否则,更新公式为:
引入贪心思想防止了前面的扰动破坏最优解的可能,一定程度上保证了算法的稳定性;
四、改进后过程
(1)初始化种群;
(2)找出种群中适应度前三高的首领狼;
(3)设置记录器,记录每个个体的历史最优位置P及种群历史最优位置;
(4)开始迭代:
A.狼向着首领狼所在位置进行第一次更新,更新公式如下:
其中,表征灰狼个体到三条领头狼的距离;
表征个体朝首领前进的步长与方向; 个体位置更新:
比较个体和种群平均适应度,确定和;
根据以下公式进行第一次更新:
B.第一次限制位置范围;
通过上述更新后,若灰狼个体位置超出空间位置上限,则令其等于上限;
若灰狼个体位置低于空间位置下限,则令其等于下限;
C.添加扰动,进行第二次更新:
比较个体和种群平均适应度,确定添加扰动的方法;
根据公式、 添加扰动;
基于贪心思想选择位置第二次更新;
D.第二次限制位置范围;
通过上述更新后,若灰狼个体位置超出空间位置上限,则令其等于上限;
若灰狼个体位置低于空间位置下限,则令其等于下限;
E.找出新的适应度前三高的首领狼;
F.更新个体以及种群历史最佳位置;
G.若满足迭代次数要求,则输出历史最佳位置,迭代结束;否则返回步骤(4)A.
五、改进后代码
由具体实验可知,经过以上三条改进,无论是收敛精度或是速度都较大程度上优于基础灰狼算法,以下为改进后代码:
%%版本说明
%更改了收敛因子a的更新方式,由线性递减改为非线性递减
%增加基于自适应个体记忆的位置更新,引入粒子群算法思想
%增加高斯扰动
%% 初始化种群
clear
%% Sphere
clear
f = @(x) sum(x.^2) ;%求此函数最小值
N=100; %种群个数
d=30; %决策变量维数
ger=500; %最大迭代次数
% 设置位置参数限制
%limit是d行2列的限制矩阵,包括了d个区间
limit=zeros(d,2);
limit(:,1)=-100;%区间左端点
limit(:,2)=100;%区间右端点
%收敛因子a,随着迭代次数由2线性减少到0
amax=2;
amin=0;
%初始化种群 N条狼,每条狼携带d维信息
for i=1:d
x(:,i)=limit(i,1) + ( limit(i,2) - limit(i,1) ) .* rand(N, 1);%按照列的顺序进行初始化;
end
%计算每条狼的适应度
fx=f(x')';%fx是一个列矩阵
%选出适应度最高的三条狼,这三条狼用来估计猎物的位置
%第一条
[fxa,na]=min(fx); xa=x(na,:);
%第二条
fx(na)=Inf;
[fxb,nb]=min(fx); xb=x(nb,:);
%第三条
fx(nb)=Inf;
[fxc,nc]=min(fx); xc=x(nc,:);
fx(na)=fxa;%把值赋回来
fx(nb)=fxb;
%设置记录器,记录历史最优位置
resultx=xa;
resultf(1)=fxa;%每一代全体的历史最优
px=x;
pf=fx;%每个个体的历史最优
%迭代开始
for i=1:ger
%更新参数
a=amax-(amax-amin)*exp(-(1.5*cos((pi/2)*(i-1)/(ger-1)))^5);%新的非线性收敛因子更新公式
A1=2*a*rand(1,d)-a; A2=2*a*rand(1,d)-a; A3=2*a*rand(1,d)-a;
C1=2*rand(1,d); C2=2*rand(1,d); C3=2*rand(1,d);
%更新每一只狼位置
for j=1:N
%计算普通狼与领头狼的距离
Da=abs(C1.*xa-x(j,:)); Db=abs(C2.*xb-x(j,:)); Dc=abs(C3.*xc-x(j,:));
%计算普通狼前进的步长及方向
X1=xa-A1.*Da; X2=xb-A2.*Db; X3=xc-A3.*Dc;
%个体记忆更新
m1=rand(); m2=rand();
%适应度低的狼,在空间中寻找其他解,避免因为前三条狼而陷入局部最优
if f(x(j,:))>sum(fx)/N
c1=0.2;%群体影响权重
c2=0.8;%个体记忆权重
x(j,:)=c1*m1*(X1+X2+X3)/3+c2*m2*(px(j,:)-x(j,:));%更新灰狼的位置
else
bmin=0.2; bmax=0.8;
c1=bmin+sin(pi/2*(i-1)/(ger-1))*(bmax-bmin);
c2=bmin+cos(pi/2*(i-1)/(ger-1))*(bmax-bmin);
x(j,:)=c1*m1*(X1+X2+X3)/3+c2*m2*(px(j,:)-x(j,:));%更新灰狼的位置
end
end
%空间限制
x(x > limit(1,2)) = limit(2);
x(x < limit(1,1)) = limit(1);
%更新每一条狼的适应度
fx=f(x')';
%高斯自适应扰动更新
for j=1:N
if f(x(j,:))>sum(fx)/N
x0=limit(1,1)+(limit(1,2)-limit(1,1))*rand(1,d);
if f(x0)<f(x(j,:))
x(j,:)=x0;
end
else
derta=randn(1,d);
tao=bmin+cos(pi/2*(i-1)/(ger-1))*(bmax-bmin);
x0=x(j,:).*(1+tao*derta);
if f(x0)<f(x(j,:))
x(j,:)=x0;
end
end
end
%空间限制
x(x > limit(1,2)) = limit(2);
x(x < limit(1,1)) = limit(1);
%更新每一条狼的适应度
fx=f(x')';
%更新三条领头狼
%第一条
[fxa,na]=min(fx); xa=x(na,:);
%第二条
fx(na)=Inf;%把最小值取走,找次小值
[fxb,nb]=min(fx); xb=x(nb,:);
%第三条
fx(nb)=Inf;%把次小值取走,找次次小值
[fxc,nc]=min(fx); xc=x(nc,:);
fx(na)=fxa;%把值赋回来
fx(nb)=fxb;
%更新记录器
if i~=1
resultf(i)=resultf(i-1);
end
for k=1:N
if fx(k)<resultf
resultf(i)=fx(k);
resultx=x(k,:);%更新总体历史最优
end
if fx(k)<pf(k)
pf(k)=fx(k);
px(k,:)=x(k,:);%更新个体历史最优
end
end
%绘制过程图
%x0 = [-5.12:0.05:5.12];
%y0 = [-5.12:0.05:5.12] ;
%[X,Y] = meshgrid(x0,y0);
%Z =f(X,Y) ;
%subplot(1,2,1)
%mesh(X,Y,Z)
%hold on
%scatter3( x(:,1),x(:,2) ,f( x(:,1),x(:,2) ) ,'r*');title(['状态位置变化','-迭代次数:',num2str(i)])
%subplot(1,2,2);plot(resultf);title('最优适应度进化过程')
%pause(0.01)
end
%迭代结束
%绘制最终图
%figure(2);mesh(X,Y,Z); hold on
%scatter3( x(:,1),x(:,2) ,f( x(:,1),x(:,2) ) ,'r*');title('最终状态位置')
disp(['最优值:',num2str(resultf(ger))]);
disp(['变量取值:',num2str(resultx)]);
六、参考文献
[1]陈朗,陈昌忠,刘鑫.基于个体记忆和高斯扰动的自适应灰狼算法[J].四川轻化工大学学报(自然科学 版),2024,37(2):64-72.
[2] 龙文,伍铁斌.协调探索和开发能力的改进灰狼优化算法[J].控制与决策,2017,32(10):1749-1757.
[3] 李阳,李维刚,赵云涛,等.基于莱维飞行和随机游动策略的灰狼算法[J].计算机学,2020,47(8):291- 296.
[4] 魏政磊,赵辉,李牧东,等.控制参数值非线性调整策略的灰狼优化算法[J].空军工程大学学报(自然 科学版),2016,17(3):68-72.
[5] 黎素涵,叶春明.重选精英个体的非线性收敛灰狼优化算法[J].计算机工程与应用,2021,57(1):62- 68.