1

我正在尝试为马尔可夫链运行 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
4

1 回答 1

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 运算符不能用于数组。如果你尝试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 个条目。

于 2014-11-17T21:12:54.240 回答