//////////////
//ANN BP
//////////////#include <stdlib.h>
#include <stdio.h>
#include <float.h>
#include <time.h>
#include <limits.h>
#include <math.h>void main(void)
{ char filename_train[256]="d:\\debug\\other\\train_data.txt";//XOR样本 double eta=0.5;//学习速度[0.1,1]
double alpha=0.1;//动量因子或冲量系数
double e=0.01;//精度控制
double E=e+1;

int unit_num_input=2;//输入层神经元数
int unit_num_output=1;//输出层神经元数
int unit_num_hidden=1;//隐层数
int layer_num=unit_num_hidden+2;
int *unit_num_layer=new int[layer_num];
unit_num_layer[0]=unit_num_input;
unit_num_layer[unit_num_hidden+1]=unit_num_output; unit_num_layer[1]=2;

srand(time(NULL));
double ***w=new double**[layer_num];
int i=0;
int j=0;
int k=0;
for(i=1;i<layer_num;i++)
{
w[i]=new double*[unit_num_layer[i]];
for(j=0;j<unit_num_layer[i];j++)
{
w[i][j]=new double[unit_num_layer[i-1]];
for(k=0;k<unit_num_layer[i-1];k++)
w[i][j][k]=(double)rand()/(RAND_MAX+1);
}
}

double **theta=new double*[layer_num];
for(i=0;i<layer_num;i++)
{
theta[i]=new double[unit_num_layer[i]];
for(j=0;j<unit_num_layer[i];j++)
theta[i][j]=(double)rand()/(RAND_MAX+1);
} int train_sample_num=0;//训练样本数
FILE *fp_train=fopen(filename_train,"r");
while(!feof(fp_train))
{
char ch=fgetc(fp_train);
if(ch=='\n')
++train_sample_num;
}
fclose(fp_train);
fp_train=NULL;

double **x=new double*[train_sample_num];
double **d=new double*[train_sample_num];
for(i=0;i<train_sample_num;i++)
{
x[i]=new double[unit_num_layer[0]];
d[i]=new double[unit_num_layer[layer_num-1]];
}
double *E_train_sample=new double[train_sample_num]; fp_train=fopen(filename_train,"r");
for(i=0;i<train_sample_num;i++)
{
for(j=0;j<unit_num_layer[0];j++)
fscanf(fp_train,"%lf",&(x[i][j]));
for(j=0;j<unit_num_layer[layer_num-1];j++)
fscanf(fp_train,"%lf",&(d[i][j]));
}
fclose(fp_train);
fp_train=NULL; double **o=new double*[layer_num];//各层各神经元输出
for(i=0;i<layer_num;i++)
o[i]=new double[unit_num_layer[i]]; double **delta=new double*[layer_num];//各层神经元误差项
for(i=0;i<layer_num;i++)
{
delta[i]=new double[unit_num_layer[i]];
for(j=0;j<unit_num_layer[i];j++)
delta[i][j]=-9999999.0;
} int l=0;
while(E>e)
{
E=0.0;
for(i=0;i<train_sample_num;i++)
{
for(j=0;j<unit_num_layer[0];j++)
o[0][j]=x[i][j];

for(j=1;j<layer_num;j++)
{
for(k=0;k<unit_num_layer[j];k++)
{
double sigma=0.0;
for(l=0;l<unit_num_layer[j-1];l++)
sigma+=w[j][k][l]*o[j][l];
o[j][k]=1.0/(1.0+exp(theta[j][k]-sigma));
}
}

E_train_sample[i]=0.0;
for(k=0;k<unit_num_layer[layer_num-1];k++)
E_train_sample[i]+=(d[i][k]-o[layer_num-1][k])*(d[i][k]-o[layer_num-1][k]);
E+=E_train_sample[i];

for(j=layer_num-1;j>0;j--)
{
for(k=0;k<unit_num_layer[j];k++)
{
if(j==layer_num-1)
delta[j][k]=o[j][k]*(1.0-o[j][k])*(d[i][k]-o[j][k]);
else
{
double sigma=0.0;
for(l=0;l<unit_num_layer[j+1];l++)
sigma+=delta[j+1][l]*w[j][k][l];
delta[j][k]=o[j][k]*(1.0-o[j][k])*sigma;
} for(l=0;l<unit_num_layer[j-1];l++)
w[j][k][l]+=eta*delta[j][k]*o[j-1][k];
}
}
}
E/=2.0;
}
//////////////////////////////////////////////////////////////////////////
//delete
//////////////////////////////////////////////////////////////////////////
//E_train_sample
delete []E_train_sample;
//o,delta
for(i=0;i<layer_num;i++)
{
delete []o[i];
o[i]=NULL;
delete []delta[i];
delta[i]=NULL;
}
delete []o;
o=NULL;
delete []delta;
delta=NULL;
//x,d
for(i=0;i<train_sample_num;i++)
{
delete []x[i];
x[i]=NULL;
delete []d[i];
d[i]=NULL;
}
delete []x;
x=NULL;
delete []d;
d=NULL;
//theta
for(i=0;i<layer_num;i++)
{
delete []theta[i];
theta[i]=NULL;
}
delete []theta;
theta=NULL;
//w
for(i=1;i<layer_num;i++)
{
for(j=0;j<unit_num_layer[i];j++)
{
delete []w[i][j];
w[i][j]=NULL;
}
delete []w[i];
w[i]=NULL;
}
delete []w;
w=NULL;
//unit_num_layer
delete []unit_num_layer;
unit_num_layer=NULL;
}