用bp网络解决异或问题(c++语言).txt

来自「用BP网络解决异或问题」· 文本 代码 · 共 90 行

TXT
90
字号
#include<iostream.h>
#include<time.h>
#include<stdlib.h>
#include<math.h>
void main()
{
   time_t t; 
   srand((unsigned) time(&t));
	double w11,w12,w21,w22,v1,v2,q1,q2,r;
	//输入层至中间层连接权,中间层至输出层连接权,中间层各单元输出阀值,输出层单元输出阀值
	w11=(rand()/32767.0)*2-1;     //(-1,1)之间的随机数,初始化权值及阀值
	w12=(rand()/32767.0)*2-1;
	w21=(rand()/32767.0)*2-1;
	w22=(rand()/32767.0)*2-1;
	v1=(rand()/32767.0)*2-1;
	v2=(rand()/32767.0)*2-1;
	q1=(rand()/32767.0)*2-1;
	q2=(rand()/32767.0)*2-1;
	r=(rand()/32767.0)*2-1;
	double x[3][1],y[3];
	int k,n=0;
	double s1,s2,b1,b2,L,C,d,e1,e2;
	//输入模式向量,希望输出向量,中间层单元输入向量、输出向量,输出层单元输入向量、输出向量
	// 输出层的各单元的误差,中间层各单元的误差
	double a=0.6,b=0.6;     //网络学习率
	double E=0,h=0.0011;         //全局误差函数
	//----------------------------------------------
	   k=rand()%4;
	   x[k][0]=(rand()/32767.0)*2-1;             //取随机训练模式对
	   x[k][1]=(rand()/32767.0)*2-1;
 	   if(x[k][0]<0.5)
		   x[k][0]=0.0;
	   else
	 	   x[k][0]=1.0;
	   if(x[k][1]<0.5)
		   x[k][1]=0.0;
	   else
		   x[k][1]=1.0;
	   if(x[k][0]==0.0 && x[k][1]==0.0 || x[k][0]==1.0 && x[k][1]==1.0)
		   y[k]=0.0;
	   else
		   y[k]=1.0;
    cout<<"输入模式对:"<<endl;
	cout<<"x["<<k<<"][0]="<<x[k][0]<<endl;
	cout<<"x["<<k<<"][1]="<<x[k][1]<<endl;
	cout<<"理想输出:y["<<k<<"]="<<y[k]<<endl;
	//----------------------------------------------
	//训练
	E=h+1;
	while (E>h)
	{
	    E=0;
		n++;
		s1=w11*x[k][0]+w21*x[k][1]-q1;             //中间层单元各输入
		b1=1/(1+exp(s1));                          //中间层单元各输出
		s2=w12*x[k][0]+w22*x[k][1]-q2;  
		b2=1/(1+exp(s2)); 
		//----------------------------------------
	  	L=v1*b1+v2*b2-r;                           //输出层单元输入
		C=1/(1+exp(L));                            //输出层单元输出
		//----------------------------------------
		d=(y[k]-C)*C*(1-C);                        //输出层的各单元的误差
		//----------------------------------------
		e1=d*v1*b1*(1-b1);                       //中间层各单元的误差
		e2=d*v2*b2*(1-b2);
		//-------------------------------------------
		v1=v1+a*d*b1;                           //修正中间层至输出层连接权
		v2=v2+a*d*b2;
		r=r+a*d;                                //修正输出层单元输出阀值
		//-------------------------------------------
		w11=w11+b*e1*x[k][0];                    //修正输入层至中间层连接权
        w12=w12+b*e2*x[k][0];
		w21=w21+b*e1*x[k][1];
		w22=w22+b*e2*x[k][1];
		q1=q1+b*e1;                           //修正中间层各单元输出阀值
		q2=q2+b*e2;
		//-------------------------------------------
		E=(y[k]-C)*(y[k]-C)/2;
	   if(n>10000)                           //自适应调整
		   b*=1.05;
	}
    if(C<0.5)
		C=0.0;
	else
		C=1.0;
    cout<<"E="<<E<<endl;
	cout<<"训练次数:n="<<n<<endl;
	cout<<"实际输出:C="<<C<<endl;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?