此文章首次在simwe公開發(fā)表,屬于GreenSim團(tuán)隊(duì)原創(chuàng)作品,,轉(zhuǎn)載請注明! 更多原創(chuàng)程序,,請?jiān)L問GreenSim團(tuán)隊(duì)主頁http://blog.sina.com.cn/greensim
由于BP網(wǎng)絡(luò)的權(quán)值優(yōu)化是一個(gè)無約束優(yōu)化問題,,而且權(quán)值要采用實(shí)數(shù)編碼,所以直接利用Matlab遺傳算法工具箱,。以下貼出的代碼是為一個(gè)19輸入變量,,1個(gè)輸出變量情況下的非線性回歸而設(shè)計(jì)的,如果要應(yīng)用于其它情況,,只需改動編解碼函數(shù)即可,。
程序一:GA訓(xùn)練BP權(quán)值的主函數(shù) function net=GABPNET(XX,YY) %-------------------------------------------------------------------------- % GABPNET.m % 使用遺傳算法對BP網(wǎng)絡(luò)權(quán)值閾值進(jìn)行優(yōu)化,再用BP算法訓(xùn)練網(wǎng)絡(luò) %-------------------------------------------------------------------------- %數(shù)據(jù)歸一化預(yù)處理 nntwarn off XX=premnmx(XX); YY=premnmx(YY); %創(chuàng)建網(wǎng)絡(luò) net=newff(minmax(XX),[19,25,1],{'tansig','tansig','purelin'},'trainlm'); %下面使用遺傳算法對網(wǎng)絡(luò)進(jìn)行優(yōu)化 P=XX; T=YY; R=size(P,1); S2=size(T,1); S1=25;%隱含層節(jié)點(diǎn)數(shù) S=R*S1+S1*S2+S1+S2;%遺傳算法編碼長度 aa=ones(S,1)*[-1,1]; popu=50;%種群規(guī)模 initPpp=initializega(popu,aa,'gabpEval');%初始化種群 gen=100;%遺傳代數(shù) %下面調(diào)用gaot工具箱,,其中目標(biāo)函數(shù)定義為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'); %下面將初步得到的權(quán)值矩陣賦給尚未開始訓(xùn)練的BP網(wǎng)絡(luò) [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; %設(shè)置訓(xùn)練參數(shù) net.trainParam.show=1; net.trainParam.lr=1; net.trainParam.epochs=50; net.trainParam.goal=0.001; %訓(xùn)練網(wǎng)絡(luò) net=train(net,XX,YY);
程序二:適應(yīng)值函數(shù) 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;%隱含層節(jié)點(diǎn)數(shù) 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);
程序三:編解碼函數(shù) 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;%隱含層節(jié)點(diǎn)數(shù) S=R*S1+S1*S2+S1+S2;%遺傳算法編碼長度 % 前R*S1個(gè)編碼為W1 for i=1:S1, for k=1:R, W1(i,k)=x(R*(i-1)+k); end end % 接著的S1*S2個(gè)編碼(即第R*S1個(gè)后的編碼)為W2 for i=1:S2, for k=1:S1, W2(i,k)=x(S1*(i-1)+k+R*S1); end end % 接著的S1個(gè)編碼(即第R*S1+S1*S2個(gè)后的編碼)為B1 for i=1:S1, B1(i,1)=x((R*S1+S1*S2)+i); end % 接著的S2個(gè)編碼(即第R*S1+S1*S2+S1個(gè)后的編碼)為B2 for i=1:S2, B2(i,1)=x((R*S1+S1*S2+S1)+i); end % 計(jì)算S1與S2層的輸出 A1=tansig(W1*P,B1); A2=purelin(W2*A1,B2); % 計(jì)算誤差平方和 SE=sumsqr(T-A2); val=1/SE; % 遺傳算法的適應(yīng)值
本文來自CSDN博客,,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/animaldww/archive/2010/08/02/5780582.aspx
|