【问题标题】:Cellular Automata algorithm doesn't seem to work元胞自动机算法似乎不起作用
【发布时间】:2015-01-20 06:17:45
【问题描述】:

我目前正在使用 Python 和 libTCOD(只是为了“渲染”电路板)开发电子模拟软件(非常基础的东西)。 所以,我有一个 78x47 的 2D 列表,其中存储了电路板信息(单元类型、ID、状态、坐标...)和一个简单的算法来模拟电线(wireworld)。 一切似乎都很好,除了一件事:“电子”只向电线的左侧移动。所以我认为这可能与它运行算法的方式有关。

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

  • Head:状态“2”,下一步更改为 Tail
  • 尾巴:状态“1”,下一步更改为导体
  • 导体:状态“0”,是默认状态,如果在 1 个单元格范围内有任何 Head,则更改为 Head

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

  • 第 1 步:----H----
  • 第 2 步:---HtH---
  • 第 3 步:--Ht-tH--
  • 第四步:-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.这是用于逻辑/数字电路还是模拟电路? 2. 我对状态值感到困惑,为什么你对 head 和 tail 有不同的含义?对于数字电路,电线侧一次输入或输出,所以为什么不对其进行编码并添加有关状态 L/H/Z 的信息(低、高、高阻抗)。那么你知道你只需要从输出传播到输入方向。每个组件的互连列表也是一个更好的方法。使用模拟电路,您需要存储每一侧的潜在信息并计算电流......和/或结合电流模拟......
  • 它更像是一个简单的图灵完备环境/沙盒。
  • 所以您的意思是序列组合逻辑(图灵自动机是基于磁带的计算机概念)在这种情况下,将其作为数字电路处理。每个 I/O 引脚都有其状态和互连列表。所以让每个 Gate;s 的输入生成输出引脚状态,然后将输出引脚状态传播到从互连列表连接到它的每个输入。
  • run方法每次迭代最多可以设置一个“wire”到“head”。我建议你使用两个BOARDs(顺便说一句,这里没有self?全局变量?)并且在第一次更改后不要return
  • 没有“自我”,因为有不同类型的“细胞”,每个都有自己的状态、属性和“运行”功能。每个“单元”类型都是一个类,而不是整个程序。

标签: python multithreading algorithm automata


【解决方案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----

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多