【智能优化算法】白鲸优化算法(Beluga Whale Optimization,BWO)
·
白鲸优化算法(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科研小白的个人公众号(即文章下方二维码),并回复智能优化算法本公众号致力于解决找代码难,写代码怵。各位有什么急需的代码,欢迎后台留言~不定时更新科研技巧类推文,可以一起探讨科研,写作,文献,代码等诸多学术问题,我们一起进步。
更多推荐



所有评论(0)