我正在尝试为马尔可夫链运行 MC 模拟器,该马尔可夫链均匀分布在所有没有相邻 1 的 NxN 矩阵中。我的算法应该通过多次运行链来填充状态空间。然而,我的逻辑在某个地方出现了严重错误,并且状态空间没有填满。任何帮助将不胜感激。这是我的代码。
import random
import numpy
M=numpy.zeros((52,52),dtype=int)
z=0
State_Space=[]
for i in range(1,100):
x=random.randint(1,50)
y=random.randint(1,50)
T=M
if T[x][y]==1:
T[x][y]=0
if T[x][y]==0:
T[x][y]=1
if T not in State_Space:
if T[x+1][y+1]==0 and T[x+1][y-1]==0 and T[x-1][y-1]==0 and T[x-1][y+1]==0:
State_Space.append(T)
M=T
else:
if T[x+1][y+1]==0 and T[x+1][y-1]==0 and T[x-1][y-1]==0 and T[x-1][y+1]==0:
M=T
print State_Space
最佳答案
我注意到两件事:
第 12 行首先有 T=M
我假设你想要 T=M.copy()
。做T=M
使 T 和 M 引用相同的矩阵,因此更改 T 中的值也会影响 M。如果您将 M 的副本分配给 T,则不会发生这种情况。
第二,T not in State_Space
不检查 State_Space 数组中的 T。由于 numpy 索引的工作原理,in 运算符不能用于数组。如果您尝试过 T in State_Space
使用非空 State_Space 你会得到一个关于真值模糊性的 ValueError 。相反,您需要检查 State_Space 的任何元素是否等于 T。我们应该使用 if any(numpy.array_equal(T, X) for X in State_Space):
最后,我的代码如下所示:
import random
import numpy
M=numpy.zeros((52,52),dtype=int)
z=0
State_Space=[]
for i in range(1,100):
x=random.randint(1,50)
y=random.randint(1,50)
T=M.copy()
if T[x][y]==1:
T[x][y]=0
if T[x][y]==0:
T[x][y]=1
if not any(numpy.array_equal(T, X) for X in State_Space):
if T[x+1][y+1]==0 and T[x+1][y-1]==0 and T[x-1][y-1]==0 and T[x-1][y+1]==0:
State_Space.append(T)
M=T
else:
if T[x+1][y+1]==0 and T[x+1][y-1]==0 and T[x-1][y-1]==0 and T[x-1][y+1]==0:
M=T
print len(State_Space)
运行后,State_Space 中有大约 90 个条目。
关于python - 马尔可夫链蒙特卡罗模拟问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26981519/