// PROGRAM hopfield #include "TrueBASIC.h" int main(); void memorize(int T[][51], int *N); void recall(int T[][51], int N); void convert(char* s, int N, int V[]); int main() { int N, T[51][51], i, j; for(i = 0; i < 51; ++i) for(j = 0; j < 51; ++j) T[i][j] = 0; memorize(T, &N); do { recall(T, N); } while(1); return 0; } void memorize(int T[][51], int *N) { int V[51], i, j, M, memory; char s[_LBUFF_], Stmp1_[_LBUFF_]; rnd(-1); printf("number of stored memories = "); fgets(Stmp1_, _LBUFF_, stdin); sscanf(Stmp1_, "%d", &M); // N は神経細胞の数 printf("size of memories = "); fgets(Stmp1_, _LBUFF_, stdin); sscanf(Stmp1_, "%d", N); printf("enter M strings of N 0's and 1's\n"); for(memory = 1; memory <= M; ++memory) { printf("? "); fgets(s, _LBUFF_, stdin); convert(s, *N, V); for(i = 1; i <= (*N); ++i) for(j = 1; j <= (*N); ++j) if(i != j) T[i][j] = T[i][j] + (2*V[i] - 1)*(2*V[j] - 1); } printf("\n"); } void recall(int T[][51], int N) { int V[51], i, j, kk, k, sum; char s[_LBUFF_]; printf("enter a string of N 0's and 1's\n"); printf("? "); fgets(s, _LBUFF_, stdin); convert(s, N, V); do { for(k = 1; k <= N; ++k) { i = (int)(N*rnd(0)) + 1; // 神経細胞をランダムに選ぶ sum = 0; for(j = 1; j <= N; ++j) if(i != j) sum = sum + T[i][j]*V[j]; if(sum > 0) V[i] = 1; // しきい値の上 else V[i] = 0; // しきい値の下 } for(i = 1; i <= N; ++i) printf("%1d", V[i]); printf("\n"); _sleep(1000); } while(!(kbhit())); kk = getch(); if(kk == 's') exit(0); } void convert(char* s, int N, int V[]) // 文字列を 0 と 1 の配列に変換 { int i; for(i = 1; i <= N; ++i) { if(s[i-1] == '0') V[i] = 0; else V[i] = 1; } }