赞
踩
果蝇算法(Fruit Fly Optimization Algorithm, FFOA)是一种启发式优化算法,受果蝇觅食行为的启发。将其应用于优化BP神经网络,主要是为了寻找BP神经网络中的最佳权重和偏置值。以下是一个基本的流程:
初始化:
果蝇算法迭代:
终止条件判断:
输出最终结果:
完整代码见: https://download.csdn.net/download/corn1949/89238870
MATLAB部分主程序如下:
- % 果蝇算法优化BP
- clc;close all;clear all;warning off;%清除变量
- rand('seed', 100);
- randn('seed', 100);
- format long g;
- addpath(genpath('mytoolbox'));
-
- global inputnumber hiddenumber outputnumber input_train output_train input_test P1 P2 T1 T2 inputps outputps indexM N;
- format long g;
- m=200;
- X=rand(m,3);
- y=sum(X,2)+5+rand(m,1);
- Outputdata=y';
- Inputdata=X';
- snumber=size(Outputdata,2);
-
- % index200=1:snumber;%顺序样本
- index200=randperm(snumber);%随机样本
- numberTest=50;%用于测试的样本个数
-
-
- indextrain=index200(1:end-numberTest);
- indextest=index200(end-numberTest+1:end);
- % 定义训练集
- P1=Inputdata(:,indextrain);
- T1=Outputdata(:,indextrain);
- % 定义测试集
- P2=Inputdata(:,indextest);
- T2=Outputdata(:,indextest);
- %设置训练集和测试集
-
- %% (2)训练数据归一化
- [input_train,inputps]=mapminmax(P1);
- [output_train,outputps]=mapminmax(T1);
- %测试数据归一化
- input_test=mapminmax('apply',P2,inputps);
- output_test=mapminmax('apply',T2,outputps);
-
-
- [k11,k12]=size(input_train);%计算维数
- inputnumber=k11;%输入维数
- hiddenumber=8;%隐含神经元数
- outputnumber=size(output_train,1);%输出维数;%输出维数
- S=[hiddenumber*inputnumber,outputnumber*hiddenumber,hiddenumber*1,outputnumber*1];
- indexM=S2indexMfun(S);
- N=sum(S);% 编码长度
-
- tic;
- [x0,ybptest]=mybpfun();
- bptime=toc;
-
-
- %设置果蝇算法参数
- maxgen=100; %迭代次数
- popsize=50; %种群规模
-
- lb=-3*ones(1,N);
- ub=3*ones(1,N);
-
- p0=x0;% 随机果蝇群位置
- vlb=-(ub-lb)/20;% 果蝇群体散布范围下限
- vub=(ub-lb)/20;% 果蝇群体散布范围上限
- foamat=genfoafun(popsize,N,p0,lb,ub,vlb,vub);% 初始化果蝇群
- Value = decodingfun(foamat,popsize);%解码染色体;% 果蝇群解码
- %找出此果蝇群体中味道浓度最高的果蝇
- [bestSmell,bestindex]=min(Value);
- %保留最佳味道浓度值与x,y坐标,此时果蝇群体利用视觉往该位置飞去
- bestfoamat=foamat(bestindex,:);
- Smellbest=bestSmell;
-
- %果蝇迭代寻优开始
- tracemat=zeros(maxgen,2);
- tic;
- wait_hand = waitbar(0,'running...', 'tag', 'TMWWaitbar');
- for gen=1:maxgen
- %附与果蝇个体利用嗅觉搜寻食物之随机方向与距离
- foamat=genfoafun(popsize,N,bestfoamat,lb,ub,vlb,vub);% 初始化果蝇群
- Value = decodingfun(foamat,popsize);% 果蝇群解码
-
- %找出此果蝇群体中味道浓度最高的果蝇(求极大值)
- [bestSmell,bestindex]=min(Value);
-
- %判断味道浓度是否优于前一迭代味道浓度,若是则保留最佳味道浓度值与x,y坐标,此时果蝇群体利用视觉往该位置飞去
- %% 计算最优
- [v1,indexmin]=min(Value);
- tracemat(gen,2)=mean(Value);
- %% 记录最优
- if gen==1
- bestfoamat=foamat(indexmin,:);
- bestvalue=v1;
- end
- if bestvalue>v1
- bestvalue=v1;
- bestfoamat=foamat(indexmin,:);
- end
-
- tracemat(gen,1)=bestvalue;% 保留最优
- waitbar(gen/maxgen,wait_hand);
- end
- delete(wait_hand);
- foabptime=toc;
-
-
-
-
程序结果如下:
果蝇算法优化得到的最优目标函数值
bestvalue =
0.132766053966035
果蝇算法优化得到的最优染色体
bestfoamat =
1 至 6 列
2.41906303571828 1.96871285079055 2.61149930019226 1.0987716283701 0.50651831657148 2.30022179464217
7 至 12 列
2.40939262295353 -2.15817219641748 -0.81596335313324 1.17787006833961 -1.0479477211566 1.92074952368336
13 至 18 列
-2.2627904810513 1.57156783691099 2.5837850176607 -1.50132352268534 0.392281233412555 -1.04567877515283
19 至 24 列
0.482163776536098 -1.06816891420559 1.60328577153001 1.26601018747221 -0.465348459480349 -1.11395016558292
25 至 30 列
0.637461335369384 -0.21950071447636 -0.281880338455025 -0.0237056040107121 -0.231490532076062 0.425958967900226
31 至 36 列
-0.576084198240168 -0.878239222480313 -2.06194275761603 -2.52010426430077 -1.82918650080529 -0.532035550214701
37 至 41 列
0.617972713082428 0.452208468660384 2.09101141725358 -2.93656000664297 -0.295414914627872
foabp运行时间(s)
foabptime =
4.1001338
bp运行时间(s)
bptime =
5.2011365
>>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。