BAS:天牛须搜索智能优化算法
一、BAS优化算法简介
天牛须搜索(Beetle Antennae Search-BAS),也叫甲壳虫须搜索,是2017年提出的一种高效的智能优化算法。类似于遗传算法、粒子群算法、模拟退火等智能优化算法,天牛须搜索不需要知道函数的具体形式,不要虚梯度信息,就可以实现高效寻优。相比于粒子群算法,天牛须搜索只只要一个个体,即一个天牛,运算量大大降低。
二、原理及代码实现
1.仿生原理
天牛须搜索时受到天牛觅食原理启发而开发的算法。
生物原理:当天牛觅食时,天牛并不知道食物在哪,而是根据食物气味的强弱来觅食。天牛有俩只长触角,如果左边触角收到的气味强度比右边大,那下一步天牛就往左飞,否则就往右飞。根据这一简单原理天牛就可以有效找到食物。
天牛须搜索得来的启发:食物的气味就相当于一个函数,这个函数在三维空间每个点值都不同,天牛两个须可以采集自身附近两点的气味值,天牛的目的是找到全局气味值最大的点。仿照天牛的行为,我们就可以高效的进行函数寻优。
2.算法
天牛在三维空间运动,而天牛须搜索需要对任意维函数都有效才可以。因而,天牛须搜索是对天牛生物行为在任意维空间的推广。采用如下的简化模型假设描述天牛:
- 天牛左右两须位于质心两边。
- 天牛步长step与两须之间距离d0的比是个固定常数,即step=c*d0,其中c是常数。即,大天牛(两须距离长)走大步,小天牛走小步。
- 天牛飞到下一步后,头的朝向是随机的。
3.建模:(n维空间函数f最小化)
第一步:对一个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,求取左右两须的值:felft=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是归一化函数)
循环迭代:
dir=rands(n,1);dir=dir/norm(dir);%须的方向
xl=x+d0*dir/2;xr=x-d0*dir/2;%须的坐标
felft=f(xl);fright=f(xr);%须的气味强度
x=x-step*dir*sign(fleft-fright)。%下一步位置
关于步长:
两种推荐:
- 每步迭代中采用step=eta*step,其中eta在0,1之间靠近1,通常可取eta=0.95;
- 引入新变量temp和最终分辨率step0,temp=eta*temp,step=temp+step0.
关于初始步长:初始步长可以尽可能大,最好与自变量最大长度相当。
4.程序实现
function bas() [3]
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
5.算法特点
- 运算量非常小,收敛非常快;
- 具有全局寻优能力;
- 代码非常短,容易实现。