基本介紹
- 中文名:天牛須搜尋算法
- 外文名:Beetle Antennae Search Algorithm
- 縮寫:BAS
算法設計,系統建模,步長設定,Matlab 程式,實測效果,
算法設計
天牛須搜尋的原理:
當天牛覓食時,天牛並不知道實物在哪裡,而是根據食物氣味的強弱來覓食。天牛有兩隻長觸角,如果左邊觸角收到的氣味強度比右邊大,那下一步天牛就往左飛,否則就往右飛,依據這一原理天牛可以找到食物。
天牛須搜尋對我們的啟發:
食物的氣味就相當於一個函式,這個函式在三維空間每個點值都不同,天牛兩個須可以採集自身附近兩點的氣味值,天牛的目的是找到全局氣味值最大的點(即食物所在位置)。仿照天牛的行為,我們設計了該智慧型最佳化算法進行函式最最佳化求解。
天牛在三維空間運動,而天牛須搜尋需要對任意維函式都有效才可以。因而,天牛須搜尋是對天牛生物行為在任意維空間的推廣。採用如下模型描述天牛須搜尋算法的尋優策略:
1. 天牛左右兩須位於質心兩邊。
2. 天牛步長step與兩須之間距離d0的比值是個固定常數即step=c*d0其中c是常數。即,大天牛(兩須距離長)走大步,小天牛走小步。
3. 天牛飛到下一步後,頭的朝向是隨機的。
系統建模
- 第一步:對於一個n維空間的最佳化問題,我們用xl表示左須坐標,xr表示右須坐標,x表示質心坐標,用d0表示兩須之間距離。根據假設3,天牛頭朝向任意,因而從天牛右須指向左須的向量的朝向也是任意的,所以可以產生一個隨機向量dir=rands(n,1)來表示它。對此歸一化:dir=dir/norm(dir); 我們這樣可以得到xl-xr=d0*dir;顯然, xl,xr還可以表示成質心的表達式:xl=x+d0*dir/2;xr=x-d0*dir/2.
- 第二步:對於待最佳化的價值函式f,求取左右兩須的值: fleft=f(xl); fright=f(xr); 判斷兩個值大小:
- 如果fleft<fright,為了探尋f的最小值,則天牛向著左須方向行進距離step,即x=x+step*normal(xl-xr);
- 如果fleft>fright,為了探尋f的最小值,則天牛向著右須方向行進距離step,即x=x-step*normal
(xl-xr); - 如上兩種情況可以採用符號函式sign統一寫成: x=x-step*normal(xl-xr) *sign(fleft-fright)=x-step*dir *sign(fleft-fright).(註:其中normal是歸一化函式)
基本步驟就這兩步,總結如下:
幾點說明:
1. 核心代碼如上,只有4行。
2.實用中可以設定可變步長,由於假設2中我們認為step=c*d0其中c是常數,變步長意味著d0=step/c為變化的。
步長設定
關於變步長,推薦如下兩種:
1.每步疊代中採用step=eta*step,其中eta在0,1之間靠近1,通常可取eta=0.95;
2.引入新變數temp和最終解析度step0,temp=eta*temp,step=temp+step0。
關於初始步長:初始步長可以儘可能大,最好與自變數最大長度相當。
Matlab 程式
function bas()
clear all;close all
eta=0.95;%%%%%%%初始化%%%%%%%
c=5;%ratio between step and d0
step=1;%initial step set as thelargest input range
n=100;%iterations
k=20;%space dimension
x=rands(k,1);%intial value
xbest=x;fbest=f(xbest);
fbest_store=fbest;x_store=[0;x;fbest];
display(['0:','xbest=[',num2str(xbest'),'],fbest=',num2str(fbest)])
for i=1:n %%%%%%%疊代部分%%%%%%%
d0=step/c;dir=rands(k,1);dir=dir/(eps+norm(dir));
xleft=x+dir*d0;fleft=f(xleft);
xright=x-dir*d0;fright=f(xright);
x=x-step*dir*sign(fleft-fright);f=f(x);
if f<fbest
xbest=x;fbest=f;
end
x_store=cat(2,x_store,[i;x;f]);fbest_store=[fbest_store;fbest];
display([num2str(i),':xbest=[',num2str(xbest'),'],fbest=',num2str(fbest)])
step=step*eta;
end
figure(1),clf(1),%%%%%%%數據顯示部分%%%%%%%
plot(x_store(1,:),x_store(end,:); 'r-o')hold on,
plot(x_store(1,:),fbest_store,'b-.');xlabel('iteration');ylabel('minimum value')
end
function y=f(x)%%%%%%%被最佳化的函式,這部分需要換用你自己的被最佳化函式%%%%%%%
y=norm(x);
end
實測效果
為了驗證算法的有效性,使用如下兩個典型測試函式驗證天牛須搜尋算法的收斂性。