Python 马尔可夫链蒙特卡罗模拟问题
我正在尝试为马尔可夫链运行MC模拟器,马尔可夫链均匀分布在没有相邻1的所有NxN矩阵中。我的算法应该通过多次运行链来填充状态空间。然而,我的逻辑在某个地方出现了可怕的错误,状态空间没有填满。任何帮助都将不胜感激。这是我的密码Python 马尔可夫链蒙特卡罗模拟问题,python,montecarlo,markov-chains,stochastic-process,Python,Montecarlo,Markov Chains,Stochastic Process,我正在尝试为马尔可夫链运行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=
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不在状态空间中
没有检查状态空间数组中的T。由于numpy索引的工作方式,in运算符不能用于数组。如果您尝试在状态空间中使用非空状态空间T,您将得到关于真值模糊性的ValueError。相反,您需要检查状态空间的任何元素是否等于T。我们应该使用如果有(numpy.array_equal(T,X)表示状态空间中的X):
最后,我的代码如下所示:
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)
跑步后,我在状态空间中有大约90个条目。太棒了!好的,我将在我的ide中运行这个。顺便说一句,我使用的是Python 2.7,这会有什么影响吗?@kalharrt如果可以的话,我可能还会再问你一个关于这段代码的问题。我刚刚编辑了这段代码,唯一的区别是删除了print语句周围的括号。欢迎提问:)你有时间再回答一个问题吗?@EhBabay当然,只要问就行了