как исправить мой сотовый автомат, используя вложенную l oop in python - PullRequest
0 голосов
/ 06 апреля 2020

В большинстве кодов примеров из жизни, которые я видел в Интернете, использовались математические классы и логические выражения (true / false). Вместо этого я попытался создать одну функцию, которая выполняет итерацию по каждой ячейке в матрице, а затем обновляет всю матрицу в соответствии с правилами игры, а затем возвращает новую матрицу. Причина этого заключается в том, что для моего проекта я буду использовать предварительно подготовленные входные данные с матрицами одинакового размера.

Я думаю, что в настоящее время это может обновлять каждую ячейку по мере ее прохождения, а также вместо всех ячеек. Будучи только живым (1) или мертвым (0), он возвращает значения, например 118.

Пример входных данных показан ниже:

[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]

Это моя попытка до сих пор ... Я думаю, что моя проблема связана с типом данных в матрице (numpy int) - в одном случае я должен добавить их, чтобы найти число соседних ячеек (это определяет, умирает ли ячейка после следующего тика или поколения), а в другом я просто хочу переписать 1 или 0 в новом matix (в той же позиции, что и рассматриваемая ячейка входной матрицы) на основе соседей этой ячейки во входных данных.

вот моя попытка

def tick(matrix):
    new_state = np.empty_like(matrix)
    for i in range(17):
        for j in range(17):
            north = matrix[i][j-1]
            south = matrix[i][j+1]
            west = matrix[i+1][j]
            east = matrix[i-1][j]
            se = matrix[i+1][i+1]
            sw = matrix[i+1][i-1]
            ne = matrix[i-1][i+1]
            nw = matrix[i-1][i-1]
            neibours = np.sum([north, south, west, east, se, sw, ne, nw])
            if matrix[i][j] == '0' and neibours == 3:
                new_state [i][j] == '1'
            if matrix[i][j] == '1' and neibours<2:
                new_state [i][j] == '0'
            if matrix[i][j] == '1' and  neibours>4:
                new_state [i][j] == '0'
            if matrix[i][j] == '1' and neibours==2 or 3:
                new_state [i][j] == '1'
            return new_state

world2 = np.loadtxt('data/Loaf.txt',dtype=np.int8)
world3 = np.loadtxt('data/Pentadecathlon.txt',dtype=np.int8)        
world1 = np.loadtxt('data/Pulsar.txt',dtype=np.int8)
l = tick(world1)

print(l)

Я думаю, мне также понадобится добавить некоторое условие, которое касается элементов на краю матрицы, которые не имеют полного набора соседей. Я действительно потерялся в том, как бы я делал это в своей функции.

...