​金枪鱼群优化算法(TSO),原理公式详解,附matlab代码

金枪鱼群优化算法(Tuna Swarm OptimizationTSO)是一种元启发算法,该算法的灵感来自金枪鱼群的合作觅食行为,包含螺旋觅食和抛物线觅食两种策略。TSO算法在单目标问题上具有收敛速度快、求解精度高等特点,是一种不错的优化算法。其主要思想是通过模拟金枪鱼群的觅食行为,来寻找最优解。该成果于2021年发表在知名SCI期刊Computational intelligence and Neuroscience上,目前在谷歌学术上被引128次。

85c20923ed155184ab22a3e05ae47ba6.png

金枪鱼是一种海洋肉食性鱼类。金枪鱼的种类很多,大小差别很大。金枪鱼是顶级海洋掠食者,以各种中层和水面鱼类为食。在算法的实现过程中,首先进行初始化,然后通过螺旋觅食和抛物线觅食两种策略来搜索最优解。

1、算法原理

(1)种群初始化

与大多数基于群的元优化类似,TSO通过在搜索空间中随机均匀地生成初始种群来启动优化过程:

其中是第i个初始个体,ub和lb是搜索空间的上边界和下边界,NP是金枪鱼种群的数量,rand是范围从0到1的均匀分布的随机向量。

(2)螺旋觅食

当沙丁鱼、鲱鱼和其他小型鱼群遇到捕食者时,整个鱼群形成密集的队形,不断改变游动方向,使捕食者难以锁定目标。此时,金枪鱼群通过形成紧密的螺旋队形来追逐猎物。虽然鱼群中的大多数鱼没有方向感,但当一小群鱼坚定地朝某个方向游去时,附近的鱼会纷纷调整方向,最终形成一个目标一致的大群体,开始捕食。

除了螺旋形追逐猎物,金枪鱼群还相互交换信息。每一条金枪鱼都跟随着前一条鱼,从而使相邻的金枪鱼之间能够共享信息。基于上述原理,螺旋觅食策略的数学公式如下:

其中Xt+1 it + 1迭代的第i个个体,Xt best是当前最佳个体(食物),α1α2是控制个体向最佳个体和前一个体移动的趋势的权重系数,α是用于确定金枪鱼在初始阶段跟随最佳个体和前一个体的程度的常数,t表示当前迭代的次数,tmax是最大迭代次数,b是均匀分布在01之间的随机数。

所有金枪鱼在食物周围觅食时,对食物周围的搜索空间都有很好的利用能力。然而,当最优个体未能找到食物时,盲目跟随最优个体觅食不利于群体觅食。因此,我们考虑在搜索空间中生成一个随机坐标作为螺旋搜索的参考点。这使得每个人都可以在更广阔的空间中进行搜索,使TSO具有全球性的探索能力。具体数学模型描述如下:

其中Xt rand是搜索空间中随机生成的参考点。

(3)抛物线觅食

在这一阶段中,红尾鹰在前一步选择了最佳的位置和时刻后突然弯腰并从低空飞行阶段的最佳位置攻击猎物,该阶段十分迅速,其数学表达式如下:

除了形成螺旋状的进食方式外,金枪鱼还会形成抛物线状的合作进食方式。金枪鱼以食物为参照点形成抛物线形。此外,金枪鱼通过四处搜寻来寻找食物。这两种方法是同时执行的,假设这两种方法的选择概率都是50%。具体的数学模型描述如下:

其中TF是一个随机数,其值为1−1

金枪鱼通过两种觅食策略合作捕猎,然后找到猎物。对于TSO的优化过程,首先在搜索空间中随机生成种群。在每次迭代中,每个个体随机选择两种觅食策略中的一种执行,或者根据概率z选择重新生成搜索空间中的位置。TSO的详细过程如图所示。

c2f0e6848b37beab502a4f054f956325.png

TSO伪代码如以下算法所示。

f0ba7aae4906d4dbbbb95b5100f3008e.png

结果展示

在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

  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天吃饺子

不想刀我的可以选择爱我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值