0

我正在尝试开发一个元胞自动机模拟,问题是我想获得每个细胞的近邻和远邻(以蓝色和米色表示)并确定哪些细胞已经死亡并使用一些规则使它们复活。因此,在每次迭代中,我都会遍历数组中的所有单元格,并且我想以某种方式有效地获取这些单元格的所有近邻和远邻。

在此处输入图像描述

但是,根据网格上单元格的位置,只有一些邻居可用,到目前为止我想到的唯一方法是使用 getNeighbours(cell) 方法,该方法将返回一个包含所有可用邻居的列表我将不得不迭代以获得非生命的那个单元格。

getNeighbours(cell):
   If cell.row > 0:
       neighbours.add((coordinate,value),CLOSE_TOP_MIDDLE)
   If cell.row > 1:
       neighbours.add((coordinate,value),FAR_TOP_MIDDLE)
   [...]

然而,对于网格中的每个单元格,这是一个很大的开销和大量的比较!

是否有任何通常用于蜂窝自动化的通用方法?也许我可以使用任何数据结构?因为到目前为止,如果网格足够大,每次迭代都将花费大量时间。

4

1 回答 1

1

根据您使用的编程语言,可能会有提供所需功能的包。例如,在 Java 中,存在一个名为JCASim 的包:元胞自动机模拟系统

在 CA 中寻找邻居可能是一项不平凡的任务(例如,如果您使用六边形单元等)。甚至必须定义“邻居”一词:摩尔邻居冯诺依曼邻居(这些维基百科文章也提供了一些伪代码)。

在您的情况下,您可以自己实现邻居搜索:假设您的 CA 由n带有n列的行(标记为 0、...、n-1)组成,如图所示。

  1. 您的 getNeighbour 函数必须检查所有相邻单元格(图像中的灰色背景颜色)。
    • 如果您使用周期性边界条件,您可以使用模数运算符 (%) 来获得 9 个相邻单元格。在周期性边界条件下,单元 (x,y) 的相邻单元为:(x+1 % n, y), (x, y+1 % n), (x+1 % n, y+1 % n), (x+n-1 % n, y), (x, y+n-1 %n), ...)
    • 对于开放边界,您必须丢弃 x+1 > n-1, y+1 > n-1 或 x-1 < 0, y-1 < 0 的所有邻居
  2. 这样,您可以检查图片中所有背景颜色为灰色的单元格。
  3. 在每个灰色单元格上调用相同的函数。这样,您还可以检查具有蓝色背景颜色的单元格。
  4. 现在,您已经检查了您定义的邻域中的所有单元格
于 2015-10-16T09:11:35.140 回答