1.算法描述
鯨魚(yú)算法(Whale Optimization Algorithm,WOA)[1]椎扬。鯨魚(yú)優(yōu)化算法(WOA)是 2016 年由澳大利亞格里菲斯大學(xué)的 Mirjalili 等提出的一種新的群體智能優(yōu)化算法审轮,因算法簡(jiǎn)練易于實(shí)現(xiàn)蜘欲,且對(duì)目標(biāo)函數(shù)條件要求寬松,參數(shù)控制較少等種種優(yōu)點(diǎn)受到一批又一批學(xué)者的親睞炮车,且經(jīng)過(guò)不斷的改進(jìn)WOA已應(yīng)用于許多領(lǐng)域己儒。WOA算法設(shè)計(jì)的既精妙又富有特色,它源于對(duì)自然界中座頭鯨群體狩獵行為的模擬袱讹, 通過(guò)鯨魚(yú)群體搜索、包圍昵时、追捕和攻擊獵物等過(guò)程實(shí)現(xiàn)優(yōu)時(shí)化搜索的目的捷雕。在原始的WOA中,提供了包圍獵物壹甥,螺旋氣泡救巷、尋找獵物的數(shù)學(xué)模型。
WOA算法的初始階段中,座頭鯨并不知道食物所在的位置,他們都是通過(guò)群體合作來(lái)獲得食物的位置信息,因此,距離食物最近的鯨魚(yú)相當(dāng)于當(dāng)前的一個(gè)局部最優(yōu)解,其他鯨魚(yú)個(gè)體都會(huì)朝這個(gè)位置靠近,從而逐步包圍食物,因此使用下列的數(shù)學(xué)模型表示:
2.2氣泡攻擊
本階段模仿座頭鯨進(jìn)行氣泡攻擊,通過(guò)收縮包圍和螺旋更新位置來(lái)設(shè)計(jì)鯨魚(yú)捕食吐出氣泡的行為,從而達(dá)到鯨魚(yú)局部尋優(yōu)的目的盹廷。
(1)螺旋更新位置
座頭鯨個(gè)體首先計(jì)算與當(dāng)前最優(yōu)鯨魚(yú)的距離,然后再以螺旋方式游走,在進(jìn)行食物的搜索時(shí)候,螺旋游走方式的數(shù)學(xué)模型為:
2.3尋覓食物階段
座頭鯨通過(guò)控制|A|向量游走獲取食物,當(dāng)|A|>1的時(shí)候,座頭鯨個(gè)體向著參考座頭鯨的位置靠近,鯨魚(yú)個(gè)體朝著隨機(jī)選取的座頭鯨更新位置,這種方式保證了座頭鯨個(gè)體能夠進(jìn)行全局搜索,獲得全局最優(yōu)解,其數(shù)學(xué)模型表示如下:
優(yōu)化目標(biāo)函數(shù)概述:
優(yōu)化目標(biāo)函數(shù)做如下的設(shè)計(jì):
即成本征绸,時(shí)間久橙,負(fù)荷
2.仿真效果預(yù)覽
matlab2022a仿真如下:
3.MATLAB核心程序
Num ?????????= 50; ?%搜索數(shù)量
Iters ???????= 200; %迭代次數(shù)
D ???????????= M*N; %搜索空間維數(shù)
woa_idx ?????= zeros(1,D);
woa_get ?????= inf;
%初始化種群的個(gè)體
for i=1:Num
for j=1:D
xwoa(i,j)=randn; %隨機(jī)初始化位置
end
end
for t=1:Iters
t
for i=1:Num
%目標(biāo)函數(shù)更新
[pa(i),pa1(i),pa2(i),pa3(i)] ?= fitness(xwoa(i,:));
Fitout ???????????????????????= pa(i);
%更新
if Fitout < woa_get ?
woa_get = Fitout;
woa_idx = xwoa(i,:);
end
end
%調(diào)整參數(shù)
c1 = 2-t*((1)/300);
c2 =-1+t*((-1)/300);
%位置更新
for i=1:Num
r1 ????????= rand();
r2 ????????= rand();
K1 ????????= 2*c1*r1-c1; ?
K2 ????????= 2*r2; ????????????
l ?????????=(c2-1)*rand + 1; ?
rand_flag ?= rand(); ??
for j=1:D
if rand_flag<0.5 ??
if abs(K1)>=1
RLidx ???= floor(Num*rand()+1);
X_rand ??= xwoa(RLidx, :);
D_X_rand = abs(K2*X_rand(j)-xwoa(i,j));
xwoa(i,j)= X_rand(j)-K1*D_X_rand; ????
else
D_Leader = abs(K2*woa_idx(j)-xwoa(i,j));
xwoa(i,j)= woa_idx(j)-K1*D_Leader; ???
end
else
distLeader = abs(woa_idx(j)-xwoa(i,j));
xwoa(i,j) ?= distLeader*exp(6*l).*cos(l.*2*pi)+woa_idx(j);
end
end
end
[pb,pb1,pb2,pb3] ?= fitness(woa_idx);
Pbest(t) ?= pb;
Pbest1(t) = pb1;
Pbest2(t) = pb2;
Pbest3(t) = pb3;
end
figure;
subplot(221);
plot(Pbest,'b');
legend('加權(quán)收斂目標(biāo)');
grid on
%輸出三個(gè)指標(biāo)的收斂曲線(xiàn)
subplot(222);
plot(Pbest1,'b');
legend('歸一化成本值');
grid on
subplot(223);
plot(Pbest2,'b');
legend('歸一化時(shí)間值');
grid on
subplot(224);
plot(Pbest3,'b');
legend('歸一化負(fù)荷值');
grid on
%輸出調(diào)度結(jié)果
[aij,fobj,fobj1,fobj2,fobj3] = fitness_results(woa_idx);
%顯示各個(gè)資源的三個(gè)指標(biāo)的利用率
%處理能力利用率
for i = 1:M
tmps = aij(:,i);
indx = find(tmps==1);
SE(i)= sum(Et(indx))/En(i);
end
%內(nèi)存利用率
for i = 1:M
tmps = aij(:,i);
indx = find(tmps==1);
SS(i)= sum(St(indx))/Sn(i);
end
%帶寬利用率
for i = 1:M
tmps = aij(:,i);
indx = find(tmps==1);
SC(i)= sum(Ct(indx))/Cn(i);
end
02_056m