细胞自动机获得非生活邻居

时间:2015-03-01 17:28:53

标签: cellular-automata

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

enter image description here

然而,取决于网格上单元格的位置,只有一些邻居可用,而我到目前为止这样做的唯一方法是使用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)
   [...]

然而,这需要很多开销,并且需要对网格中的每个单元格进行大量比较!

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

1 个答案:

答案 0 :(得分:1)

根据您使用的编程语言,可能会有包提供所需的功能。例如,在Java中,存在一个名为JCASim: Cellular automata simulation system的包。

在CA中查找邻居可能是一项非常重要的任务(例如,如果您使用六边形单元格等)。甚至必须定义术语“邻居”:Moore neighborhoodvon Neumann neighborhood(这些维基百科文章也提供了一些伪代码)。

在您的情况下,您可以自己实施邻居搜索: 假设您的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. 现在,您已检查了您定义的邻域中的所有单元格