⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 11.cpp

📁 编了一个用C++程序实现BP网络的异或问题。
💻 CPP
字号:
#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,w12,w21
		//中间层至输出层连接权v1,v2
		//中间层各单元输出阀值q1,q2
		//输出层单元输出阀值r
	
	//(-1,1)之间的随机数,初始化权值及阀值
	w11=(rand()/32767.0)*2-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[4][2],y[4];
	int k,n=0;
	double s1,s2,b1,b2,L,C,d,e1,e2;
	//中间层单元输入向量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.precision(10);
    cout<<"E="<<E<<endl;
	cout<<"训练次数:n="<<n<<endl;
	cout<<"实际输出:C="<<C<<endl;
}

⌨️ 快捷键说明

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