天牛须搜索算法(beetle antennae search,BAS)算法是2017年提出的一种 基于天牛觅食原理的适用于多目标函数优化的新技术,其生物原理为:当天牛觅食时,其并不知道食物在哪里,而是根据食物气味的强弱来觅食。天牛有两只长触角,如果左边触角收到的气味强度比右边大,那下一步天牛就会向左边飞,反之则向右飞。依据这一简单原理天牛就可以有效找到食物。与遗传算法、粒子群算法等类似,BAS 不需要知道函数的具体形式以及梯度信息,就可以自动实现寻优过程,且其个体仅为一个,寻优速度显著提高。
算法步骤如下:
(1)创建天牛须朝向的随机向量且做归一化处理
式中: rand()为随机函数; ||rands()||表示空间维度。
(2)创建天牛左右须空间坐标
(3)根据适应度函数判断左右须气味强度,即f(x_l)和f(x_r)的强度, 函数f()为适应度函数。
(4)迭代更新天牛的位置
式中:
表示在第 i次迭代时的步长因子;sign()为符号函数。
核心代码
dir=rands(k,1);
dir=dir/(eps+norm(dir)); %须的方向
xleft=x+dir*d0/2; % 须的坐标
xright=x-dir*d0/2; % 须的坐标
x=x-step*dir*sign(fleft-fright); % 下一次迭代位置
完整代码
%% 用天牛须算法来优化BP的权值和阈值,样本60个,其中每个样本具有401个特征值;NIR为样本的光谱数据,octane为60*1的辛烷值数据
%% 清空环境变量
clear;
close;
clc
tic
%% 加载数据
load spectra_data.mat
% 随机产生训练集和测试集
temp=randperm(size(NIR,1));
%训练集——50个样本
P=NIR(temp(1:50),:)';
T=octane(temp(1:50),:)';
%测试集——10个样本
P_test=NIR(temp(51:end),:)';
T_test=octane(temp(51:end),:)';
N=size(P_test,2);
M=size(P,2);
%% 归一化
[P, ps_input] = mapminmax(P,0,1);%p_train归一化处理,范围为[0,1],默认情况下为[-1,1]
P_test = mapminmax('apply',P_test,ps_input);%对P_test采用相同的映射
[T, ps_output] = mapminmax(T,0,1);
%%
inputnum=size(P,1);
outputnum=size(T,1);
hiddennum=9;%初始隐含层神经元个数
%% 创建网络
net=newff(P,T,hiddennum);
net.trainParam.epochs = 1000;
net.trainParam.goal = 1e-3;
net.trainParam.lr = 0.01;
%% 天牛须算法初始化
eta=0.8;
c=5;%步长与初始距离之间的关系
step=30;%初始步长
n=100;%迭代次数
k=inputnum*hiddennum+outputnum*hiddennum+hiddennum+outputnum;
x=rands(k,1);
bestX=x;
bestY=fitness(bestX,inputnum,hiddennum,outputnum,net,P,T);
fbest_store=bestY;
x_store=[0;x;bestY];
display(['0:','xbest=[',num2str(bestX'),'],fbest=',num2str(bestY)])
%% 迭代部分
for i=1:n
d0=step/c;
dir=rands(k,1);
dir=dir/(eps+norm(dir));
xleft=x+dir*d0/2;
fleft=fitness(xleft,inputnum,hiddennum,outputnum,net,P,T);
xright=x-dir*d0/2;
fright=fitness(xright,inputnum,hiddennum,outputnum,net,P,T);
x=x-step*dir*sign(fleft-fright);
y=fitness(x,inputnum,hiddennum,outputnum,net,P,T);
if y<bestY
bestX=x;
bestY=y;
end
if y<0.001
bestX=x;
bestY=y;
end
x_store=cat(2,x_store,[i;x;y]);
fbest_store=[fbest_store;bestY];
step=step*eta;
display([num2str(i),':xbest=[',num2str(bestX'),'],fbest=',num2str(bestY)])
end
%% 可视化
figure(1)
%plot(x_store(1,:),x_store(end,:),'r-o')
hold on,
plot(x_store(1,:),fbest_store,'b-.')
xlabel('Iteration')
ylabel('BestFit')
toc
参考文献:
[1] JIANG X Y,LI S. BAS: beetle antennae search algorithm for optimization problems [ J ]. arXiv preprint arXiv: 1710.10724,2017.
[2] JIANG X Y,LI S. Beetle antennae search without parameter tuning( BAS-WPT) for multi-objective optimization[J]. arXiv preprint arXiv: 1711. 02395,2017.
[3] 王甜甜, 刘强. 基于BAS-BP模型的风暴潮灾害损失预测[J]. 海洋环境科学, 2018, 37(3):457-463.