Python代码实现模拟退火算法Boltzman机神经网络权重调节

Boltzman网络中,各神经元相互连接,相互影响; 按照异步网络更新原则(每次只更新一个神经元),对网络采用模拟退火算法更新各神经元的状态(状态值及阈值)及网络权重,可使得网络状态向能量最小化方向演化,从而,用于解决组合优化问题。


附上python代码的实现,以便学习参考:

#coding=utf-8
#在python3.4下运行
#boltzman机演示
from math import *
import random

print('=======Boltzman机工作原理演示程序======')
print('以3个神经元随机网络的相互作用为例,演示\n网络的能量状态变化')
print('=======================================')
T = 5
N = 3
W = {}
state = [0, 0, 0]
theta = [0, 0, 0]
for i in range(0, N-1):
	theta[i] = random.random()
	for j in range(i + 1, N):
		key = '%d_%d' % (i, j)
		W[key] = random.random()
		
print('神经元数量:', N)
print('网络初始温度:', T)
print(u"初始网络状态", state)
print('初始网络权重:', W)
print('网络初始阈值:', theta)

#计算网络能量
def getNetEnergy():
	energy = 0
	#设当前神经元为i
	for i in range(0, N):
		sm = 0
		#计算其他神经元对其影响
		for j in range(0, N):
			if (i != j):
				if i > j:
					key = '%d_%d' % (j, i)
				else:
					key = '%d_%d' % (i, j)
				sm = sm + W[key] * state[j]
		sm = -0.5 * state[i] * sm + theta[i] * state[i]
		energy = energy + sm
	return energy
	
while True:
	#确定激活神经元
	nn = int(ceil(random.random() * N) - 1)
	sm = 0
	for i in range(0, N):
		if (i != nn):
			if (i > nn):
				key = '%d_%d' % (nn, i)
			else:
				key = '%d_%d' % (i, nn)
			sm = sm + W[key] * state[i]
	sm = sm - theta[nn]
	if (sm > 0):
		#接受新状态改变为1
		state[nn] = 1
	else:
		#随机为1的概率
		T0 = -sm / T
		pr1 = 1 / (1 + exp(T0))
		r = random.random()
		if (pr1 > r):
			state[nn] = 1
		else:
			state[nn] = 0
	#输出网络状态与能量
	print('Energy(%d, %d, %d)=%f' % (state[0], state[1], state[2], getNetEnergy()) )
	#降温处理
	T = 0.95 * T
	if (sum(state) == 3):
		break
		
print('计算结果:')
print('神经元状态:', state)
print('权重:', W)
print(theta)
#输出网络能量
print('网络最终能量=%f' % (getNetEnergy()))


你可能感兴趣的:(神经网络,科学计算,Python)