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

📄 b.cpp

📁 利用神经网络BP算法求解异或问题的源代码
💻 CPP
字号:
#include <iostream.h> 
#include <stdlib.h>
#include <math.h> 

#define K 2
#define M 8 //隐节点个数 
#define N 4 //学习样本个数
////////////////////////////////////////////////////////// 

double x[N][K]={0,0,0,1,1,0,1,1}; //x输入 

double y[N]; //y输出 

double t[N]; //t教师 

double h[M][N]; // 记录隐单元的输出 

double b[N]; //输出误差 

double b1[M][N]; //记录隐单元误差 

double w1[K][M]={0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8}; //输入与第一隐层的权 

double w2[M]={0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8}; //第一隐层与输出层的权 

double q[M]={0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8}; //第一隐层的阈值 

double p=0.3; //输出层的阈值 

double r=0.2; //步长 

//int s=0; //记录训练次数 

////////////////////////////////////////////////////////////////////////// 

double f(double u) 

{ 

return 1/(1+exp(-u)); 

} 

/////////////////////////////////////////////////////////////////////////// 

//赋值函数 

void fuzhi(void) 

{ 

t[0]=0;t[1]=1;t[2]=1;t[3]=0;
} 

//////////////////////////////////////////////////////////// 

//计算隐单元输出,输出单元 

void jisuan(void) 

{ 

int i,j,n; 

for(i=0;i<M;i++)
for(j=0;j<N;j++)
{
for(n=0;n<K;n++)
h[i][j]+=w1[n][i]*x[j][n];
h[i][j]=f(h[i][j]-q[i]);
}
for(j=0;j<N;j++)
{
for(i=0;i<M;i++)
y[j]+=w2[i]*h[i][j];
y[j]=f(y[j]-p);
}
} 



/////////////////////////////////////////////////////////// 

//计算误差 

void wucha(void) 

{ 

int i,j; 

for(j=0;j<N;j++) b[j]=y[j]*(1-y[j])*(t[j]-y[j]); //输出 

for(i=0;i<M;i++)
for(j=0;j<N;j++)
b1[i][j]=b[j]*w2[i]*h[i][j]*(1-h[i][j]);//隐单元 

} 

////////////////////////////////////////////////////////////// 

//权的修改 

void xiugai(void) 

{ 

double c=0,d=0; //临时变量 

int i,j,n; 

for( i=0;i<M;i++)
{ 

c=0; 

for( j=0;j<N;j++)
 c+=b[j]*h[i][j]; 

w2[i]+=r*c; 

} 

c=0; 

for(j=0;j<N;j++) c+=b[j]*(-1); 

p+=c*r; 


for(i=0;i<M;i++)
{c=0;
for(n=0;n<K;n++)
{
for(j=0;j<N;j++)
c+=b1[i][j]*x[j][n];
w1[n][i]+=r*c;
}
}
for(i=0;i<M;i++)
{d=0;
for(j=0;j<N;j++)
d+=b1[i][j]*(-1);
q[i]+=r*d;
}
} 

//////////////////////////////////////////////////////////// 

//计算输出的总误差 

double shuchu(void) 

{ 

double e=0; 

for(int j=0;j<N;j++) e+=(t[j]-y[j])*(t[j]-y[j]); 

return e; 

} 

/////////////////////////////////////////////////////////// 

//主函数 

void main() 

{ 

int s=0;
double Ez; 

fuzhi(); 

do{ ++s; 

jisuan(); 

wucha(); 

xiugai(); 
Ez=shuchu()/2;
}while(Ez>0.001); 
cout<<"学习次数:"<<s<<" \n";
//for(int j=0;j<N;j++) cout<<y[j]<<" "; 
cout<<"样本00  输出"<<y[0]<<"\n    01  输出"<<y[1]<<"\n    10  输出"<<y[2]<<"\n    11  输出"<<y[3]<<"\n";
} 

⌨️ 快捷键说明

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