细胞自动机算法似乎不起作用

时间:2015-01-20 06:17:45

标签: python multithreading algorithm automata

我目前正致力于使用Python和libTCOD(仅用于“渲染”电路板)的电子仿真软件(非常基本的东西)。 所以,我有一个78x47的2D列表,它存储了电路板信息(单元类型,id,状态,coords ...)和一个简单的算法来模拟电线(wireworld)。 一切似乎都很顺利,除了一件事:“电子”只朝向电线的左侧移动。所以我认为它可能与运行算法的方式有关。

WireWorld导线有三种可能的状态:导体,尾部或头部。

  • 负责人:状态“2”,下一步改为Tail
  • 尾巴:状态“1”,在下一步中更改指挥
  • 指挥:状态“0”,是默认状态,如果1个单元范围内有任何头,则更改为Head

以下是模拟应该如何进行(H代表头部,t代表尾部, - 代表电线):

  • 第1步:---- H ----
  • 第2步:--- HtH ---
  • 第3步:--Ht-tH -
  • 第4步:-Ht --- tH -
  • 第5步:Ht ----- tH
  • 第6步:t ------- t
  • 第7步:---------

但这是目前发生的事情:

  • 第1步:---- H ----
  • 第2步:--- Ht ----
  • 第3步:--Ht -----
  • 第4步:-Ht ------
  • 第5步:Ht -------
  • 第6步:t --------
  • 第7步:---------

请参阅?电子头只朝向导线的左侧移动。

这是我目前的算法代码:

def run(self):
    for DX, DY in ((-1,-1), (-1,+0), (-1,+1), (+0,-1), (+0,+1), (+1,-1), (+1,+0), (+1,+1)):
        if BOARD[self.Y+DY][self.X+DX].STATE == 2 and self.STATE == 0:
            self.STATE = 2
            return True

        if self.STATE == 2:
            self.STATE = 1
        elif self.STATE == 1:
            self.STATE = 0

这就是我运行模拟步骤的方式:

for y in range(BOARD_HEIGHT):
    for x in range(BOARD_WIDTH):
        BOARD[y][x].run()

我是否需要在独立线程中模拟每个单元格?

1 个答案:

答案 0 :(得分:1)

不需要多线程,你只需要确保不止一个' - - >在每个模拟步骤中都可以进行H'转换。

我从你的代码开始编写了一个最小的例子(但是类布局略有不同):

class Simul(object):

    def __init__(self, width, height):
        board_1 = [[None for _ in range(width)] for _ in range(height)]
        board_2 = [[None for _ in range(width)] for _ in range(height)]
        self.boards = [board_1, board_2]
        self.current = 0
        self.pretty = {None: ' ', 0: '-', 1: 't', 2: 'H'}
        self.w = width
        self.h = height

    def print_board(self):
        for row in self.boards[self.current]:
            for cell in row:
                print(self.pretty[cell], end='')
            print()

    def run(self):
        BOARD = self.boards[self.current]
        other_board = self.boards[- self.current + 1]
        for row in range(self.h):
            for col in range(self.w):
                cur_cell = BOARD[row][col]
                set_h = False
                for DX, DY in ((-1,-1), (-1,+0), (-1,+1), (+0,-1), (+0,+1),  (+1,-1), (+1,+0), (+1,+1)):
                    try:
                        if BOARD[row+DY][col+DX] == 2 and cur_cell == 0:
                            other_board[row][col] = 2
                            set_h = True
                            break
                    except IndexError:
                        pass

                if set_h:
                    continue

                if cur_cell == 2:
                    other_board[row][col] = 1
                elif cur_cell == 1:
                    other_board[row][col] = 0
                elif cur_cell == 0:
                    other_board[row][col] = 0
        self.current = - self.current + 1




if __name__ == '__main__':
    simul = Simul(10, 5)
    for col in range(10):
        simul.boards[0][3][col] = 0
    for row in range(3):
        simul.boards[0][row][4] = 0
    simul.boards[0][3][4] = 2
    simul.print_board()
    simul.run()
    simul.print_board()

输出:

    -     
    -     
    -     
----H-----

    -     
    -     
    H     
---HtH----