1

隣接する 1 を持たないすべての NxN 行列に均一に分布するマルコフ連鎖の MC シミュレーターを実行しようとしています。私のアルゴは、チェーンを何度も実行して状態空間を埋めることになっています。しかし、私のロジックのどこかにひどく問題があり、状態空間がいっぱいになっていません。どんな助けでも大歓迎です。これが私のコードです。

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

私は2つのことに気づきます:

最初に 12 行目にありT=M、必要だと思いT=M.copy()ます。これを行うT=Mと、T と M は同じ行列を参照するようになるため、T の値を変更すると M にも影響します。M のコピーを T に割り当てると、これは起こりません。

次に、T not in State_SpaceState_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 に答える