还剩9页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
神经网络BP算法C程序文件输入输出目录为F:\BP\训练样本文件名训练样本.___值为11-11-110101输出文件名为阈值.___ 权值.___=========================#includestdlib.h#include__th.h#includeconio.h#includestdio.h#defineN2/*/学习样本个数*/#defineIN3/*/输入层神经元数目*/#defineHN3/*/隐层神经元数目*/#defineON2/*/输出层神经元数目*/#defineZ20/*旧权值保存每次study的权值都保存下来*/doubleP[IN];/*单个样本输入数据*/doubleT[ON];/*单个样本输出数据*/doubleW[HN][IN];/*/输入层至隐层权值*/doubleV[ON][HN];/*/隐层至输出层权值*/doubleX[HN];/*/隐层的输入*/doubleY[ON];/*/输出层的输入*/doubleH[HN];/*/隐层的输出*/doubleO[ON];/*/输出层的输出*/doubleYU_HN[HN];/*/隐层的阈值*/doubleYU_ON[ON];/*/输出层的阈值*/doubleerrm[N];/*/第m个样本的总误差*/doublea;/*/输出层至隐层的学习效率*/doubleb;/*/隐层至输入层学习效率*/doublealpha; /*/动量因子,改进型bp算法使用*/doublederr[ON];FILE*fp;/*定义一个放学习样本的结构*/struct{doubleinput[IN];doubleteach[ON];}Study_Data[N];/*改进型bp算法用来保存每次计算的权值*/struct{doubleold_W[HN][IN];doubleold_V[ON][HN];}Old_WV[Z];显示开始界面intStart_Show{clrscr;printf\n ***********************\n;printf * Welcometouse *\n;printf * thisprogramof *\n;printf * calculatingtheBP*\n;printf * model! *\n;printf * Happyeveryday! *\n;printf ***********************\n;printf\n\nBeforestartingpleasereadthefollowscarefully:\n\n;printf
1.PleaseensurethePathofthe训练样本.___xunlianyangben.___is\ncorrectlikeF:\BP\训练样本.___!\n;printf
2.Thecalculatingresultswillbes__edinthePathofF:\\BP\\!\n;printf
3.Theprogramwillload10dataswhenrunningfromF:\\BP\\训练样本.___!\n;printf
4.TheprogramofBPcanstudyitselffornomorethan30000times.\nAndsurpassingthenumbertheprogramwillbeendedbyitselfin\npreventingrunninginfinitelybecauseoferror!\n;printf\n\n\n;printfNowpressanykeytostart...\n;getch;getch;clrscr;}显示结束界面intEnd_Show{printf\n\n---------------------------------------------------\n;printfTheprogramhasreachedtheendsuc__ssfully!\n\nPressanykeytoexit!\n\n;printf\n ***********************\n;printf * Thisistheend *\n;printf *oftheprogramwhich*\n;printf *cancalculatetheBP*\n;printf * model! *\n;printf ***********************\n;printf * Thanksforusing! *\n;printf * Happyeveryday! *\n;printf ***********************\n;getch;exit0;}获取训练样本GetTrainingData /*OK*/{intmij; intdatr;iffp=fopenf:\\bp\\训练样本.___r==NULL /*读取训练样本*/ { printfCannotopenfileandstrikeanykeyexit!; getch; exit1; }m=0;i=0;j=0;whilefscanffp%ddatr!=EOF {j++; ifj=N*IN/*N为学习样本个数;IN为输入层神经元数目*/ {ifiIN { Study_Data[m].input[i]=datr; /*printf\ntheStudy_Datat[%d].input[%d]=%f\nmiStudy_Data[m].input[i];getch;*/ /*usetochecktheloadedtrainingdatas*/ } ifm==N-1i==IN-1 { m=0; i=-1; } ifi==IN-1 { m++; i=-1; } } elseifN*INJJ=N*IN+ON {ifiON {Study_Data[m].teach[i]=datr; /*printf\nTheStudy_Data[%d].teach[%d]=%fmiStudy_Data[m].teach[i];getch;*/ /*usetochecktheloadedtrainingdatas*/ } ifm==N-1i==ON-1 printf\n; ifi==ON-1 {m++; i=-1; } } i++; }fclosefp;printf\nThereare[%d]datatsthath__ebeenloadedsuc__ssfully!\nj;/*showthedatawhichhasbeenloaded!*/printf\nShowthedatawhichhasbeenloadedasfollows:\n;form=0;mN;M++ {fori=0;iIN;I++ {printf\nStudy_Data[%d].input[%d]=%fmiStudy_Data[m].input[i]; } forj=0;jON;J++ {printf\nStudy_Data[%d].teach[%d]=%fmjStudy_Data[m].teach[j]; } }printf\n\nPressanykeytostartcalculating...;getch; return1;}/*///////////////////////////////////*//*初始化权、阈值子程序*//*///////////////////////////////////*/initial{inti; intii; intj; intjj; intk; intkk;/*隐层权、阈值初始化*/ fori=0;iHN;i++ { forj=1;jIN;j++ {W[i][j]=doublerand/
32767.0*2-1;/*初始化输入层到隐层的权值,随机模拟0和1-1*/ printfw[%d][%d]=%f\nijW[i][j]; } } forii=0;iiON;II++ { forjj=0;jjHN;JJ++ {V[ii][jj]=doublerand/
32767.0*2-1;/*初始化隐层到输出层的权值,随机模拟0和1-1*/ printfV[%d][%d]=%f\niijjV[ii][jj]; } } fork=0;kHN;K++ { YU_HN[k]=doublerand/
32767.0*2-1; /*隐层阈值初始化-
0.01~
0.01之间*/ printfYU_HN[%d]=%f\nkYU_HN[k]; } forkk=0;kkON;KK++ { YU_ON[kk]=doublerand/
32767.0*2-1;/*输出层阈值初始化-
0.01~
0.01之间*/ } return1;}/*子程序initial结束*//*//////////////////////////////////////////*//*第m个学习样本输入子程序*//*/////////////////////////////////////////*/input_Pintm{intij; fori=0;iIN;I++ {P[i]=Study_Data[m].input[i]; printfP[%d]=%f\niP[i]; }/*获得第m个样本的数据*/return1;}/*子程序input_Pm)结束*//*/////////////////////////////////////////*//*第m个样本教师__子程序*//*/////////////////////////////////////////*/input_Tintm{intk; fork=0;kON;k++ T[k]=Study_Data[m].teach[k];return1;}/*子程序input_Tm结束*/H_I_O{ doublesig__; intij; forj=0;jHN;j++ { sig__=0; fori=0;iIN;i++ {sig__+=W[j][i]*P[i];/*求隐层内积*/ } X[j]=sig__-YU_HN[i];/*求隐层净输入,___减隐层的阀值*/ H[j]=
1.0/
1.0+exp-X[j];/*求隐层输出siglon算法*/ }return1;}/*子程序H_I_O结束*/O_I_O{intk; intj; doublesig__; fork=0;kON;k++ { sig__=
0.0; forj=0;jHN;j++ { sig__+=V[k][j]*H[k]; } Y[k]=sig__-YU_ON[k]; O[k]=
1.0/
1.0+exp-Y[k]; }return1;}intErr_O_Hintm{intk;doubleabs_err[ON];doublesqr_err=0;fork=0;kON;k++ { abs_err[k]=T[k]-O[k]; sqr_err+=abs_err[k]*abs_err[k]; d_err[k]=abs_err[k]*O[k]*
1.0-O[k]; err_m[m]=sqr_err/2; }return1;}doublee_err[HN];intErr_H_I{ intjk; doublesig__; forj=0;jHN;j++ { sig__=
0.0; fork=0;kON;k++ { sig__+=d_err[k]*V[k][j]; } e_err[j]=sig__*H[j]*1-H[j]; }return1;}s__eWVintm{inti; intii; intj; intjj; fori=0;iHN;i++ { forj=0;jIN;j++ { Old_WV[m].old_W[i][j]=W[i][j]; } } forii=0;iiON;ii++ { forjj=0;jjHN;jj++ { Old_WV[m].old_V[ii][jj]=V[ii][jj]; } }return1;}intDelta_O_Hintn /*intmintn*/{intkj; ifn1 /*n=1*/ { fork=0;kON;k++ { forj=0;jHN;j++ { V[k][j]=V[k][j]+a*d_err[k]*H[j]; } YU_ON[k]+=a*d_err[k]; } } elseifn1 { fork=0;kON;k++ { forj=0;jHN;j++ { V[k][j]=V[k][j]+a*d_err[k]*H[j]+alpha*V[k][j]-Old_WV[n-1].old_V[k][j]; } YU_ON[k]+=a*d_err[k]; } }return1;}Delta_H_Iintn /*intmintn*/{intij;ifn=1 /*n=1*/ { forj=0;jHN;j++ { fori=0;iIN;i++ { W[j][i]=W[j][i]+b*e_err[j]*P[i]; } YU_HN[j]+=b*e_err[j]; } }elseifn1 { forj=0;jHN;j++ { fori=0;iIN;i++ { W[j][i]=W[j][i]+b*e_err[j]*P[i]+alpha*W[j][i]-Old_WV[n-1].old_W[j][i]; } YU_HN[j]+=b*e_err[j]; } }return1;}doubleErr_Sum{intm;doubletotal_err=0;form=0;mN;m++ { total_err+=err_m[m]; }returntotal_err;}voids__equan{intijk; intiijjkk;iffp=fopenf:\\bp\\权值.___a==NULL /*s__etheresultatf:\hsz\bpc\*.___*/ { printfCannotopenfilestrikeanykeyexit!; getch; exit1; }fprintffpS__etheresultof“权值”quanzhiasfollows:\n;fori=0;iHN;i++ { forj=0;jIN;j++ fprintffpW[%d][%d]=%f\nijW[i][j]; }fprintffp\n;forii=0;iiON;ii++ { forjj=0;jjHN;jj++ fprintffpV[%d][%d]=%f\niijjV[ii][jj]; }fclosefp;printf\nTheresultof“权值.___”quanzhihasbeens__edsuc__ssfully!\nPressanykeytocontinue...;getch;iffp=fopenf:\\bp\\阈值.___a==NULL /*s__etheresultatf:\hsz\bpc\*/ { printfCannotopenfilestrikeanykeyexit!; getch; exit1; }fprintffpS__etheresultof“输出层的阈值”huozhiasfollows:\n; fork=0;kON;K++ fprintffpYU_ON[%d]=%f\nkYU_ON[k];fprintffp\nS__etheresultof“隐层的阈值为”huozhiasfollows:\n; forkk=0;kkHN;KK++ fprintffpYU_HN[%d]=%f\nkkYU_HN[kk];fclosefp;printf\nTheresultof“阈值.___”huozhihasbeens__edsuc__ssfully!\nPressanykeytocontinue...;getch;}/**********************//**程序入口,即主程序**//**********************/void__in{doublePre_error;doublesum_err;intstudy;intflag;flag=30000;a=
0.7;b=
0.7;alpha=
0.9;study=0;Pre_error=
0.0001;/*实际值为Pre_error=
0.0001;*/Start_Show;/*调用函数,显示开始界面*/GetTrainingData;initial;do {intm; ++study; form=0;mN;m++ { input_Pm; input_Tm; H_I_O; O_I_O; Err_O_Hm; Err_H_I; s__eWVm; /****************/ Delta_O_Hm; /*mstudy*/ Delta_H_Im; /*mstudy*/ } sum_err=Err_Sum; printfsum_err=%f\nsum_err; printfPre_error=%f\n\nPre_error; ifstudyflag { printf\n*******************************\n; printfTheprogramisendedbyitselfbecauseoferror!\nThelearningtimesissurpassed!\n; printf*****************************\n; getch; break; } }whilesum_errPre_error;printf\n****************\n;printf\nTheprogramh__estudyedfor[%d]times!\nstudy;printf\n****************\n;s__equan; /*s__etheresults,保存计算权值*/End_Show;}==========================权值.___{S__etheresultof“权值”quanzhiasfollows:W
[0]
[0]=
0.350578W
[0]
[1]=-
1.008697W
[0]
[2]=-
0.962250W
[1]
[0]=
0.055661W
[1]
[1]=-
0.372367W
[1]
[2]=-
0.__0795W
[2]
[0]=
0.129752W
[2]
[1]=-
0.332591W
[2]
[2]=-
0.521561V
[0]
[0]=-
2.932654V
[0]
[1]=-
3.720583V
[0]
[2]=-
2.648183V
[1]
[0]=
2.93__70V
[1]
[1]=
1.633281V
[1]
[2]=
1.944077}阈值.___{S__etheresultof“输出层的阈值”huozhiasfollows:YU_ON
[0]=-
4.226843YU_ON
[1]=
1.501791S__etheresultof“隐层的阈值为”huozhiasfollows:YU_HN
[0]=-
0.4___59YU_HN
[1]=
0.452127YU_HN
[2]=
0.258449}==================================PAGE。