📄 bpnn.txt
字号:
bp神经网络变形预测源程序(有待改进)
/*********************************************************bp神经网络变形预测源程序*/
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<CONIO.H>
#define DN 30 /*Number of Neural net cells*/
#define DM 100 /*Number of Samples*/
#define DL 50 /*Output frequency*/
#define LP 0.125f /*Learning rate*/
/**********************************f1 is logsig function ; f3 is pureline function;*/
float f1(float x)/*************************************定义两个隐层的单元传递函数f1*/
{return (float)(1/(1+exp(-x)));
}
float df1(float x)/*********************************************定义函数f1的导数df1*/
{float tp;
tp=(float)exp(-x);
return tp/((1+tp)*(1+tp));
}
float f3(float x)/***************************定义输出层单元的传递函数f3(线性函数)*/
{return x;
}
float df3(float x)/*******************************************定义函数f3的导函数df3*/
{return 1.0*x/x;
}
/***********************************************************************************/
main()
{
int i,j,s0,s1,s2,s3,k,n,Key,jj,n0;
float E,arfa,gama,err,err0;
float pp[DN][DM],tt[DN][DM],tt0[DN],ee[DN];
float aa0[DN],aa1[DN],aa2[DN],aa3[DN],ss1[DN],ss2[DN],ss3[DN],nn1[DN],nn2[DN],nn3[DN];
float bb1[DN],bb2[DN],bb3[DN],dbb10[DN],dbb20[DN],dbb30[DN],dbb1[DN],dbb2[DN],dbb3[DN];
float ww1[DN][DN],ww2[DN][DN],ww3[DN][DN];
float dww1[DN][DN],dww2[DN][DN],dww3[DN][DN];
float dww10[DN][DN],dww20[DN][DN],dww30[DN][DN];
char DataFile[10],*Fout1,*Fout2,*Fss,*Fss1;
FILE *fp0,*fp1;
err0=5.0f;E=(float)6e-3;arfa=LP;gama=0.45f;
/**************************************************************以上为所需参数的定义*/
printf("\n************\n Input the dat file \n");
scanf("%s",DataFile);
Fout1=strdup(DataFile);
Fout2=strdup(DataFile);
Fss="-r.txt";
Fss1="-w.txt";
strcat(Fout1,Fss);
strcat(Fout2,Fss1);
if((fp0=fopen(Fout1,"r"))==NULL)
{printf("Can't open 1file\n");
exit(0);
}
/*Fout1=strdup(DataFile);*/
/*Fss="-w.txt";*/
/*strcat(Fout1,Fss);*/
if((fp1=fopen(Fout2,"w"))==NULL)
{printf("Can't open 2file\n");
exit(0);
}
fscanf(fp0,"%d",&Key);
/***************************************************************if(Key==0)training*/
if(Key==0)
{fscanf(fp0,"%d%d%d%d%d%d",&n0,&n,&s0,&s1,&s2,&s3);
for(jj=0;jj<n;jj++)
{
for(i=0;i<s0;i++)
{
fscanf(fp0,"%d",&pp[i][jj]);/*pp[][] is Input Sample*/
}
for(i=0;i<s3;i++)
{
fscanf(fp0,"%d",&tt[i][jj]);/*tt[][] is target Sample*/
}
n=n0;
}
/******************************************************Initial WW & BB within (0,1)*/
RenewS1:;
for(i=0;i<s1;i++)
{bb1[i]=rand()/32767.0f;
for(j=0;j<s0;j++)
{ww1[i][j]=rand()/32767.0f;
}
}
for(i=0;i<s2;i++)
{bb2[i]=rand()/32767.0f;
for(j=0;j<s1;j++)
{ww2[i][j]=rand()/32767.0f;
}
}
for(i=0;i<s3;i++)
{bb3[i]=rand()/32767.0f;
for(j=0;j<s2;j++)
{ww3[i][j]=rand()/32767.0f;
}
}
for(i=0;i<s1;i++)
{dbb10[i]=0.0f;
for(j=0;j<s0;j++)
{dww10[i][j]=0.0f;
}
}
for(i=0;i<s2;i++)
{dbb20[i]=0.0f;
for(j=0;j<s1;j++)
{dww20[i][j]=0.0f;
}
}
for(i=0;i<s3;i++)
{dbb30[i]=0.0f;
for(j=0;j<s2;j++)
{dww30[i][j]=0.0f;
}
}
/************************************************************************************/
k=0;
while(1)
{
for(jj=0;jj<n;jj++)
{
for(i=0;i<s0;i++)
{
aa0[i]=pp[i][jj];
}
for(i=0;i<s3;i++)
{
tt0[i]=tt[i][jj];
}
}
/*******************************************************Prepropagating aa0[] to aa3[]*/
for(i=0;i<s1;i++)
{
nn1[i]=0.0f;
for(j=0;j<s0;j++)
{
nn1[i]=nn1[i]+ww1[i][j]*aa0[j];
}
}
for(i=0;i<s1;i++)
{
nn1[i]=nn1[i]+bb1[i];
aa1[i]=f1(nn1[i]);
}
for(i=0;i<s2;i++)
{
nn2[i]=0.0f;
for(j=0;j<s1;j++)
{
nn2[i]=nn2[i]+ww2[i][j]*aa1[j];
}
}
for(i=0;i<s2;i++)
{
nn2[i]=nn2[i]+bb2[i];
aa2[i]=f1(nn2[i]);
}
for(i=0;i<s3;i++)
{
nn3[i]=0.0f;
for(j=0;j<s2;j++)
{
nn3[i]=nn3[i]+ww3[i][j]*aa2[j];
}
}
for(i=0;i<s3;i++)
{
nn3[i]=nn3[i]+bb3[i];
aa3[i]=f3(nn3[i]);
ee[i]=tt0[i]-aa3[i];
}
/****************************************************************************************/
err=0.0f;
for(i=0;i<s3;i++)
{
if(err<(float)fabs(ee[i]))
err=(float)fabs(ee[i]);
}
/*************************************************************Calculating sensitivity ss */
for(i=0;i<s3;i++)
{
ss3[i]=(-2)*df3(nn3[i])*ee[i];
}
for(j=0;j<s2;j++)
{
ss2[j]=0;
for(i=0;i<s3;i++)
{
ss2[j]=ss2[j]+df1(nn2[j])*ww3[i][j]*ss3[i];
}
}
for(j=0;j<s1;j++)
{
ss1[j]=0;
for(i=0;i<s2;i++)
{
ss1[j]=ss1[j]+df1(nn1[j])*ww2[i][j]*ss2[i];
}
}
/*******************************************Calculate dww & dbb and Renew the ww &bb */
for(i=0;i<s1;i++)
{
for(j=0;j<s0;j++)
{
dww1[i][j]=gama*dww10[i][j]-(1-gama)*arfa*ss1[i]*aa0[j];
}
}
for(i=0;i<s2;i++)
{
for(j=0;j<s1;j++)
{
dww2[i][j]=gama*dww20[i][j]-(1-gama)*arfa*ss2[i]*aa1[j];
}
}
for(i=0;i<s3;i++)
{
for(j=0;j<s2;j++)
{
dww3[i][j]=gama*dww30[i][j]-(1-gama)*arfa*ss3[i]*aa2[j];
}
}
for(i=0;i<s1;i++)
{
dbb1[i]=gama*dbb10[i]-(1-gama)*arfa*ss1[i];
}
for(i=0;i<s2;i++)
{
dbb2[i]=gama*dbb20[i]-(1-gama)*arfa*ss2[i];
}
for(i=0;i<s3;i++)
{
dbb3[i]=gama*dbb30[i]-(1-gama)*arfa*ss3[i];
}
for(i=0;i<s1;i++)
{
for(j=0;j<s0;j++)
{
ww1[i][j]=ww1[i][j]+dww1[i][j];
dww10[i][j]=dww1[i][j];
}
}
for(i=0;i<s2;i++)
{
for(j=0;j<s1;j++)
{
ww2[i][j]=ww2[i][j]+dww2[i][j];
dww20[i][j]=dww2[i][j];
}
}
for(i=0;i<s3;i++)
{
for(j=0;j<s2;j++)
{
ww3[i][j]=ww3[i][j]+dww3[i][j];
dww30[i][j]=dww3[i][j];
}
}
for(i=0;i<s1;i++)
{
bb1[i]=bb1[i]+dbb1[i];
dbb10[i]=dbb1[i];
}
for(i=0;i<s2;i++)
{
bb2[i]=bb2[i]+dbb2[i];
dbb20[i]=dbb2[i];
}
for(i=0;i<s3;i++)
{
bb3[i]=bb3[i]+dbb3[i];
dbb30[i]=dbb3[i];
}
}
k++;/************************************************************end of for(jj=0;jj<n;jj++)*/
/********************************************************************************************/
if(k%DL==0)
{
fprintf(fp1,"\n%d%f",k/DL,err);
printf("\nstep=%d err=%10.7f arfa=%6.4f gama=%6.4f s1=%d s2=%d",k/DL,err,arfa,gama,s1,s2);
}
if(err>0.02||arfa>LP)
{
arfa=LP;
}
if(arfa>0.8*LP)
{
if(err0/err<1.0)
{
arfa=arfa*1.0001f;
}
if(err0/err>1.0)
{
王者之风(845746318) 23:08:20
arfa=arfa*0.9999f;
}
if(k>3e4*DL&&err>E)
{
k=0;
s1++;
goto RenewS1;
}
if(err<E)
{
err0=err;/**********************************************************end of if(k%DL=0)*/
/* break;*/
}
}/********************************************************************end of while(1)*/
/***********************************************************************Output The WW & BB*/
fprintf(fp1,"\n\n%d%d%d%d%d",s0,s1,s2,s3,k);
fprintf(fp1,"\n\n");
for(j=0;j<s1;j++)
{
fprintf(fp1,"\n");
for(i=0;i<s0;i++)
{
fprintf(fp1,"%f",ww1[j][i]);
}
fprintf(fp1,"%f",bb1[j]);
}
fprintf(fp1,"\n\n");
for(j=0;j<s2;j++)
{
fprintf(fp1,"\n");
for(i=0;i<s1;i++)
{
fprintf(fp1,"%f",ww2[j][i]);
}
fprintf(fp1,"%f",bb2[j]);
}
fprintf(fp1,"\n\n");
for(j=0;j<s3;j++)
{
fprintf(fp1,"\n");
for(i=0;i<s2;i++)
{
fprintf(fp1,"%f",ww3[j][i]);
}
fprintf(fp1,"%f",bb3[j]);
}
fprintf(fp1,"\n\n");/********************************************************if(Key==0)*/
/******************************************************************************Forcasting*/
/******************************************************************************if(Key==1) Input ww & bb*/
if(Key==1)
{
fscanf(fp0,"%d%d%d%d",&s0,&s1,&s2,&s3);
for(j=0;j<s1;j++)
{
for(i=0;i<s0;i++)
{
fscanf(fp0,"%f",&ww1[j][i]);
fscanf(fp0,"%f",&bb1[j]);
}
}
for(j=0;j<s2;j++)
{
for(i=0;i<s1;i++)
{
fscanf(fp0,"%f",&ww2[j][i]);
fscanf(fp0,"%f",&bb2[j]);
}
}
for(j=0;j<s3;j++)
{
for(i=0;i<s2;i++)
{
fscanf(fp0,"%f",&ww3[j][i]);
fscanf(fp0,"%f",&bb3[j]);
}
}
/***********************************************************if(Key==1)*/
fscanf(fp0,"%d",&n);
for(jj=0;jj<n;jj++)
{
for(i=0;i<s0;i++)
{
fscanf(fp0,"%f",&pp[i][jj]);
}
}
for(jj=0;jj<n;jj++)
{
for(i=0;i<s0;i++)
{
aa0[i]=pp[i][jj];
}
for(i=0;i<s1;i++)
{
nn1[i]=0.0f;
for(j=0;j<s0;j++)
{
nn1[i]=nn1[i]+ww1[i][j]*aa0[j];
}
}
}
for(i=0;i<s1;i++)
{
nn1[i]=nn1[i]+bb1[i];
aa1[i]=f1(nn1[i]);
}
for(i=0;i<s2;i++)
{
nn2[i]=0.0f;
for(j=0;j<s1;j++)
{
nn2[i]=nn2[i]+ww2[i][j]*aa1[j];
}
}
for(i=0;i<s2;i++)
{
nn2[i]=nn2[i]+bb2[i];
aa2[i]=f1(nn2[i]);
}
for(i=0;i<s3;i++)
{
nn3[i]=0.0f;
for(j=0;j<s2;j++)
{
nn3[i]=nn3[i]+ww3[i][j]*aa2[j];
}
}
for(i=0;i<s3;i++)
{
nn3[i]=nn3[i]+bb3[i];
aa3[i]=f3(nn3[i]);
}
/********************************************************************************/
fprintf(fp1,"\n");
for(i=0;i<s3;i++)
{
fprintf(fp1,"%f",aa3[i]);
}
fclose(fp0);
fclose(fp1);
return 0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -