/************************************/
/* Hopfieldネットワーク(連想記憶) */
/* Coded by Y.Suganuma) */
/************************************/
import java.io.*;
import java.util.*;
public class Hopfield_d {
public static void main(String args[])
{
int a[][] = {{0, 0, 1, 1, 0, 0,
0, 0, 1, 1, 0, 0,
0, 0, 1, 1, 0, 0,
0, 0, 1, 1, 0, 0,
0, 0, 1, 1, 0, 0,
0, 0, 1, 1, 0, 0},
{0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0},
{1, 1, 0, 0, 0, 0,
1, 1, 1, 0, 0, 0,
0, 1, 1, 1, 0, 0,
0, 0, 1, 1, 1, 0,
0, 0, 0, 1, 1, 1,
0, 0, 0, 0, 1, 1}};
int W[][] = new int [36][36], n = 36, p = 3;
// 重みの設定(学習)
for (int i1 = 0; i1 < n-1; i1++) {
for (int i2 = i1+1; i2 < n; i2++) {
W[i1][i2] = 0;
for (int i3 = 0; i3 < p; i3++)
W[i1][i2] += (2 * a[i3][i1] - 1) * (2 * a[i3][i2] - 1);
W[i2][i1] = W[i1][i2];
}
}
for (int i1 = 0; i1 < n; i1++)
W[i1][i1] = 0;
// 初期状態
Random rn = new Random();
Console con = System.console();
String line = con.readLine("パターン番号と修正ユニット数 ");
StringTokenizer str = new StringTokenizer(line, " ");
int pn = Integer.parseInt(str.nextToken());
int m = Integer.parseInt(str.nextToken());
int u[] = new int [36];
for (int i1 = 0; i1 < n; i1++)
u[i1] = a[pn][i1];
for (int i1 = 0; i1 < m; i1++) {
int k = (int)(rn.nextDouble() * n);
if (k >= n)
k = n - 1;
if (u[k] > 0)
u[k] = 0;
else
u[k] = 1;
}
con.printf("初期状態:\n");
int k = 0;
for (int i1 = 0; i1 < 6; i1++) {
for (int i2 = 0; i2 < 6; i2++) {
con.printf("%2d", u[k]);
k++;
}
con.printf("\n");
}
// 更新
int count1 = 0, count2 = 0, count3 = 0;
while (count1 < 100) {
count2++;
boolean sw = false;
k = (int)(rn.nextDouble() * n);
if (k >= n)
k = n - 1;
int s = 0;
for (int i1 = 0; i1 < n; i1++)
s += W[k][i1] * u[i1];
if (s >= 0) {
if (u[k] == 0) {
sw = true;
u[k] = 1;
}
}
else {
if (u[k] > 0) {
sw = true;
u[k] = 0;
}
}
if (sw) {
count1 = 0;
count3++;
}
else
count1++;
}
// 結果
con.printf("試行回数 = %d,更新回数 = %d\n", count2, count3);
k = 0;
for (int i1 = 0; i1 < 6; i1++) {
for (int i2 = 0; i2 < 6; i2++) {
con.printf("%2d", u[k]);
k++;
}
con.printf("\n");
}
}
}