Задача моделирования цепи Маркова методом Монте-Карло

Я пытаюсь запустить симулятор MC для цепи Маркова, которая равномерно распределена между всеми матрицами 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

person EhBabay    schedule 17.11.2014    source источник


Ответы (1)


Я замечаю две вещи:

Сначала в строке 12 у вас есть T=M, и я предполагаю, что вы хотите T=M.copy(). Выполнение T=M заставляет T и M ссылаться на одну и ту же матрицу, поэтому изменение значения в T также повлияет на M. Если вы назначите копию M для T, этого не произойдет.

Во-вторых, T not in State_Space не проверяет T в массиве State_Space. Из-за того, как работает числовое индексирование, оператор 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)

После запуска у меня есть ~ 90 записей в State_Space.

person kalhartt    schedule 17.11.2014
comment
Блестяще! Хорошо, я собираюсь запустить это в моем ide. Кстати, я использую Python 2.7, это на что-нибудь повлияет? - person EhBabay; 18.11.2014
comment
@kalharrt Я также могу задать вам еще один вопрос об этом коде, если это нормально. - person EhBabay; 18.11.2014
comment
Я только что отредактировал код, единственная разница заключалась в удалении скобок вокруг оператора печати. Вопросы приветствуются :) - person kalhartt; 18.11.2014
comment
у тебя есть время ответить еще на один вопрос? - person EhBabay; 18.11.2014
comment
@EhBabay конечно, просто спроси - person kalhartt; 18.11.2014
comment
пожалуйста, посмотрите мой пост под этим. - person EhBabay; 18.11.2014