天牛须搜索算法优化神经网络_matlab代码

BAS原理

天牛须搜索算法(beetle antennae search,BAS)算法是2017年提出的一种 基于天牛觅食原理的适用于多目标函数优化的新技术,其生物原理为:当天牛觅食时,其并不知道食物在哪里,而是根据食物气味的强弱来觅食。天牛有两只长触角,如果左边触角收到的气味强度比右边大,那下一步天牛就会向左边飞,反之则向右飞。依据这一简单原理天牛就可以有效找到食物。与遗传算法、粒子群算法等类似,BAS 不需要知道函数的具体形式以及梯度信息,就可以自动实现寻优过程,且其个体仅为一个,寻优速度显著提高。
算法步骤如下:
(1)创建天牛须朝向的随机向量且做归一化处理
在这里插入图片描述

式中: rand()为随机函数; ||rands()||表示空间维度。
(2)创建天牛左右须空间坐标
天牛须搜索算法优化神经网络_matlab代码_第1张图片

(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

天牛须搜索算法优化神经网络_matlab代码_第2张图片

  • 运算量小,收敛非常快具有全局寻优能力
  • 代码好理解核心代码较短,容易实现

参考文献:
[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.

你可能感兴趣的:(优化算法,神经网络,其它)