根据他人的代码,稍微改进后,并附上个人对代码的理解情况。采用遗传算法(GA)对BP网络的权值进行优化。其思路如下:(1)根据BP的输入值和目标值,确定好BP网络的输入层单元数、隐层单元数(本例只处理1个隐层的情况;多个隐层的方法类似,主要是在构造GA种群基因时有所差异)、以及输出层的单元个数。(2)根据BP网络的各层单元数来确定其输入层与隐层之间的权值w12,和隐层输出值b1,以及隐层到输出层的权值w23,和输出层输出b2。这四个值各个元素的组合就组成了一个基因,即根据他们来确定基因长度。这一步非常重要!可根据以下代码进行理解。%权值矩阵分配%输入到隐层用w_he表示,3x4,3表示输入层个数,4表示输出层个数%w_he=[chrom(i,1)chrom(i,5)chrom(i,9)chrom(i,13);%chrom(i,2)chrom(i,6)chrom(i,10)chrom(i,14);%chrom(i,3)chrom(i,7)chrom(i,11)chrom(i,15)];%以下for循环的作用是将某个基因,分别转换为bp网络所对应的权值或输出值。%其中chrom(i,:)表示第i个基因的所有元素%in_num表述输入层单元个数%n表示基本的元素个数%w_he表示输入层到输出层权值;w_out表示因此到输出层的权值%b_he表示隐层输出向量;b_out表示输出层的输出向量。forj=1:nw_he(:,j)=chrom(i,(j-1)*(in_num+1)+1:j*(in_num+1)-1);w_out(j)=chrom(i,(in_num+1)*n+j);b_he(j)=chrom(i,(in_num+1)*j);endb_out=chrom(i,len);%隐层到输出层用w_out表示,4x1%w_out=[chrom(i,17)chrom(i,18)chrom(i,19)chrom(i,20)];%b_he=[chrom(i,4)chrom(i,8)chrom(i,12)chrom(i,16)];%b_out=chrom(i,21);(3)确定好权值与基因的对应关系后。利用GA对BP网络权值进行优化,也即寻找GA中最佳的适应度的基因。适应度函数则是利用BP网络构造,即把基因转换成bp权值,再输入样本值查看其误差大小。(4)寻找最优基因就是GA的基本步骤,选择、交叉、变异,这里就不详述了。下面附上代码。如果看懂了代码,请根据自己的需要进行调整,以达到最佳效果。按照GA流程来看代码,真的很简单!通过调用此函数即可实现其训练BP_GA(p,aim,n)functionnet=BP_GA(p,aim,n)%p,训练样本列向量矩阵%aim,目标值列向量%n隐层单元个数%源程序为仿真《西北师范大学学报》的遗传主程序%计算的染色体均方误差fitness=8/sum(error.^2)%经过简单改造%ticPopsize=100;%种群规模P_mutation=0.1;%变异系数P_cross=0.6;%交叉系数m=2;%权值和阈值的初始化范围%p=[00001111;%00110011;%10101010];%输入值%aim=[01101001]';%输出值num=size(p,1)*n+2*n+1;chrom=2*m.*rand(Popsize,num)-m;%产生初始种群[40x21]矩阵,范围【-m,m】%temchrom=zeros(size(chrom));ecope=100;%迭代次数currentbest=zeros(ecope,num);%每一步迭代的最优数组currentbest_value=zeros(ecope,1);fitness_gene=fitness(chrom,p,aim,n);%计算的染色体均方误差fitness=8/sum(error.^2)[c_valuec_order]=max(fitness_gene);fork=1:ecope%保留当前最好染色体[c_valuec_order]=max(fitness_gene);currentbest(k,:)=chrom(c_order,:);currentbest_value(k)=c_value;%选择过程fit=cumsum(fitness_gene)/sum(fitness_gene);N=Popsize;s=select(fit,N);temchrom=chrom(s,:);%将选择的储存到临时变量中%交叉P=rand(1,N);prob=find(PP_cross);crosschrom=temchrom(prob,:);%从临时变量中选择部分进行交叉crosschrom=cross_over(crosschrom);temchrom(prob,:)=crosschrom;%临时变量中只有部分进行了交叉%变异temchrom=mutation(temchrom,P_mutation);chrom=temchrom;%计算交叉变异之后的染色体的适应度fitness_gene=fitness(chrom,p,aim,n);fit=cumsum(fitness_gene)/sum(fitness_gene);N=Popsize;s=select(fit,N-1);[s_values_order]=max(fitness_gene);ifs_valuecurrentbest_value(k)%精因选择chrom=[chrom(s,:);currentbest(k,:)];fitness_gene=[fitness_gene(s);currentbest_value(k)];elses=[ss_order(1)];chrom=chrom(s,:);fitness_gene=fitness_gene(s);endendi=100;in_num=size(p,1);forj=1:nw_he(:,j)=currentbest(i,(j-1)*(in_num+1)+1:j*(in_num+1)-1);w_out(j)=currentbest(i,(in_num+1)*n+j);b_he(j)=currentbest(i,(in_num+1)*j);endsamples=size(p,2);b_out=currentbest(i,num);out=zeros(size(aim));forj=1:size(p,2)fors=1:n%隐层的输入与输出in_he(s)=sum(w_he(:,s).*p(:,j))+b_he(s);%隐层的输入out_he(s)=(1-exp(in_he(s)))/(1+exp(in_he(s)));%隐层的输出end%输出层的输入与输出in_out=w_out*out_he'+b_out;out_out=1/(1+exp(-in_out));out(j)=out_out;endnet=currentbest(ecope,:);%figure%plot(aim,'-o')%holdon%plot(out,'r-*')end%图表显示%i=1:k;%y=1./currentbest_value(1:k,:);%%plot(i,y,'r:');%title('sumrootmeansquareerror');%%toc%y(k)functiony=fitness(chrom,p,aim,n)%globalP_crossP_mutation%chrom,基因种群矩阵%p,样本矩阵%aim,目标矩阵,暂时只支持向量,即网络输出层只有一个单元%n,隐层的单元个数[Popsizelen]=size(chrom);[in_num,samples]=size(p);%样本数fitness_gene=zeros(Popsize,1);in_he=zeros(n,1);out_he=zeros(n,1);in_out=0;out_out=0;w_he=zeros(in_num,n);%3x4w_out=zeros(1,n);%1x4b_he=zeros(1,n);%b_out=zeros(1,1);%权值和阈值的分配设置fori=1:Popsize%权值矩阵分配%输入到隐层用w_he表示,3x4,3表示输入层个数,4表示输出层个数%w_he=[chrom(i,1)chrom(i,5)chrom(i,9)chrom(i,13);%chrom(i,2)chrom(i,6)chrom(i,10)chrom(i,14);%chrom(i,3)chrom(i,7)chrom(i,11)chrom(i,15)];forj=1:nw_he(:,j)=chrom(i,(j-1)*(in_num+1)+1:j*(in_num+1)-1);w_out(j)=chrom(i,(in_num+1)*n+j);b_he(j)=chrom(i,(in_num+1)*j);endb_out=chrom(i,len);%隐层到输出层用w_out表示,4x1%w_out=[chrom(i,17)chrom(i,18)chrom(i,19)chrom(i,20)];%b_he=[chrom(i,4)chrom(i,8)chrom(i,12)chrom(i,16)];%b_out=chrom(i,21);error=zeros(samples,1);forj=1:samplesfors=1:n%隐层的输入与输出in_he(s)=sum(w_he(:,s).*p(:,j))+b_he(s);%隐层的输入out_he(s)=(1-exp(in_he(s)))/(1+exp(in_he(s)));%隐层的输出end%输出层的输入与输出in_out=w_out*out_he+b_out;out_out=1/(1+exp(-in_out));%计算各个样本误差error(j)=aim(j)-out_out;endfitness_gene(i)=samples/sum(error.^2);%染色体均方误差%误差越小,fitness_gene越大endy=fitness_gene;functiony=cross_over(chrom)%[m,n]=size(chrom);%temchrom=zeros(1,n);%fori=1:2:m-1%%c=rand(1);%%temchrom=chrom(i,:);%%chrom(i,:)=c.*chrom(i,:)+(1-c).*chrom(i+1,:);%%chrom(i+1,:)=(1-c).*temchrom+c.*chrom(i+1,:);%c=rand(1);%temchrom=chrom(i,:);%chrom(i,:)=c.*chrom(i,:)+(1-c).*chrom(i+1,:);%chrom(i+1,:)=(1-c).*temchrom+c.*chrom(i+1,:);%end%y=chrom;[m,n]=size(chrom);%两点交叉fori=1:2:m-1c=1+fix(n*rand(1,2));c_a=min(c);c_b=max(c);%第i个与第i+1个交叉temchrom=chrom(i,c_a:c_b);chrom(i,c_a:c_b)=chrom(i+1,c_a:c_b);chrom(i+1,c_a:c_b)=temchrom;endy=chrom;functiony=mutation(chrom,P_mutation,m)%均匀变异ifnargin==1P_mutation=0.1;m=100;endifnargin==2m=100;end%P=rand(Popsize,1);%n=find(PP_mutation);%len=length(n);%fori=1:len%d=fix(9*rand(1))+1;%x=4*rand(1)-2;%chrom(n(i),d)=x;%%endP=ran