我正在尝试为马尔可夫链运行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
答案 0 :(得分:1)
我注意到两件事:
在第12行中,您有T=M
,我认为您需要T=M.copy()
。执行T=M
会使T和M引用相同的矩阵,因此更改T中的值也会影响M.如果你将M的副本分配给T,那么这不会发生。
其次,T not in State_Space
未检查State_Space数组中的T.由于numpy索引的工作原理,in运算符不能用于数组。如果您使用非空State_Space尝试T in 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个条目。