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

📄 bp.c

📁 用C语言写的hopfeild算法,误差精度为0.000001
💻 C
字号:
/*----------------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); 
} 

⌨️ 快捷键说明

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