金枪鱼群优化算法(Tuna Swarm Optimization,TSO)是一种元启发算法,该算法的灵感来自金枪鱼群的合作觅食行为,包含螺旋觅食和抛物线觅食两种策略。TSO算法在单目标问题上具有收敛速度快、求解精度高等特点,是一种不错的优化算法。其主要思想是通过模拟金枪鱼群的觅食行为,来寻找最优解。该成果于2021年发表在知名SCI期刊Computational intelligence and Neuroscience上,目前在谷歌学术上被引128次。
金枪鱼是一种海洋肉食性鱼类。金枪鱼的种类很多,大小差别很大。金枪鱼是顶级海洋掠食者,以各种中层和水面鱼类为食。在算法的实现过程中,首先进行初始化,然后通过螺旋觅食和抛物线觅食两种策略来搜索最优解。
1、算法原理
(1)种群初始化
与大多数基于群的元优化类似,TSO通过在搜索空间中随机均匀地生成初始种群来启动优化过程:
其中是第i个初始个体,ub和lb是搜索空间的上边界和下边界,NP是金枪鱼种群的数量,rand是范围从0到1的均匀分布的随机向量。
(2)螺旋觅食
当沙丁鱼、鲱鱼和其他小型鱼群遇到捕食者时,整个鱼群形成密集的队形,不断改变游动方向,使捕食者难以锁定目标。此时,金枪鱼群通过形成紧密的螺旋队形来追逐猎物。虽然鱼群中的大多数鱼没有方向感,但当一小群鱼坚定地朝某个方向游去时,附近的鱼会纷纷调整方向,最终形成一个目标一致的大群体,开始捕食。
除了螺旋形追逐猎物,金枪鱼群还相互交换信息。每一条金枪鱼都跟随着前一条鱼,从而使相邻的金枪鱼之间能够共享信息。基于上述原理,螺旋觅食策略的数学公式如下:
其中Xt+1 i是t + 1迭代的第i个个体,Xt best是当前最佳个体(食物),α1和α2是控制个体向最佳个体和前一个体移动的趋势的权重系数,α是用于确定金枪鱼在初始阶段跟随最佳个体和前一个体的程度的常数,t表示当前迭代的次数,tmax是最大迭代次数,b是均匀分布在0和1之间的随机数。
所有金枪鱼在食物周围觅食时,对食物周围的搜索空间都有很好的利用能力。然而,当最优个体未能找到食物时,盲目跟随最优个体觅食不利于群体觅食。因此,我们考虑在搜索空间中生成一个随机坐标作为螺旋搜索的参考点。这使得每个人都可以在更广阔的空间中进行搜索,使TSO具有全球性的探索能力。具体数学模型描述如下:
其中Xt rand是搜索空间中随机生成的参考点。
(3)抛物线觅食
在这一阶段中,红尾鹰在前一步选择了最佳的位置和时刻后突然弯腰并从低空飞行阶段的最佳位置攻击猎物,该阶段十分迅速,其数学表达式如下:
除了形成螺旋状的进食方式外,金枪鱼还会形成抛物线状的合作进食方式。金枪鱼以食物为参照点形成抛物线形。此外,金枪鱼通过四处搜寻来寻找食物。这两种方法是同时执行的,假设这两种方法的选择概率都是50%。具体的数学模型描述如下:
其中TF是一个随机数,其值为1或−1。
金枪鱼通过两种觅食策略合作捕猎,然后找到猎物。对于TSO的优化过程,首先在搜索空间中随机生成种群。在每次迭代中,每个个体随机选择两种觅食策略中的一种执行,或者根据概率z选择重新生成搜索空间中的位置。TSO的详细过程如图所示。
TSO伪代码如以下算法所示。
结果展示
在CEC2005函数集测试,结果如下:
MATLAB核心代码
function [Tuna1_fit,Tuna1,Convergence_curve]=TOA_final_version_submit(Particles_no,Max_iter,Low,Up,Dim,fobj)
Tuna1=zeros(1,Dim); Tuna1_fit=inf;
T=initialization(Particles_no,Dim,Up,Low);
Iter=0;
aa=0.7;
z=0.05;
while Iter<Max_iter
C=Iter/Max_iter;
a1=aa+(1-aa)*C;
a2=(1-aa)-(1-aa)*C;
for i=1:size(T,1)
Flag4ub=T(i,:)>Up;
Flag4lb=T(i,:)<Low;
T(i,:)=(T(i,:).*(~(Flag4ub+Flag4lb)))+Up.*Flag4ub+Low.*Flag4lb;
fitness(i)=fobj(T(i,:));
if fitness(i)<Tuna1_fit
Tuna1_fit=fitness(i); Tuna1=T(i,:);
end
end
%---------------- Memory saving-------------------
if Iter==0
fit_old=fitness; C_old=T;
end
for i=1:Particles_no
if fit_old(i)<fitness(i)
fitness(i)=fit_old(i); T(i,:)=C_old(i,:);
end
end
C_old=T; fit_old=fitness;
%-------------------------------------------------
t=(1-Iter/Max_iter)^(Iter/Max_iter);
if rand<z
T(1,:)= (Up-Low)*rand+Low;
else
if 0.5<rand
r1=rand;
Beta=exp(r1*exp(3*cos(pi*((Max_iter-Iter+1)/Max_iter))))*(cos(2*pi*r1));
if C>rand
T(1,:)=a1.*(Tuna1+Beta*abs(Tuna1-T(1,:)))+a2.*T(1,:); %Equation (8.3)
else
IndivRand=rand(1,Dim).*(Up-Low)+Low;
T(1,:)=a1.*(IndivRand+Beta*abs(IndivRand-T(i,:)))+a2.*T(1,:);%Equation (8.1)
end
else
TF = (rand>0.5)*2-1;
if 0.5>rand
T(1,:)=Tuna1+rand(1,Dim).*(Tuna1-T(1,:))+TF.*t^2.*(Tuna1-T(1,:));%Equation (9.1)
else
T(1,:) =TF.* t^2.*T(1,:);%Equation (9.2)
end
end
end
for i=2:Particles_no
if rand<z
T(i,:)= (Up-Low)*rand+Low;
else
if 0.5<rand
r1=rand;
Beta=exp(r1*exp(3*cos(pi*((Max_iter-Iter+1)/Max_iter))))*(cos(2*pi*r1));
if C>rand
T(i,:)=a1.*(Tuna1+Beta*abs(Tuna1-T(i,:)))+a2.*T(i-1,:);%Equation (8.4)
else
IndivRand=rand(1,Dim).*(Up-Low)+Low;
T(i,:)=a1.*(IndivRand+Beta*abs(IndivRand-T(i,:)))+a2.*T(i-1,:);%Equation (8.2)
end
else
TF = (rand>0.5)*2-1;
if 0.5>rand
T(i,:)=Tuna1+rand(1,Dim).*(Tuna1-T(i,:))+TF*t^2.*(Tuna1-T(i,:)); %Equation (9.1)
else
T(i,:) = TF*t^2.*T(i,:);%Equation (9.2)
end
end
end
end
Iter=Iter+1;
Convergence_curve(Iter)=Tuna1_fit;
end
参考文献
[1]e L, Han T, Zhou H, et al. Tuna swarm optimization: a novel swarm-based metaheuristic algorithm for global optimization[J]. Computational intelligence and Neuroscience, 2021, 2021: 1-22.
完整代码获取方式:后台回复关键字:
TGDM199