白鲸优化算法(Beluga Whale Optimization,BWO)是发表在中科院一区期刊Knowledge-Based Systems上的智能优化算法

01.引言

白鲸优化算法(beluga whale optimization, BWO)来解决优化问题。BWO建立了探索、开发和落鲸三个阶段,分别对应成对游动、猎物和落鲸行为。BWO的平衡因子和落鲸概率具有自适应性,对控制勘探开发能力起着重要作用。此外,在开发阶段引入了Levy飞行,增强了全局收敛性。采用30个基准函数对该算法的有效性进行了定性、定量和可扩展性分析,并将统计结果与其他15种元启发式算法进行了比较。根据结果和讨论,BWO算法在解决单峰和多峰优化问题上具有竞争力,并且通过Friedman排名检验,在比较的元启发式算法中,BWO算法在基准函数的可扩展性分析中总体排名第一。最后,四个工程问题证明了BWO在解决复杂的现实优化问题方面的优点和潜力。

02.代码流程

03.部分代码

function [fvalbest,xposbest,Curve] = BWO(Npop,Max_it,lb,ub,nD,fobj)
% disp('Beluga Whale Optimization is optimizing your problem');
fit = inf*ones(Npop,1);
newfit = fit;
Curve = inf*ones(1,Max_it);
kk = zeros(1,Max_it);
Counts_run = 0;
if size(ub,2)==1
    lb = lb*ones(1,nD); ub = ub*ones(1,nD);
end
pos = rand(Npop,nD).*(ub-lb)+lb;
for i = 1:Npop
    fit(i,1) = fobj(pos(i,:));
    Counts_run = Counts_run+1;
end
[fvalbest,index]=min(fit);
xposbest = pos(index,:);
T = 1;
while T <= Max_it
    newpos = pos;
    WF = 0.1-0.05*(T/Max_it);  % The probability of whale fall
    kk = (1-0.5*T/Max_it)*rand(Npop,1); % The probability in exploration or exploitation
    for i = 1:Npop
        if kk(i) > 0.5 % exploration phase
            r1 = rand(); r2 = rand();
            RJ = ceil(Npop*rand);   % Roulette Wheel Selection
            while RJ == i
                RJ = ceil(Npop*rand);
            end
            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  % exploitation phase
            r3 = rand(); r4 = rand(); C1 = 2*r4*(1-T/Max_it);
            RJ = ceil(Npop*rand);   % Roulette Wheel Selection
            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); % Levy flight
            u=randn(1,nD).*sigma;
            v=randn(1,nD);
            S=u./abs(v).^(1/alpha);
            KD = 0.05;
            LevyFlight=KD.*S;
            newpos(i,:) = r3*xposbest - r4*pos(i,:) + C1*LevyFlight.*(pos(RJ,:)-pos(i,:));
        end
        % boundary
        Flag4ub = newpos(i,:)>ub;
        Flag4lb = newpos(i,:)<lb;
        newpos(i,:)=(newpos(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
        newfit(i,1) = fobj(newpos(i,:));    % fitness calculation
        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
        % whale falls
        if kk(i) <= WF
            RJ = ceil(Npop*rand); r5 = rand(); r6 = rand(); r7 = rand();
            C2 = 2*Npop*WF;
            stepsize2 = r7*(ub-lb)*exp(-C2*T/Max_it);
            newpos(i,:) = (r5*pos(i,:) - r6*pos(RJ,:)) + stepsize2;
            % boundary
            Flag4ub = newpos(i,:)>ub;
            Flag4lb = newpos(i,:)<lb;
            newpos(i,:)=(newpos(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
            newfit(i,1) = fobj(newpos(i,:));    % fitness calculation
            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
% display(['The function call is ', num2str(Counts_run)]);

04.代码效果图

获取代码请关注MATLAB科研小白的个人公众号(即文章下方二维码),并回复智能优化算法本公众号致力于解决找代码难,写代码怵。各位有什么急需的代码,欢迎后台留言~不定时更新科研技巧类推文,可以一起探讨科研,写作,文献,代码等诸多学术问题,我们一起进步。

更多推荐