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

📄 c语言神经网络.txt

📁 c语言的神经网络源程序
💻 TXT
字号:
附件不知为何粘不上,还是贴出来吧。 
/*----------------By ahzhming@163.com海阔天空-------------------------*/ 
#include <stdio.h> 
#include <math.h> 
#include <conio.h> 
#include <stdlib.h> 
#define nh 4 
#define ni 9 
#define nj 3 
#define nk 30 
#define nr 0.85/*学习效率*/ 
#define EPS 0.00001 

float x[nk][nh],d[nk][nj],whi[nh][ni],wij[ni][nj],thi[ni],thj[nj]; 
int h,i,j,k; 
float xmin[nh],xmax[nh],dmin[nj],dmax[nj]; 
FILE *fp1,*fp2; 

void init(void); 
void startleaning(void); 
void testsample(void); 
void readw(void); 
void writew(void); 
float sigmoid(float a); 
double ranu(void); 

void init(void) 
{int min,max; 

if(fp1==0) 
{ 
 clrscr(); 
 printf("Can not find the learning sample file!\n"); 
 exit(0); 
} 
for(k=0;k<nk;k++) 
 { 
  for(h=0;h<nh;h++) 
   fscanf(fp1,"%f",&x[k][h]); 
  for(j=0;j<nj;j++) 
   fscanf(fp1,"%f",&d[k][j]); 
 } 
 for(h=0;h<nh;h++) 
 { 
  min=1;max=1; 
  for(k=0;k<nk;k++) 
   { 
    if(x[k][h]<x[min][h]) min=k; 
    if(x[k][h]>x[max][h]) max=k; 
   } 
  xmin[h]=x[min][h]; 
  xmax[h]=x[max][h]; 
  for(k=0;k<nk;k++)/*归一化*/ 
  x[k][h]=(x[k][h]-xmin[h])/(xmax[h]-xmin[h]); 
 } 
for(j=0;j<nj;j++) 
 { 
  min=1;max=1; 
  for(k=0;k<nk;k++) 
   { 
    if(d[k][j]<d[min][j]) min=k; 
    if(d[k][j]>d[max][j]) max=k; 
   } 
   dmin[j]=d[min][j]; 
   dmax[j]=d[max][j]; 
  for(k=0;k<nk;k++)/*归一化*/ 
d[k][j]=(d[k][j]-dmin[j])/(dmax[j]-dmin[j]); 
  

 } 
} 
/*----------------------------------------------------*/ 
void startlearning(void) 
{ 
long int nt,n; 
float t,error[nk],gerror,xj[nj],xi[ni],yj[nj],yi[ni],pxi[ni],pxj[nj]; 
if(fp2==0) 
 { 
  for(i=0;i<ni;i++) 
   { 
    for(h=0;h<nh;h++) 
     whi[h]=-0.1+0.2*ranu(); 
    for(j=0;j<nj;j++) 
     wij[j]=-0.1+0.2*ranu(); 
    thi=-0.1+0.2*ranu(); 
   } 
   for(j=0;j<nj;j++) 
    thj[j]=-0.1+0.2*ranu(); 
   fp2=fopen("w.txt","w+"); 
 } 
else 
 readw(); 

/*学习开始*/ 
printf("\t\nPlease enter the learning times:\n"); 
scanf("%ld",&nt); 
for(n=0;n<nt;n++)   /*学习次数*/ 
{gerror=0; 
 for(k=0;k<nk;k++)/*单样本循环*/ 
  { 
    for(i=0;i<ni;i++) 
     { 
      t=0; 
      for(h=0;h<nh;h++) 
       t+=whi[h]*x[k][h]; 
      xi=t+thi; 
      yi=sigmoid(xi); 
     } 
     for(j=0;j<nj;j++) 
      { 
t=0; 
for(i=0;i<ni;i++) 
t+=wij[j]*yi; 
xj[j]=t+thj[j]; 
yj[j]=sigmoid(xj[j]); 
} 
      
      for(j=0;j<nj;j++)/*输出层单样本点误差变化率*/ 
pxj[j]=yj[j]*(1-yj[j])*(yj[j]-d[k][j]); 
      for(i=0;i<ni;i++)/*隐层单样本点误差变化率*/ 
       { 
t=0; 
for(j=0;j<nj;j++) 
 t+=pxj[j]*wij[j]; 
pxi=yi*(1-yi)*t; 
} 
       for(j=0;j<nj;j++) 
{thj[j]=thj[j]-nr*pxj[j]; 
 for(i=0;i<ni;i++) 
  wij[j]=wij[j]-nr*pxj[j]*yi; 
} 
      for(i=0;i<ni;i++) 
{thi=thi-nr*pxi; 
for(h=0;h<nh;h++) 
 whi[h]=whi[h]-nr*pxi*x[k][h]; 
} 

t=0; 
for(j=0;j<nj;j++) 
t+=(yj[j]-d[k][j])*(yj[j]-d[k][j])/2.0; 
error[k]=t; 
gerror+=error[k];/*全局误差 g(lobal)error*/ 
  }/*单样本循环结束*/ 
  if(gerror<EPS) break; 
}/* 学习循环结束*/ 
 writew(); 
 printf("\t\nGlobal error=%f\n",gerror); 
 printf("\t\nAre you satisfied with the global error?\n"); 
 printf("Press any key to choose a next task!\n"); 
 getch(); 

} 
/*-------------------------------------------------*/ 
void testsample(void) 
{float tx[nh],t,xj[nj],xi[ni],yj[nj],yi[ni]; 
 if(fp2==0) 
  { 
   clrscr(); 
   printf("\t\ncan not find the weight file:w.txt\n"); 
   exit(0); 
  } 
  readw(); 
  printf("\t\nPlease enter the test data:\n"); 
  for(h=0;h<nh;h++) 
  scanf("%f",&tx[h]); 
  for(h=0;h<nh;h++) 
   tx[h]=(tx[h]-xmin[h])/(xmax[h]-xmin[h]); 
  for(i=0;i<ni;i++) 
     { 
      t=0; 
      for(h=0;h<nh;h++) 
       t+=whi[h]*tx[h]; 
      xi=t+thi; 
      yi=sigmoid(xi); 
     } 
     for(j=0;j<nj;j++) 
      { 
t=0; 
for(i=0;i<ni;i++) 
t+=wij[j]*yi; 
xj[j]=t+thj[j]; 
yj[j]=sigmoid(xj[j]); 
} 
   printf("\t\nNetwork output:\n"); 
    
   for(j=0;j<nj;j++) 
    { 
    yj[j]=yj[j]*(dmax[j]-dmin[j])+dmin[j]; 
    printf("%f ",yj[j]); 
    } 
   printf("\t\nAre you satisfied with the output?\n"); 
   printf("Press any key to choose a next task!\n"); 
   getch(); 
} 
/*----------------------------------------------*/ 
void writew(void) 
{ 
rewind(fp2); 
for(h=0;h<nh;h++) 
 { 
  for(i=0;i<ni;i++) 
   fprintf(fp2,"%8.3f ",whi[h]); 
   fprintf(fp2,"\n"); 
 } 
fprintf(fp2,"\n"); 

for(i=0;i<ni;i++) 
 fprintf(fp2,"%8.3f ",thi); 
fprintf(fp2,"\n\n"); 

for(j=0;j<nj;j++) 
 { 
  for(i=0;i<ni;i++) 
   fprintf(fp2,"%8.3f ",wij[j]); 
  fprintf(fp2,"\n"); 
 } 
fprintf(fp2,"\n"); 
for(j=0;j<nj;j++) 
 fprintf(fp2,"%8.3f ",thj[j]); 
} 
/*------------------------------------------------*/ 
void readw(void) 
{ 
for(h=0;h<nh;h++) 
 for(i=0;i<ni;i++) 
   fscanf(fp2,"%f",&whi[h]); 
for(i=0;i<ni;i++) 
 fscanf(fp2,"%f",&thi); 
for(j=0;j<nj;j++) 
 for(i=0;i<ni;i++) 
  fscanf(fp2,"%f",&wij[j]); 
for(j=0;j<nj;j++) 
 fscanf(fp2,"%f",&thj[j]); 
} 
/*--------------------------------*/ 
float sigmoid(float a) 
{return(1.0/(1+exp(-a)));} 
/*----------------------------------*/ 
double ranu(void) 
{static double xrand=3.0; 
 double m=8589934592.0, 
a=30517578125.0; 
lp: xrand=fmod(xrand*a,m); 
   if(xrand>1.0) return(xrand/m); 
   else { xrand=1.0;goto lp;} 
} 
/*----------------------------------*/ 

void main() 
{ 
fp1=fopen("sample.txt","r"); 
fp2=fopen("w.txt","r+"); 
init(); 
 while(1) 
 {clrscr(); 
 printf("\t\n    Please choose a next task...\n\n"); 
 printf("\t\n     (S) to start learning.\n"); 
 printf("\t\n     (T) to test samples.\n"); 
 printf("\t\n     (R) to resume learning.\n"); 
 printf("\t\n     (Q)uit.\n"); 
 switch(getchar()) 
 {case 's': startlearning();break; 
  case 't': testsample();break; 
  case 'r': startlearning();break; 
  case 'q': exit(0);break; 
 } 
 } 
fclose(fp1); 
fclose(fp2); 
} 
/*----------------By ahzhming@163.com海阔天空-------------------------*/ 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -