#includestdlib.h#includemath.h#includestdio.h#includetime.h#defineout_cout2//输出向量维数#definein_cout3//输入向量维数#definecout6//样本数量typedefstruct{//bp人工神经网络结构inth;//实际使用隐层数量doublev[in_cout][50];//隐藏层权矩阵i,隐层节点最大数量为100doublew[50][out_cout];//输出层权矩阵doublea;//学习率doubleb;//精度控制参数intLoopCout;//最大循环次数}bp_nn;doublefnet(doublenet){//sigmoid函数,神经网络激活函数return1/(1+exp(-net));}intinitbp(bp_nn*bp){//初始化bp网络printf(请输入隐层节点数,最大数为100:\n);scanf(%d,&(*bp).h);printf(请输入学习率:\n);scanf(%lf,&(*bp).a);//(*bp).a为double型数据,所以必须是lfprintf(请输入精度控制参数:\n);scanf(%lf,&(*bp).LoopCout);inti,j;srand((unsigned)time(NULL));for(i=0;iin_cout;i++)for(j=0;j(*bp).h;j++)(*bp).v[i][j]=rand()/(double)(RAND_MAX);for(i=0;i(*bp).h;i++)for(j=0;jout_cout;j++)(*bp).w[i][j]=rand()/(double)(RAND_MAX);return1;}inttrainbp(bp_nn*bp,floatx[cout][in_cout],inty[cout][out_cout]){//训练bp网络,样本为x,理想输出为ydoublef=(*bp).b;//精度控制参数doublea=(*bp).a;//学习率inth=(*bp).h;//隐层节点数doublev[in_cout][50],w[50][out_cout];//权矩阵doublech_v[in_cout][50],ch_w[50][out_cout];//权矩阵修改量doublechgH[50],chgO[out_cout];//修改量矩阵double01[50],02[out_cout];//隐层和输出层输出量intLoopCout=(*bp).LoopCout;//最大循环次数inti,j,k,n;doubletemp;for(i=0;iin_cout;i++)//复制结构体中的权矩阵for(j=0;ih;j++)w[i][j]=(*bp).w[i][j];doublee=f+1;for(n=0;ef&&nLoopCout;n++){//对每个样本训练网络e=0;for(j=0;jout_cout;j++)chgO[j]=0;for(j=0;jh;j++)chgH[j]=0;for(j=0;jh;j++)for(k=0;kout_cout;k++)ch_w[j][k]=0;for(j=0;jin_cout;j++)for(k=0;kh;k++){//计算隐层输出向量temp=0;for(j=0;jin_cout;j++)temp=temp+x[i][j]*v[j][k];01[k]=fnet(temp);}for(k=0;kout_cout;k++){//计算输出层输出向量temp=0;for(j=0;jh;j++)temp=temp+01[j]*w[j][k];02[k]=fnet(temp);}for(j=0;jout_cout;j++)//计算输出误差e=e+(y[i][j]-02[j])*(y[i][j]-02[j]);for(j=0;jh;j++)for(k=0;kout_cout;k++)ch_w[j][k]+=a*01[j]*chg0[k];//累加所有样本训练后的该变量for(j=o;jh;j++){temp=0;for(k=0;kout_cout;k++)temp=temp+w[j][k]*chg0[k];chgh[j]=temp*01[j]*(1-01[j]);}for(j=0;jin_cout;j++)for(k=0;kh;k++)ch_v[j][k]+=a*x[i][j]*chgh[k];//累加所有样本训练后的该变量,消除样本顺序影响}for(j=0;jh;j++)//修改输出层权矩阵for(k=0;kout_cout;k++)w[j][k]=w[j][k]+ch_w[j][k];for(j=0;jin_cout;j++)//修改隐藏层权矩阵for(k=0;kh;k++)v[j][k]=v[j][k]+ch_v[j][k];if(n%10===0){printf(误差:%f\n,e);printf(循环次数:%d\n,n);}}printf(总共循环次数:%d\n,n);printf(调整后的隐层权矩阵:\n);for(i=0;iin_cout;i++){for(j=0;jh;j++)printf(%f,v[i][j]);printf(\n);}printf(调整后的输出层矩阵:\n);for(i=0;ih;i++){for(j=0;jout_cout;j++)printf(%f,w[i][j]);printf(\n);}for(i=0;iin_cout;i++)//把结果复制回结构体for(j=0;jh;j++)(*bp).v[i][j]=v[i][j];for(i=0;ih;i++)for(j=0;jout_cout;j++)(*bp).w[i][j]=w[i][j];printf(bp网络训练结束!\n);return1;}intusebp(bp_nn*bp){//使用bp网络floatinput[in_cout];double01[50];double02[out_cout];//01为隐层输出,02为输出层输出while(1){持续执行,除非中断程序printf(请输入3个数:\n);inti,j;for(i=0;iin_cout;i++)scanf(%f,&input[i]);doubletemp;for(i=0;i(*bp).h;i++){temp=0;for(j=0;jin_cout;j++)temp+=input[j]*(*bp).v[j][i];01[i]=fnet(temp);}for(i=0;iout_cout;i++){temp=0;for(j=0;j(*bp).h;j++)temp+=01[j]*(*bp).w[j][i];02[i]=fnet(temp);}printf(结果:);for(i=0;iout_cout;i++)printf(%.3f,02[i]);printf(\n);}return1;}intmain(){floatx[cout][in_cout]={{0.8,0.5,0},{0.9,0.7,0.3},{1,0.8,0.5},{0,0.2,0.3},{0.2,0.1,1.3},{0.2,0.7,0.8}};//训练样本inty[cout][out_cout]={{0,1},{0,1},{0,1},{1,0},{1,0},{1,0}};//理想输出bp_nnbp;initbp(&bp);//初始化bp网络结构trainbp(&bp,x,y);//训练bp神经网络usebp(&bp);//测试bp神经网络return1;}