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

📄 xor_nn.cpp

📁 BP模型逼近异或问题
💻 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 + -