文档介绍:BP神经网络算法原理
D
   X = V1 * sqrt(-2 * log(S) / S);
     } else
   X = V2 * sqrt(-2 * log(S) / S);
     phase = 1 - phase;
     return X;
}
//定义一个多层前向BP网络
class BP
{public:
double ***p;//记录所有的权值
double ***ddp;//记录所有的权值增量
int *pnode;//记录每一层的节点数
double **pnodey;//记录每组每一层的节点的输出值
double **ddlj;//记录每组每一层的节点的ddlj
double **pX;//记录输入样本
double **pY;//记录输入理想输出值
int Sidenum;
int Inputnodenum;
int outputnodenum;
int yangbenzushu;
BP()
{ Sidenum=0;
Inputnodenum=0;
outputnodenum=0;
yangbenzushu=0;}
~BP()
{
for(int m=0;m<Sidenum;m++)
{
         for(int n=0;n<pnode[m+1];n++)
   {delete[] p[m][n];
   delete[] ddp[m][n];}
   delete[] p[m];
      delete[] ddp[m];
}
  
     delete[] p;
      delete[] ddp;
     
   p=NULL;
      ddp=NULL;
if(p==NULL)
delete [] pnode;
for(int M=0;M<Sidenum;M++)
{delete[] pnodey[M];
delete[] ddlj[M];
}
delete[] pnodey;
delete[] ddlj;
pnodey=NULL;
ddlj=NULL;
}
//完成所有权值的初始化
void getW(int sidenum,int inputnodenum,int outputnodenum1,int yangbenzu)
{   Sidenum=sidenum;
     yangbenzushu= yangbenzu;
    Inputnodenum=inputnodenum;
outputnodenum=outputnodenum1;
p=new double **[sidenum];
ddp=new double **[sidenum];
pnode=new int [sidenum+1];//包含输入层输出层每一层的节点数
for(int i=0;i<sidenum+1;i++)
{
int data=0;
cout<<"请输入第"<<i<<"层节点数"<<endl;
    cin>>data;
    pnode[i]=data;
}
for (int j=0;j<sidenum;j++)
{    p[j]=new double* [pnode[j+1]];
     ddp[j]=new double*[pnode[j+1]];
        for (int k=0;k<pnode[j+1];k++)
        {   ddp[j][k]=new double[pnode[j]+1];
            p[j][k]=new double[pnode[j]+1];
            for (int t=0;t<pnode[j]+1;t++)
            { ddp[j][k][t]=0;//每一层的权值初始化为0
              
      if(t==0)p[j][k][t]=-fabs(randf());//每一层的阀值初始化
                else p[j][k][t]=randf();//每一层的权值初始化
    }
        }
}
//为记录每一层的节点的输出值和ddlj的指针开辟内存
pnodey=new double *[Sidenum];
ddlj=new double *[Sidenum];
for(int p=0;p<Sidenum;p++)
{
pnodey[p] = new do