📄 xor_nn.cpp
字号:
#include <dos.h>#include <iostream.h>#include <math.h>
#include<stdlib.h>
#include<time.h>
#include<stdio.h>#define INPUT 2#define OUTPUT 1#define HIDELAYER 2#define SAMPLES 4#define NTA 0.5double w1[INPUT][HIDELAYER];double w2[HIDELAYER][OUTPUT];double sample[SAMPLES][INPUT];double teacher[SAMPLES][OUTPUT];double Ep[SAMPLES]; //误差int K[SAMPLES];
double realuniform(double a,double b){//定义随机函数
double c;
c=rand()%int(b)/(b-a)+a;
return c;
}
int intuniform(int a,int b){
int c;
c=rand()%(b-a)+a;
return c;
}double f(double x) //激活函数{ double val; val=1.0/(1.0+exp(-0.5*x)); return val;}void init_sample() //样本初始化{ sample[0][0]=0; sample[0][1]=0; teacher[0][0]=0; sample[1][0]=0; sample[1][1]=1; teacher[1][0]=1; sample[2][0]=1; sample[2][1]=0; teacher[2][0]=1; sample[3][0]=1; sample[3][1]=1; teacher[3][0]=0;}void initialize() //权值初始化{ int i,j; for(i=0;i<INPUT;i++) for(j=0;j<HIDELAYER;j++) w1[i][j]=realuniform(0.1,2.0); for(i=0;i<HIDELAYER;i++) for(j=0;j<OUTPUT;j++) w2[i][j]=realuniform(0.1,2.0);}void BP() //BP算法{ int i,j,k,m; bool cont; double net1[HIDELAYER]; double net2[OUTPUT]; double o1[HIDELAYER]; double o2[OUTPUT]; double delta2[OUTPUT]; double delta1[HIDELAYER]; double deltaW2[HIDELAYER][OUTPUT]; double deltaW1[INPUT][HIDELAYER]; k=0; cont=false; while(k<SAMPLES) { //正向计算 for(i=0;i<HIDELAYER;i++){ net1[i]=0; for(j=0;j<INPUT;j++) net1[i]+=sample[K[k]][j]*w1[j][i]; o1[i]=f(net1[i]); } for(i=0;i<OUTPUT;i++){ net2[i]=0; for(j=0;j<HIDELAYER;j++) net2[i]+=o1[j]*w2[j][i]; o2[i]=f(net2[i]); } //误差计算 Ep[K[k]]=0; for(i=0;i<OUTPUT;i++) Ep[K[k]]+=pow(teacher[K[k]][i]-o2[i],2); Ep[K[k]]=1.0/2*sqrt(Ep[K[k]]); if(Ep[K[k]]>0.02){ cont=true; //反向计算 for(j=0;j<OUTPUT;j++){ //输出层 delta2[j]=-(teacher[K[k]][j]-o2[j])*(1-o2[j])*o2[j]; for(i=0;i<HIDELAYER;i++) deltaW2[i][j]=(-1)*NTA*delta2[j]*o1[i]; } for(j=0;j<HIDELAYER;j++){ //隐层 double temp; temp=0.0; for(m=0;m<OUTPUT;m++) temp+=delta2[m]*w2[j][m]; delta1[j]=(1-o1[j])*o1[j]*temp; for(i=0;i<INPUT;i++) deltaW1[i][j]=(-1)*NTA*delta1[j]*sample[K[k]][i]; } for(i=0;i<INPUT;i++) for(j=0;j<HIDELAYER;j++) w1[i][j]+=deltaW1[i][j]; for(i=0;i<HIDELAYER;i++) for(j=0;j<OUTPUT;j++) w2[i][j]+=deltaW2[i][j];
cout<<i<<","<<j<<": "<<w1[i][j]<<endl;
cout<<i<<","<<j<<": "<<w2[i][j]<<endl;
cout<<"EP["<<K[k]<<"]="<<Ep[K[k]]<<endl; } k++; if(k==SAMPLES && cont){ k=0; cont=false; } }}int main(int argc, char* argv[]){ initialize(); init_sample(); BP(); return 0;}//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -