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

📄 hopfield.c

📁 离散型hopfield源码
💻 C
字号:
/*hopfield network model*/
#include <stdio.h>
#include <stdlib.h>
#define UNIT 4
#define STATE 16
void setstate(int num);
int energy(int v[]);
void initializerandom(int seed);
void evolution (int n);
int randomnumber(int start,int end);
void weightinitialization(int magnitude); //初始化权重
int getmininumenergystate(void);//获取最小的能量状态
int getstatenumber(int v[]); //获取状态编号
int w[UNIT][UNIT];
int v[UNIT];
int e[STATE];

void initializerandom(seed)
int seed;
{
   srand(seed);
}
int randomnumber(start,end)
int start,end;
{
   return(start+rand()%(end-start+1));
}
void evolution (n)
int n;
{
   int i;
   int ui;/*total input sum of neuron i*/
      /*w[i][i] -->thresh of neuron i (神经元i的阈值)*/
   ui=w[n][n]*(1-v[n]);
   for (i=0;i<UNIT;i++)
      ui+=w[n][n]*v[i];
   if (ui>=0)
      v[n]=1;
   else
      v[n]=0;
}
//计算能量
int energy(v)
int v[UNIT];
{
    int i,j;
    int e;
    for(i=0,e=0;i<UNIT;i++)
      {
       for(j=i+1;j<UNIT;j++)
	 e-=w[i][j]*v[i]*v[j];
       e-=w[i][i]*v[i];
       }
       return(e);
}

int getstatenumber(v)
int v[UNIT];
{
   int i,m,n;
   for(i=0,m=1,n=0;i<UNIT;i++,m*=2)
       n+=v[i]*m;
   return(n);
}
void setstate(num)
int num;
{
   int i;
   for(i=0;i<UNIT;i++)
       v[i]=0;
   for(i=0;num>0;i++)
   {
      if(num%2==0)
	 v[i]=0;
      else
	 v[i]=1;
      num/=2;
   }
}
int getmininumenergystate()
{
   int i,smin,emin;
   for(i=0;i<STATE;i++)
   {
     setstate(i);
     e[i]=energy(v);
     if(i==0)
     {
	smin=0;
	emin=e[0];
     }
     else if(e[i]<emin)
     {
       smin=i;
       emin=e[i];
     }
   }
   return(smin);
}

void weightinitialization(magnitude)
int magnitude;
{
   int i,j;
   for(i=0;i<UNIT;i++) {
     for(j=i;j<UNIT;j++) {
       w[i][j]=randomnumber(0,2*magnitude)-magnitude;
       w[j][i]=w[i][j];
     }
   }
}
void main(argc,argv)
int argc;
char *argv[];
{
   int i,j,smin;
   int magnitude=128;
   int seed     =7;
   int iteration=30;
   for(i=1;i<argc;i++) {
    switch(*(argv[i]+1)) {
      case 'm':
	magnitude=atoi(argv[++i]);
	break;
      case 'r':
	seed=atoi(argv[++i]);
	break;
      case 'i':
	iteration=atoi(argv[++i]);
	break;
      defualt:
	fprintf(stderr,"Usage : %s\n",argv[0]);
	fprintf(stderr,"\t-m  : magnitude(%d)\n",magnitude);
	fprintf(stderr,"\t-r  : random-seed(%d)\n",seed);
	fprintf(stderr,"\t-i  : iteration(%d)\n",iteration);
	exit(0);
	break;
      }
    }
    initializerandom(seed);
    weightinitialization(magnitude);
    smin=getmininumenergystate();
    printf("\t state    Energy    Time-Evolution\n");
    for(i=0;i<STATE;i++) {
       setstate(i);
       printf("\t [  %x    : %6d] --->",i,e[i]);
       for(j=0;j<iteration;j++) {
	  evolution(randomnumber(0,UNIT-1));
	  printf("%x",getstatenumber(v));
       }
       if(getstatenumber(v)==smin) printf("Global\n");
       else
       printf("Local\n");
    }
}

⌨️ 快捷键说明

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