алгоритм глубины в питоне не работает - PullRequest
3 голосов
/ 01 апреля 2011

У меня есть проект, который я решил сделать на Python. Вкратце: у меня есть список списков. У каждого из них также есть списки, иногда одноэлементные, иногда больше. Это выглядит так:

rules=[
[[1],[2],[3,4,5],[4],[5],[7]]
[[1],[8],[3,7,8],[3],[45],[12]]
[[31],[12],[43,24,57],[47],[2],[43]]
]

Смысл в том, чтобы сравнивать значения из массива numpy со значениями из этих правил (элементы таблицы правил). Мы сравниваем некоторую точку [x] [y] с первым элементом (например, 1 в первом элементе), затем, если это правда, значение [x-1] [j] из массива со вторым из списка и так далее. Пять первых сравнений должны быть верными, чтобы изменить значение точки [x] [y]. Я написал что-то вроде этого (основная функция - SimulateLoop, порядок переключен, потому что функция simulate2 была написана после второй):

def simulate2(self, i, j, w, rule):
        data = Data(rule)
        if w.world[i][j] in data.c:
            if w.world[i-1][j] in data.n:
                if w.world[i][j+1] in data.e:
                    if w.world[i+1][j] in data.s:
                        if w.world[i][j-1] in data.w:
                            w.world[i][j] = data.cc[0]
                        else: return
                    else: return
                else: return
            else: return
        else: return




def SimulateLoop(self,w):
    for z in range(w.steps):
            for i in range(2,w.x-1):
                for j in range(2,w.y-1):
                    for rule in w.rules:
                        self.simulate2(i,j,w,rule)

Класс данных:

class Data:
    def __init__(self, rule):
        self.c = rule[0]
        self.n = rule[1]
        self.e = rule[2]
        self.s = rule[3]
        self.w = rule[4]
        self.cc = rule[5]

Массив NumPy - это объект из мирового класса. Правила - это список, как описано выше, анализируемый функцией, полученной из другой программы (лицензия GPL).

Если честно, кажется, что он работает нормально, но это не так. Я пытался другие возможности, без удачи. Работает, интерпретатор не возвращает ошибок, но значения в массиве изменяются неправильно. Правила хороши тем, что они были предоставлены программой, из которой я получил парсер (лицензия GPL).

Может быть, это будет полезно - это петля Перье, модифицированная петля Лэнгтона (искусственная жизнь).

Буду очень благодарен за любую помощь! )

1 Ответ

0 голосов
/ 18 августа 2011

Я не знаком с циклом Perrier, но если вы кодируете что-то вроде знаменитой «игровой жизни», вы бы совершили простую ошибку: сохраните следующее поколение в том же массиве, повредив его.

Обычно вы сохраняете следующее поколение во временном массиве и выполняете копирование / замену после развертки, как показано на скриншоте:

def do_step_in_game_life(world):
    next_gen = zeros(world.shape)    # <<< Tmp array here
    Nx, Ny = world.shape
    for i in range(1, Nx-1):
        for j in range(1, Ny-1):
            neighbours = sum(world[i-1:i+2, j-1:j+2]) - world[i,j]
            if neighbours < 3:
                next_gen[i,j] = 0
            elif ...
    world[:,:] = next_gen[:,:]       # <<< Saving computed next generation
...