《2022年BP神经网络源代码(C++ .pdf》由会员分享,可在线阅读,更多相关《2022年BP神经网络源代码(C++ .pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、#pragma hdrstop #include #include const A=30.0; const B=10.0; const MAX=500;/最大训练次数const COEF=0.0035; / 网络的学习效率const BCOEF=0.001;/ 网络的阀值调整效率const ERROR=0.002; / 网络训练中的允许误差const ACCURACY=0.0005;/ 网络要求精度double sample414=0,0,0,0,5,1,4,19.020,5,3,3,14.150, 5,5,2,14.360,5,3,3,14.150,5,3,2,15.390, 5,3,2,1
2、5.390,5,5,1,19.680,5,1,2,21.060, 5,3,3,14.150,5,5,4,12.680,5,5,2,14.360, 5,1,3,19.610,5,3,4,13.650,5,5,5,12.430, 5,1,4,19.020,5,1,4,19.020,5,3,5,13.390, 5,5,4,12.680,5,1,3,19.610,5,3,2,15.390, 1,3,1,11.110,1,5,2,6.521,1,1,3,10.190, 1,3,4,6.043,1,5,5,5.242,1,5,3,5.724, 1,1,4,9.766,1,3,5,5.870,1,5,4,5
3、.406, 1,1,3,10.190,1,1,5,9.545,1,3,4,6.043, 1,5,3,5.724,1,1,2,11.250,1,3,1,11.110, 1,3,3,6.380,1,5,2,6.521,1,1,1,16.000, 1,3,2,7.219,1,5,3,5.724; double w41010,wc41010,b410,bc410; double o410,netin410,d410,differ;/单个样本的误差double is; /全体样本均方差int count,a; void netout(int m, int n);/ 计算网络隐含层和输出层的输出void
4、calculd(int m,int n); / 计算网络的反向传播误差void calcalwc(int m,int n);/计算网络权值的调整量void calcaulbc(int m,int n); / 计算网络阀值的调整量void changew(int m,int n); / 调整网络权值void changeb(int m,int n);/ 调整网络阀值void clearwc(int m,int n);/ 清除网络权值变化量wc void clearbc(int m,int n);/ 清除网络阀值变化量bc void initialw(void);/初始化 NN 网络权值W voi
5、d initialb(void); /初始化 NN 网络阀值void calculdiffer(void);/计算 NN 网络单个样本误差void calculis(void);/ 计算 NN 网络全体样本误差void trainNN(void);/ 训练 NN 网络/*计算 NN 网络隐含层和输出层的输出*/ void netout(int m,int n) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 7 页 - - - - - - - - - int i,j,k;
6、 /隐含层各节点的的输出for (j=1,i=2;j=m;j+) /m为隐含层节点个数 netinij=0.0; for(k=1;k=3;k+)/ 隐含层的每个节点均有三个输入变量netinij=netinij+oi-1k*wikj; netinij=netinij-bij; oij=A/(1+exp(-netinij/B); /输出层各节点的输出for (j=1,i=3;j=n;j+) netinij=0.0; for (k=1;k=m;k+) netinij=netinij+oi-1k*wikj; netinij=netinij-bij; oij=A/(1+exp(-netinij/B)
7、; /*计算 NN 网络的反向传播误差*/ void calculd(int m,int n) int i,j,k; double t; a=count-1; d31=(o31-samplea3)*(A/B)*exp(-netin31/B)/pow(1+exp(-netin31/B),2); /隐含层的误差for (j=1,i=2;j=m;j+) t=0.00; for (k=1;k=n;k+) t=t+wi+1jk*di+1k; dij=t*(A/B)*exp(-netinij/B)/pow(1+exp(-netinij/B),2); /*计算网络权值W 的调整量 */ void calcu
8、lwc(int m,int n) int i,j,k; / 输出层(第三层)与隐含层(第二层)之间的连接权值的调整for (i=1,k=3;i=m;i+) for (j=1;j=n;j+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 7 页 - - - - - - - - - wckij=-COEF*dkj*ok-1i+0.5*wckij; / printf(n); /隐含层与输入层之间的连接权值的调整for (i=1,k=2;i=m;i+) for (j=1;j=m
9、;j+) wckij=-COEF*dkj*ok-1i+0.5*wckij; /printf(n); /*计算网络阀值的调整量*/ void calculbc(int m,int n) int j; for (j=1;j=m;j+) bc2j=BCOEF*d2j; for (j=1;j=n;j+) bc3j=BCOEF*d3j; /*调整网络权值*/ void changw(int m,int n) int i,j; for (i=1;i=3;i+) for (j=1;j=m;j+) w2ij=0.9*w2ij+wc2ij; /为了保证系统有较好的鲁棒性,计算权值时乘惯性系数0.9 printf
10、(w2%d%d=%fn,i,j,w2ij); for (i=1;i=m;i+) for (j=1;j=n;j+) w3ij=0.9*w3ij+wc3ij; printf(w3%d%d=%fn,i,j,w3ij); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 7 页 - - - - - - - - - /*调整网络阀值*/ void changb(int m,int n) int j; for (j=1;j=m;j+) b2j=b2j+bc2j; for (j=1;j=
11、n;j+) b3j=b3j+bc3j; /*清除网络权值变化量wc*/ void clearwc(void) for (int i=0;i4;i+) for (int j=0;j10;j+) for (int k=0;k10;k+) wcijk=0.00; /*清除网络阀值变化量*/ void clearbc(void) for (int i=0;i4;i+) for (int j=0;j10;j+) bcij=0.00; /*初始化网络权值W*/ void initialw(void) int i,j,k,x; double weight; for (i=0;i4;i+) for (j=0;
12、j10;j+) for (k=0;k10;k+) randomize(); x=100+random(400); weight=(double)x/5000.00; wijk=weight; /*初始化网络阀值*/ void initialb(void) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 7 页 - - - - - - - - - int i,j,x; double fazhi; for (i=0;i4;i+) for (j=0;j10;j+) random
13、ize(); for (int k=0;k12;k+) x=100+random(400); fazhi=(double)x/50000.00; bij=fazhi; /*计算网络单个样本误差*/ void calculdiffer(void) a=count-1; differ=0.5*(o31-samplea3)*(o31-samplea3); void calculis(void) int i; is=0.0; for (i=0;i=19;i+) o11=samplei0; o12=samplei1; o13=samplei2; netout(8,1); is=is+(o31-sampl
14、ei3)*(o31-samplei3); is=is/20; /*训练网络 */ void trainNN(void) long int time; int i,x4; initialw(); initialb(); for (time=1;time=MAX;time+) count=0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 7 页 - - - - - - - - - while(countERROR) calculd(8,1); calculwc(8,1);
15、 calculbc(8,1); changw(8,1); changb(8,1); netout(8,1); calculdiffer(); printf(This is %d times training NN.n,time); calculis(); printf(is=%fn,is); if (isACCURACY) break; /- #pragma argsused int main(int argc, char* argv) double result; int m,test4; char ch=y; coutPlease wait for the train of NN:endl
16、; trainNN(); coutNow,this modular network can work for you.endl; while(ch=y | ch=Y) coutPlease input data to be tested.endl; for (m=1;mtestm; ch=getchar(); o11=test1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 7 页 - - - - - - - - - o12=test2; o13=test3; netout(8,1); result=o31; printf(Final result is %f.n,result); printf(Still test?Yes or Non); ch=getchar(); return 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 7 页 - - - - - - - - -