用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 + -
显示快捷键?