📄 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 + -