【问题标题】:Cellular automation get non-living neighbours蜂窝自动化获得无生命的邻居
【发布时间】:2015-03-01 17:28:52
【问题描述】:

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

但是,根据网格上单元格的位置,只有一些邻居可用,到目前为止,我想到的唯一方法是使用 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)
   [...]

但是,对于网格中的每个单元格,这需要大量开销和大量比较!

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

【问题讨论】:

    标签: cellular-automata


    【解决方案1】:

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

    在 CA 中查找邻居可能是一项不平凡的任务(例如,如果您使用六边形单元格等)。甚至必须定义“邻居”一词:Moore neighborhoodvon Neumann neighborhood(这些 Wikipedia 文章也提供了一些伪代码)。

    在您的情况下,您可以自己实现邻居搜索: 假设您的 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
    2. 这样,您可以检查图片中所有背景颜色为灰色的单元格。
    3. 在每个灰色单元格上调用相同的函数。这样您还可以检查具有蓝色背景颜色的单元格。
    4. 现在,您已经检查了您定义的邻域中的所有单元格

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-01
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      相关资源
      最近更新 更多