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

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

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]]
w = Array.new(36)
for i1 in 0 ... 36
	w[i1] = Array.new(36)
end
n = 36
p = 3
		# 重みの設定(学習)
for i1 in 0 ... n-1
	for i2 in i1+1 ... n
		w[i1][i2] = 0
		for i3 in 0 ... p
			w[i1][i2] += (2 * a[i3][i1] - 1) * (2 * a[i3][i2] - 1)
		end
		w[i2][i1] = w[i1][i2]
	end
end
for i1 in 0 ... n
	w[i1][i1] = 0
end
		# 初期状態
srand();
u = Array.new(36)
print("パターン番号と修正ユニット数 ")
s  = gets().split(" ")
pn = Integer(s[0]);
m  = Integer(s[1])
for i1 in 0 ... n
	u[i1] = a[pn][i1]
end
for i1 in 0 ... m
	k = Integer(rand(0) * n)
	if k >= n
		k = n - 1
	end
	if u[k] > 0
		u[k] = 0
	else
		u[k] = 1
	end
end

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