1、简单的遗传算法示例 作者:ryangiggsy 文章来源: 点击数:441 更新时间:2005-5-29 下面是关于简单遗传算法和简单 bp 网络的程序给大家看一下。 看你有用否?y=1/x: %N=input(设定隐含层神经元个数:n); %maxecho=input(最大训练回合数 ); %网络初始化 N=3;%可以自己设定 maxecho=1000; h=0.4;%学习速率 p=1:1:100; t=1./p; inw=randn(N,2);%输入- 隐含权值矩阵,单输入并加上了偏置一列 ins=zeros(N,1);%隐含得到的诱导矩阵 outg=zeros(N,1);%反向传到回至输
2、入的 delta 值 outs=zeros(N,1);%隐含输出的矩阵 outw=randn(1,N+1);%隐含输出权值矩阵 (加上一个偏置 ) outv=zeros(1,1);%输出得到的诱导矩阵 outy=zeros(1,1); backg=zeros(1,1);%反向传至隐含层的 delta 值 m=1; n=0; %开始样本训练 %for x=1:maxecho while(n0.2) m=0; for i=1:length(p) ins=inw*p(i);1; outs=1./(1+exp(-ins); outv=outw*outs;1; outy=1./(1+exp(-outv)
3、; backg=(t(i)-outy)*(outy.*(1-outy); outg=(outs.*(1-outs).*(outw(:,1:N)*backg); outw=outw+h*backg*outs;1; inw=inw+h*outg*p(i),1; m=m+(t(i)-outy)2; end n=n+1; end %开始样本测试 textp=1:0.1:100; textt=1./textp; textout=zeros(1,length(textp); error=zeros(1,length(textp); for i=1:length(textp) ins=inw*textp(i
4、);1; outs=1./(1+exp(-ins); outv=outw*outs;1; outy=1./(1+exp(-outv); textout(i)=outy; error(i)=abs(textt(i)-textout(i); end %测试完成后,观察输出,以及误差的变化 k=1:0.1:100; plot(k,textt,r,k,textout,b,k,error,g); xlabel(n); 可以比较清楚的看到一个基本 bp 算法的过程,当时自己比较得意的就是其中的矩阵相乘。速度很快,而且比较容易扩展,即任意多的输入,任意多的隐含层。到后来,我的人工智能老师(海龟,他的老师的老
5、师就是乍得)要求比较综合的算法,然后半个月里没日没夜的作小的 project,小小的一门人工智能课占据了几乎所有的课外时间,弄得随机过程差点没混过去。还记得圣诞节快乐的一天,那时候在老师家里聚会(project 完成后) ,半夜里就下雪了。杭州很少下雪 ._,美妙的回忆。在做小程序期间认识了高手冰彬鱼六代(南航毕业,很强的人,自编了一个 sga 工具箱,现在法国留学) ,还有动力论坛的海阔天空,当时真是景仰万分,他们所作的无人能够代替。在此呢,略微效仿一下啦,虽然不算什么,但我是新手啊。ga 优化神经网权值 bounds=ones(S,1)*-10 10; % 初始种群个数 num=60; p
6、op=initializega(num,bounds,fitness); % % clear all % % 用 GA 训练 BP 网络的权值、阈值 % % 开始计时 % tic, % % BP 网络初始化 % P,T,R,S1,S2,S=bpinit; % bounds=ones(S,1)*0.1 0.9; % % 初始种群个数 % num=60; % pop=initializega(num,bounds,fitness); % % 遗传代数 % % 遗传代数 gen=500; x endPop bPop trace=ga(bounds,fitness,pop,1e-6 1 1,maxGe
7、nTerm,gen,. normGeomSelect,0.09,arithXover,2,nonUnifMutation,2 gen 3); for i=1:S x(i)=endPop(1,i); end; sum=0; % 前 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*
8、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 层的输出 for i=1:100 x1=W1*P(i)+B1; A1=1./(1+exp(-x1); x2=W2*A1+B2; A2=1./(1+exp(-x2); % A1=logsig(W1*P(1:17,i),B1); % A2=logsig(W2*A1,B2); YY(i)=A2;
9、 % 计算误差平方和 % SE=; %sum=sum+sumsqr(T(i)-A2); end i=1:1:100 plot(i,YY(i),r+,i,T(i),b-); % W1 B1 W2 B2=gadecod(x); % 仿真结果 % TT=simuff(P,W1,B1,logsig,W2,B2,logsig) toc % 结束计时 file:fitness.m functionsol,eval=fitness(sol,options) P,T,R,S1,S2,S=bpinit; numv=size(sol,2)-1; x=sol(1:numv); eval=f(x); file:f.m
10、 function eval=f(sol) numv=size(sol,2); x=sol(1:numv); P,T,R,S1,S2,S=bpinit; %get the value of fitness % 前 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 个后的编码)为
11、 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 sum=0; SE=0; for i=1:100 x1=W1*P(i)+B1; A1=1./(1+exp(-x1); x2=W2*A1+B2; A2=1./(1+exp(-x2); % A1=logsig(W1*P(1:17,i),B1); % A2=logsig(W2*A1,B2); % 计算误差平方和 SE=sumsqr(T(i)-A
12、2); sum=sum+SE; end eval=10/sum; % 遗传算法的适应值 file:bpinit.m % BP 网络初始化 :给出网络的训练样本 P、T, % 输入、输出数及隐含神经元数 R,S2,S1 function P,T,R,S1,S2,S=bpinit; for i=1:100 P(i)=i; T(i)=1/P(i); end R,Q=size(P);%R=1 S2,Q=size(T);%S2=1 S1=3;%3 nu S=R*S1+S1*S2+S1+S2; % 遗传算法编码长度。这个是 copy 的。 这里做了一个所谓的军费预测(没题目找啊) file:xw_ga_a
13、nn_19%431 网络,总共 19 个权值阈值 clear all; clc; format long; Population_Size=200; String_Length=190; chromosome=round(rand(Population_Size,String_Length); chromosome_change=zeros(Population_Size,String_Length); flag=1; fitness_function=zeros(1,Population_Size); selected=zeros(1,Population_Size); generation
14、=1; maxsat=0; a1=zeros(3,5,10); a2=zeros(1,4,10); param1=zeros(3,5); param2=zeros(1,4); x_param1=zeros(3,5); y_param2=zeros(1,4); while(flag0) optimal_1=x_param1; optimal_2=y_param2; optimal_3=fitness_function(1,i); end if(fitness_function(1,i)0) %the first select sum_fit=sum_fit-fitness_function(1,
15、Population_Size); for i=1:Population_Size-1 x=round(randn(1)*1023); sum=round(sum_fit); rr=rem(x,sum); n=1;ba=1; partsum=0; while(partsumfile:xw_ga_ann_19_fitness function m=xw_ga_ann19_fitness( x_param1,y_param2) %-可以修改的参数-% sensorN=3;%神经元数 stopR=100;%训练停止回合数 h=1;%学习率 %-% %trainS=1:1:100; %trainD=1./trainS;%训练样本 trainS=1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 ; maxp=max(trainS); minp=min(trainS); for i=1:16 trainS(i)=(trainS(i)-minp)/(maxp-minp)*0.9+0.05;