Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 马尔可夫链蒙特卡罗模拟问题_Python_Montecarlo_Markov Chains_Stochastic Process - Fatal编程技术网

Python 马尔可夫链蒙特卡罗模拟问题

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=

我正在尝试为马尔可夫链运行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不在状态空间中
没有检查状态空间数组中的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当然,只要问就行了