白鲸算法(BWO)优化支持向量机原理及MATLAB代码复现

0 引言

白鲸算法(Beluga whale optimization,BWO)是Changting Zhong等人于2022年基于白鲸游泳的行为提出群智能算法,该算法模拟白鲸的游泳、猎物和鲸落行为来构造了勘探、开发和落鲸阶段,并在开发阶段利用Levy飞行函数来提高BWO的收敛能力。

1 数学模型

BOW的通过对鲸鱼的游泳行为、合作狩猎和鲸鱼行为的数学模型构建,实现算法的全局性能和局部性能,具体数学模型如下:

1)初始化:由于BWO基于种群的机制,白鲸被视为种群搜索个体,而每条白鲸都是对于模型解,并在优化过程中进行更新。因此对其进行初始化构建,具体如下:

式中X为白鲸个体位置,F为白鲸个体位置对应解,n为种群数目,d为问题维度。

2)定义平衡因子:通过平衡因子实现开发和勘探阶段的转换,其中勘探阶段发生在平衡因子Bf > 0.5,开发阶段发生在Bf≤0.5。具体模型如下

式中Bo为初始平衡因子,为0到1随机值,T为当前迭代次数,Tmax为最大迭代次数。

3)白鲸游泳(探索阶段):BWO的探索阶段是由白鲸的游泳行为来建立的。白鲸的游泳行为通常是以同步或镜像的方式紧密地游泳,因此其游泳姿势成对形式,具体模型如下:

式子根据sin(2πr2)和cos(2πr2)实现白鲸在游泳或潜水时的同步或镜像行为。其中X(i,j)根据种群数和维度进行随机选择鲸鱼。even和odd为单双数目鲸鱼种群个体。

4)捕食行为(开发阶段):BWO的开发阶段的来自于白鲸的捕食行为。白鲸可以根据周围白鲸的位置协同觅食和移动。分享彼此的位置信息来猎物,同时引入了levy飞行的策略,以提高收敛性,其数学模型表示为:

式中r为0到1的随机数,C1为策略飞行策略跳跃强度,LF为飞行策略,u,v为正态分布的随机数,β为常数1.5,Γ为阶段。

5)鲸落:白鲸在迁移和觅食过程受到天敌攻击导致死亡,出现“一鲸落,万物生”想象,BWO通过假设这些白鲸要么转移到其他地方,要么被击落并掉入深海来模拟该想象。为了保证种群数量不变,我们利用白鲸的位置和鲸鱼下降的步长来建立更新的位置。该数学模型表示为:

式中ub,lb为问题维度边界,C2为鲸鱼下降概率和种群大小相关的步长因子,该行为通过随机值进行增强BWO随机性能,扩大种群多样性。

2 优化方式

前篇对支持向量机(支持向量机原理及Matlab代码-CSDN博客)原理讲解,从支持向量机模型运算过程中,可以了解到模型高维映射核函数参数g和处罚因子c对模型预测结果影响最为重要。因此结合上述BWO原理介绍,可以将支持向量机的超参数作为白鲸种群位置,每一个白鲸种群位置对应支持向量机的预测值,将这个预测值作为适应度来实现白鲸游泳行为、捕食行为和鲸落行为,平衡模型全局和局部性能,获取最优白鲸个体。

3 MATLAB代码

3.1 伪代码

3.2 BWO主函数

while T <= Max_it
    newpos = pos;
    WF = 0.1-0.05*(T/Max_it);  % Eq(10) 鲸鱼坠落的概率
    kk = (1-0.5*T/Max_it)*rand(Npop,1); % 搜索和开发的概率:平衡因子

    for i = 1:Npop
        % 搜索阶段
        if kk(i) > 0.5 
            r1 = rand(); 
            r2 = rand();
            RJ = ceil(Npop*rand);   % 轮盘选择
            while RJ == i
                RJ = ceil(Npop*rand);
            end

            % 同步或镜像游泳行为时位置更新Eq(4)
            if nD <= Npop/5
                params = randperm(nD,2);
                newpos(i,params(1)) = pos(i,params(1))+(pos(RJ,params(1))-pos(i,params(2)))*(r1+1)*sin(r2*360);
                newpos(i,params(2)) = pos(i,params(2))+(pos(RJ,params(1))-pos(i,params(2)))*(r1+1)*cos(r2*360);
            else
                params=randperm(nD);
                for j = 1:floor(nD/2)
                    newpos(i,2*j-1) = pos(i,params(2*j-1))+(pos(RJ,params(1))-pos(i,params(2*j-1)))*(r1+1)*sin(r2*360);
                    newpos(i,2*j) = pos(i,params(2*j))+(pos(RJ,params(1))-pos(i,params(2*j)))*(r1+1)*cos(r2*360);
                end
            end
            % 开发阶段
        else  
            r3 = rand();
            r4 = rand(); 
            C1 = 2*r4*(1-T/Max_it);%衡量Levy飞行强度的随机跳跃强度。
            RJ = ceil(Npop*rand);   % 轮盘选择
            while RJ == i
                RJ = ceil(Npop*rand);
            end
            alpha=3/2;%默认常量
            sigma=(gamma(1+alpha)*sin(pi*alpha/2)/(gamma((1+alpha)/2)*alpha*2^((alpha-1)/2)))^(1/alpha); %Eq(7)
            u=randn(1,nD).*sigma;%正态分布的随机数
            v=randn(1,nD);%正态分布的随机数
            S=u./abs(v).^(1/alpha);
            KD = 0.05;
            LevyFlight=KD.*S; % Levy飞行函数:增加收敛性能
            newpos(i,:) = r3*xposbest - r4*pos(i,:) + C1*LevyFlight.*(pos(RJ,:)-pos(i,:));%Eq(5)
        end

        % 边界检测
        Flag4ub = newpos(i,:)>ub;
        Flag4lb = newpos(i,:)<lb;
        newpos(i,:)=(newpos(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
        
        newfit(i,1) = SYD(newpos(i,:),net);
        net.trainParam.showWindow = 0;
        Counts_run = Counts_run+1;

        if newfit(i,1) < fit(i,1)
            pos(i,:) = newpos(i,:);
            fit(i,1) = newfit(i,1);
        end
    end

    % 鲸落阶段
    for i = 1:Npop        
        if kk(i) <= WF
            RJ = ceil(Npop*rand); 
            r5 = rand(); 
            r6 = rand(); 
            r7 = rand();
            C2 = 2*Npop*WF;%与鲸鱼坠落概率和种群数量相关的阶跃因子
            stepsize2 = (ub-lb)*exp(-C2*T/Max_it);%Eq(9)
            newpos(i,:) = (r5*pos(i,:) - r6*pos(RJ,:)) + r7*stepsize2;%Eq(8)
            
            Flag4ub = newpos(i,:)>ub;
            Flag4lb = newpos(i,:)<lb;
            newpos(i,:)=(newpos(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
            
            newfit(i,1) = SYD(newpos(i,:),net); 
            net.trainParam.showWindow = 0;
            Counts_run = Counts_run+1;

            if newfit(i,1) < fit(i,1)
                pos(i,:) = newpos(i,:);
                fit(i,1) = newfit(i,1);
            end
        end
    end

    [fval,index]=min(fit);
    if fval<fvalbest
        fvalbest = fval;
        xposbest = pos(index,:);
    end
    
    kk_Record(T) = kk(1);
    Curve(T) = fvalbest;
    T = T+1;
end

3.3 BWO-SVM/SVR

回归预测模型和分类模型的Matlab代码复现:

白鲸算法优化支持向量机代码复现(BWO-SVR/BWO-SVM)-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值