遗传算法优化BP神经网络的权值的matlab程序源代码。

源代码在线查看: 用遗传算法优化bp神经网络的matlab编程实例.txt

软件大小: 129 K
上传用户: zhoulovely
关键词: matlab 算法优化 BP神经网络 程序
下载地址: 免注册下载 普通下载 VIP

相关代码

				程序一:GA训练BP权值的主函数
				function net=GABPNET(XX,YY)
				%--------------------------------------------------------------------------
				%  GABPNET.m
				%  使用遗传算法对BP网络权值阈值进行优化,再用BP算法训练网络
				%--------------------------------------------------------------------------
				%数据归一化预处理
				nntwarn off
				XX=premnmx(XX);
				YY=premnmx(YY);
				%创建网络
				net=newff(minmax(XX),[19,25,1],{'tansig','tansig','purelin'},'trainlm');
				%下面使用遗传算法对网络进行优化
				P=XX;
				T=YY;
				R=size(P,1);
				S2=size(T,1);
				S1=25;%隐含层节点数
				S=R*S1+S1*S2+S1+S2;%遗传算法编码长度
				aa=ones(S,1)*[-1,1];
				popu=50;%种群规模
				initPpp=initializega(popu,aa,'gabpEval');%初始化种群
				gen=100;%遗传代数
				%下面调用gaot工具箱,其中目标函数定义为gabpEval
				[x,endPop,bPop,trace]=ga(aa,'gabpEval',[],initPpp,[1e-6 1 1],'maxGenTerm',gen,...
				  'normGeomSelect',[0.09],['arithXover'],[2],'nonUnifMutation',[2 gen 3]);
				%绘收敛曲线图
				figure(1)
				plot(trace(:,1),1./trace(:,3),'r-');
				hold on
				plot(trace(:,1),1./trace(:,2),'b-');
				xlabel('Generation');
				ylabel('Sum-Squared Error');
				figure(2)
				plot(trace(:,1),trace(:,3),'r-');
				hold on
				plot(trace(:,1),trace(:,2),'b-');
				xlabel('Generation');
				ylabel('Fittness');
				%下面将初步得到的权值矩阵赋给尚未开始训练的BP网络
				[W1,B1,W2,B2,P,T,A1,A2,SE,val]=gadecod(x);
				net.LW{2,1}=W1;
				net.LW{3,2}=W2;
				net.b{2,1}=B1;
				net.b{3,1}=B2;
				XX=P;
				YY=T;
				%设置训练参数
				net.trainParam.show=1;
				net.trainParam.lr=1;
				net.trainParam.epochs=50;
				net.trainParam.goal=0.001;
				%训练网络
				net=train(net,XX,YY);
				
				
				程序二:适应值函数
				function [sol, val] = gabpEval(sol,options)
				% val - the fittness of this individual
				% sol - the individual, returned to allow for Lamarckian evolution
				% options - [current_generation]
				load data2
				nntwarn off
				XX=premnmx(XX);
				YY=premnmx(YY);
				P=XX;
				T=YY;
				R=size(P,1);
				S2=size(T,1);
				S1=25;%隐含层节点数
				S=R*S1+S1*S2+S1+S2;%遗传算法编码长度
				for i=1:S,
				   x(i)=sol(i);
				end;
				[W1, B1, W2, B2, P, T, A1, A2, SE, val]=gadecod(x);
				
				程序三:编解码函数
				function [W1, B1, W2, B2, P, T, A1, A2, SE, val]=gadecod(x)
				load data2
				nntwarn off
				XX=premnmx(XX);
				YY=premnmx(YY);
				P=XX;
				T=YY;
				R=size(P,1);
				S2=size(T,1);
				S1=25;%隐含层节点数
				S=R*S1+S1*S2+S1+S2;%遗传算法编码长度
				% 前R*S1个编码为W1
				for i=1:S1,
				    for k=1:R,
				      W1(i,k)=x(R*(i-1)+k);
				    end
				end
				% 接着的S1*S2个编码(即第R*S1个后的编码)为W2
				for i=1:S2,
				   for k=1:S1,
				      W2(i,k)=x(S1*(i-1)+k+R*S1);
				   end
				end
				% 接着的S1个编码(即第R*S1+S1*S2个后的编码)为B1
				for i=1:S1,
				   B1(i,1)=x((R*S1+S1*S2)+i);
				end
				% 接着的S2个编码(即第R*S1+S1*S2+S1个后的编码)为B2
				for i=1:S2,
				   B2(i,1)=x((R*S1+S1*S2+S1)+i);
				end
				% 计算S1与S2层的输出
				A1=tansig(W1*P,B1);
				A2=purelin(W2*A1,B2);
				% 计算误差平方和
				SE=sumsqr(T-A2);
				val=1/SE; % 遗传算法的适应值
				
				
				注意:上面的函数需要调用gaot工具箱,请从附件里下载!
				
				程序是没有问题的,不过我可能忘说了,就是程序里面有几处是需要修改,它们是
				程序一:
				net=newff(minmax(XX),[19,25,1],{'tansig','tansig','purelin'},'trainlm');
				程序二:
				S1=25;%隐含层节点数
				程序三:
				S1=25;%隐含层节点数			

相关资源