BP算法的C语言实现.doc_第1页
BP算法的C语言实现.doc_第2页
BP算法的C语言实现.doc_第3页
BP算法的C语言实现.doc_第4页
BP算法的C语言实现.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

终于搞定了,输出结果完全正确,运行训练次数竟然有几万次!汗!(适合普通BP算法和改进型BP带缓冲项算法)/训练样本大概是这些(每组前三个为in样本数据 后面为out结果):/0 0 0 0.9/0 0 1 0.1/0 1 0 0.1/0 1 1 0.9/1 0 0 0.1/1 0 1 0.9/1 1 0 0.9/1 1 1 0.1测试样本可以自己试试这些数据/0 0.1 0.9(期望:0.1)/0.9 0.9 0.1(期望0.9)-分割线-#include stdlib.h#include math.h#include conio.h#include stdio.h#include time.h#define N 8 /*学习样本个数(测试样本个数)*/#define IN 3 /*输入层神经元数目*/#define HN 2 /*隐层神经元数目*/#define ON 1 /*输出层神经元数目*/float PIN; /*单个样本输入数据*/float TON; /*单个样本教师数据*/float WHNIN; /*输入层至隐层权值*/float VONHN; /*隐层至输出层权值*/float XHN; /*隐层的输入*/float YON; /*输出层的输入*/float HHN; /*隐层的输出*/float OON; /*输出层的输出*/float YU_HNHN; /*隐层的阈值*/float YU_ONON; /*输出层的阈值*/float err_mN; /*第m个样本的总误差*/float a; /*输出层至隐层学习效率*/float b; /*隐层至输入层学习效率*/float alpha; /*/动量因子,改进型bp算法使用*/float d_errON;/*k*/float e_errHN;/*j*/FILE *fp;/*定义一个放学习样本的结构*/struct float inputIN;float teachON; Study_DataN;/*定义一个放测试样本的结构*/struct float inputIN;float expectON; Test_DataN;/*改进型bp算法用来保存每次计算的权值*/float old_WHNIN;float old_VONHN;int Start_Show()clrscr();printf(n * n);printf( * Welcome to use *n);printf( * this program of *n);printf( * calculating the BP *n);printf( * model! *n);printf( * Happy every day! *n);printf( *n);printf(nnBefore starting,please read the follows carefully:nn);printf( The program of BP can study itself for no more than 200000 times.nAnd surpassing the number,the program will be ended by itself innpreventing running infinitely because of error!n);printf(nnn);printf(Now press any key to start.n);getch();clrscr();int End_Show()printf(nn-n);printf(The program has reached the end successfully!nnPress any key to exit!nn);printf(n *n);printf( * This is the end *n);printf( * of the program which*n);printf( * can calculate the BP*n);printf( * model! *n);printf( *n);printf( * Thanks for using! *n);printf( * Happy every day! *n);printf( *n);getch();exit(0);/*读取训练样本*/GetTrainingData()int i,j,m;float datr;if(fp=fopen(sample.txt,r)=NULL) printf(Cannot open file strike any key exit!); getch(); exit(1); for(i=0;iIN-1) Study_Datai.teachj-IN=datr; else Study_Datai.inputj=datr;/*printf(nthe Study_Data%d.input%d=%fn %f,i,j,Study_Datai.inputj,datr);getch();*/*use to check the loaded training datas*/ j+; fclose(fp);printf(nThere are %d sample datas that have been loaded successfully!n,N*(IN+ON);printf(nShow the data which has been loaded as follows:n);for(m=0;mN;m+) for(i=0;iIN;i+) printf(Study_Data%d.input%d=%f ,m,i,Study_Datam.inputi); for(j=0;jON;j+) printf(Study_Data%d.teach%d=%f ,m,j,Study_Datam.teachj); printf(nnnPress any key to begin Study.);getch();clrscr();return 1;/*初始化权、阈值子程序*/initial()int i;int ii;int j;int jj;int k;int kk;printf(nRandsom Weight value and Bias value as follow:n);srand(time(NULL);/*随机函数种子*/printf(nWeight Value:n);for(i=0;iHN;i+) for(j=0;jIN;j+) Wij=(float)(rand()/32767.0)*2-1)/2);/*初始化输入层到隐层的权值,随机模拟0.5-0.5 */ printf(nw%d%d=%f,i,j,Wij); for(ii=0;iiON;ii+) for(jj=0;jjHN;jj+) Viijj= (float)(rand()/32767.0)*2-1)/2);/*初始化隐层到输出层的权值,随机模拟0.5-0.5 */ printf(nV%d%d=%f,ii,jj,Viijj); printf(nnBias Value:n);for(k=0;kHN;k+) YU_HNk = 1.0;/*隐层阈值初始化 ,-0.01 0.01 之间*/ printf(nYU_HN%d=%f,k,YU_HNk); for(kk=0;kkON;kk+) YU_ONkk = 1.0;/*输出层阈值初始化 ,-0.01 0.01 之间*/ printf(nYU_ON%d=%fn,kk,YU_ONkk); printf(nnnnnPress any key to start culculating.:n);getch();clrscr();printf(Please wait.);return 1;/*第m个学习样本输入子程序*/input_P(int m) int i,j; for(i=0;iIN;i+) Pi=Study_Datam.inputi; return 1;/*第m个样本教师信号子程序*/input_T(int m)int k;for(k=0;kON;k+) Tk=Study_Datam.teachk;return 1;/*求净输入,输出*/IN_OUT()float sigma1,sigma2;int i,j,ii,jj;for(i=0;iHN;i+) sigma1=0.0; for(j=0;jIN;j+) sigma1+=Wij*Pj;/*求隐层内积*/ Xi=sigma1+YU_HNi; Hi=1.0/(1.0+exp(-Xi); for(ii=0;iiON;ii+) sigma2=0.0; for(jj=0;jjHN;jj+) sigma2+=Viijj*Hjj; Yii=sigma2+YU_ONii; Oii=1.0/(1.0+exp(-Yii); return 1;/*误差分析*/*k*/int Err_O_H(int m)int k;float abs_errON;float sqr_err=0.0;for (k=0;kON;k+) abs_errk=Tk-Ok; sqr_err+=(abs_errk)*(abs_errk); d_errk=abs_errk*Ok*(1.0-Ok); err_mm=sqr_err/2; return 1;/*j*/int Err_H_I()int j,k;float sigma;for(j=0;jHN;j+) sigma=0.0; for(k=0;kON;k+) sigma+=d_errk*Vkj; e_errj=sigma*Hj*(1-Hj); return 1;/*总误差*/float Err_Sum()int m;float total_err=0.0;for(m=0;mN;m+) total_err+=err_mm;return total_err;/*新旧权值更新量交替-改进型Bp算法*/saveWV()int i;int ii;int j;int jj;for(i=0;iHN;i+) for(j=0;jIN;j+) old_Wij =b*e_erri*Pj; for(ii=0;iiON;ii+) for(jj=0;jjHN;jj+) old_Viijj =a*d_errii*Hjj; return 1;/*更新权值,阈值*/*输出层*/int Delta_O_H(int n,int study)int k,j;if(n=1)|(study=1) for (k=0;kON;k+) for (j=0;jHN;j+) Vkj=Vkj+a*d_errk*Hj; YU_ONk+=a*d_errk; else for (k=0;kON;k+) for (j=0;jHN;j+) Vkj=Vkj+(1.0-alpha)*a*d_errk*Hj+alpha*old_Vkj; YU_ONk+=a*d_errk; return 1;/*隐层*/Delta_H_I(int n,int study)int i,j;if(n=1)|(study=1) for (j=0;jHN;j+) for (i=0;iIN;i+) Wji=Wji+b*e_errj*Pi; YU_HNj+=b*e_errj; else for(j=0;jHN;j+) for(i=0;iIN;i+) Wji=Wji+(1.0-alpha)*b*e_errj*Pi+alpha*old_Wji; YU_HNj+=b*e_errj; return 1;/*保存更新*/void savequan() int i,j,k; int ii,jj,kk; /*save weight*/ if(fp=fopen(weight.txt,a)=NULL) printf(Cannot open file strike any key exit!); getch(); exit(1); for(i=0;iHN;i+) for(j=0;jIN;j+) fprintf(fp,W%d%d=%fn,i,j,Wij); fprintf(fp,n); for(ii=0;iiON;ii+) for(jj=0;jjHN;jj+) fprintf(fp,V%d%d=%fn,ii,jj,Viijj); fclose(fp); printf(nThe result of weight.txt(quanzhi) has been saved successfully!); /*save limit*/ if(fp=fopen(limit.txt,a)=NULL) printf(Cannot open file strike any key exit!); getch(); exit(1); for(k=0;kON;k+) fprintf(fp,YU_ON%d=%fn,k,YU_ONk); for(kk=0;kkHN;kk+) fprintf(fp,YU_HN%d=%fn,kk,YU_HNkk); fclose(fp); printf(nThe result of limit.txt(yuzhi) has been saved successfully!nnnnnPress any key to Test.); getch(); clrscr();/*读取测试样本*/GetTestData()int i,j,m;float datr;if(fp=fopen(test.txt,r)=NULL) printf(Cannot open file strike any key exit!); getch(); exit(1); for(i=0;iIN-1) Test_Datai.expectj-IN=datr; else Test_Datai.inputj=datr; j+; fclose(fp);printf(nThere are %d test datas that have been loaded successfully!n,N*(IN+ON);printf(nShow the data which has been loaded as follows:n);for(m=0;mN;m+) for(i=0;iIN;i+) printf(Test_Data%d.input%d=%f ,m,i,Test_Datam.inputi); for(j=0;jON;j+) printf(Test_Data%d.expec%d=%f ,m,j,Test_Datam.expectj); printf(nnnnPress any key to culculating.);getch();clrscr();return 1;/*样本测试及结果*/Test()int i,j,k,m;float net1HN,net2ON,H_netHN,O_netON;for(m=0;mN;m+) for(i=0;iHN;i+) net1i=0.0; for(j=0;jIN;j+) net1i+=Test_Datam.inputj*Wij; net1i=net1i+YU_HNi; H_neti=1.0/(1.0+exp(-net1i); for(k=0;kON;k+) net2k=0.0; for(j=0;jHN;j+) net2k+=H_netj*Vkj; net2k=net2k+YU_ONk; O_netk=1.0/(1.0+exp(-net2k); printf(nTest result%d=%fn,m,O_netk); /*直接输入测试*/OnlineSet()char s;printf(nnnnIf you want to test the data you inputted now,press Y(or other button except Q);nOr press Q to quit Test!n);while(1) s=getch(); switch(s) case Q: clrscr(); End_Show(); default: Online_Test();break; printf(nTo continue testing press Y(or other button except Q);nOr press Q to quit Test!n); getch();Online_Test()int i,j,k;float datr,TSIN;float net1HN,net2ON,H_netHN,O_netON;printf(nPlease Input %d test datas with a space between each two datas:n,IN);for(i=0;iIN;i+) scanf(%f,&datr); TSi=datr; for(i=0;iHN;i+) net1i=0.0; for(j=0;jIN;j+) net1i+=TSj*Wij; net1i=net1i+YU_HNi; H_neti

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论