Hopfieldネットワーク(連想記憶)

# -*- coding: UTF-8 -*-
import numpy as np
import sys
from math import *
from random import *

#####################################
# Hopfieldネットワーク(連想記憶)
#      Coded by Y.Suganuma
#####################################

a = np.array([[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]], np.int)
W = np.empty((36, 36), np.int)
n = 36
p = 3
		# 重みの設定(学習)
for i1 in range(0, n-1) :
	for i2 in range(i1+1, n) :
		W[i1][i2] = 0
		for i3 in range(0, p) :
			W[i1][i2] += (2 * a[i3][i1] - 1) * (2 * a[i3][i2] - 1)
		W[i2][i1] = W[i1][i2]
for i1 in range(0, n) :
	W[i1][i1] = 0
		# 初期状態
u  = np.empty(36, np.int)
s  = input("パターン番号と修正ユニット数 ").split()
pn = int(s[0]);
m  = int(s[1])
for i1 in range(0, n) :
	u[i1] = a[pn][i1]
for i1 in range(0, m) :
	k = int(random() * n)
	if k >= n :
		k = n - 1
	if u[k] > 0 :
		u[k] = 0
	else :
		u[k] = 1

print("初期状態:")
k = 0
for i1 in range(0, 6) :
	for i2 in range(0, 6) :
		print(" " + str(u[k]), end="")
		k += 1
	print()
		# 更新
count1 = 0
count2 = 0
count3 = 0
while count1 < 100 :
	count2 += 1
	sw = 0
	k  = int(random() * n)
	if k >= n :
		k = n - 1
	s = 0
	for i1 in range(0, n) :
		s += (W[k][i1] * u[i1])
	if s >= 0 :
		if u[k] == 0 :
			sw   = 1
			u[k] = 1
	else :
		if u[k] > 0 :
			sw   = 1
			u[k] = 0
	if sw > 0 :
		count1  = 0
		count3 += 1
	else :
		count1 += 1
		# 結果
print("試行回数 = " + str(count2) + ",更新回数 = " + str(count3))
k = 0
for i1 in range(0, 6) :
	for i2 in range(0, 6) :
		print(" " + str(u[k]), end="")
		k += 1
	print("")