更改

跳到导航 跳到搜索
第105行: 第105行:  
==算法==
 
==算法==
 
在具有未知前景的早期模式,如 R-pentomino,使世界各地的计算机程序员编写程序来跟踪生命模式的演变。 大多数早期的算法是相似的: 它们将生命模式表示为计算机内存中的二维数组。 通常使用两个数组: 一个用于保存当前生成,另一个用于计算其后续数组。 通常0和1分别代表死细胞和活细胞。 嵌套的 for 循环依次考虑当前数组的每个元素,计算每个单元格的活动邻居,以决定后续数组的相应元素是0还是1。对于下一次迭代,数组交换角色,以便上一次迭代中的后继数组成为下一次迭代中的当前数组。
 
在具有未知前景的早期模式,如 R-pentomino,使世界各地的计算机程序员编写程序来跟踪生命模式的演变。 大多数早期的算法是相似的: 它们将生命模式表示为计算机内存中的二维数组。 通常使用两个数组: 一个用于保存当前生成,另一个用于计算其后续数组。 通常0和1分别代表死细胞和活细胞。 嵌套的 for 循环依次考虑当前数组的每个元素,计算每个单元格的活动邻居,以决定后续数组的相应元素是0还是1。对于下一次迭代,数组交换角色,以便上一次迭代中的后继数组成为下一次迭代中的当前数组。
 +
 +
 
对这个基本方案进行各种小的改进是可能的,并且有许多方法可以节省不必要的计算。 如果一个单元格在上一个时间步骤中没有发生更改,而且其邻居也没有发生更改,则保证该单元格在当前时间步骤中也不发生更改。 因此,跟踪哪些区域处于活动状态的程序可以通过不更新非活动区域来节省时间。
 
对这个基本方案进行各种小的改进是可能的,并且有许多方法可以节省不必要的计算。 如果一个单元格在上一个时间步骤中没有发生更改,而且其邻居也没有发生更改,则保证该单元格在当前时间步骤中也不发生更改。 因此,跟踪哪些区域处于活动状态的程序可以通过不更新非活动区域来节省时间。
为了避免计数循环中的决定和分支,规则可以从内域对其邻域的以自我为中心的方法重新安排到科学观察者的观点: 如果一个给定邻域的所有九个场之和为三,下一代的内域状态将是生存; 如果全场和为四,内域保持其当前状态; 每个其他和将内场置于死亡。
+
 
 +
 
 +
为了避免计数循环中的决定和分支,规则可以以自我为中心的方法从内域对其邻域的重新设定,科学观察者的观点: 如果一个给定邻域的所有九个场之和为3,下一代的内域状态将是生存; 如果全场和为4,内域保持其当前状态; 其他的和,则内域状态是死亡。
 +
 
 
如果希望节省内存,可以将存储量减少到一个数组加两个行缓冲区。 一个行缓冲区用于计算一行的继承状态,然后第二个行缓冲区用于计算下一行的继承状态。 然后将第一个缓冲区写入其行,并释放以保存第三行的继承者状态。 如果使用环形数组,则需要第三个缓冲区,以便保存数组中第一行的原始状态,直到计算最后一行。
 
如果希望节省内存,可以将存储量减少到一个数组加两个行缓冲区。 一个行缓冲区用于计算一行的继承状态,然后第二个行缓冲区用于计算下一行的继承状态。 然后将第一个缓冲区写入其行,并释放以保存第三行的继承者状态。 如果使用环形数组,则需要第三个缓冲区,以便保存数组中第一行的原始状态,直到计算最后一行。
 +
 +
 
原则上,生命域是无限的,但计算机的内存是有限的。 当活动区域侵入阵列的边界时,这就会导致问题。 程序员使用了几种策略来解决这些问题。 最简单的策略是简单地假设阵列外的每个单元格都已死亡。 这是很容易编程,但会导致不准确的结果,使得活动区跨越边界。 一个更复杂的技巧是考虑将场的左右边缘结合在一起,以及顶部和底部边缘,生成一个环形阵列。 其结果是,跨越场边缘的活动区域在相反的边缘重新出现。还可以使用动态存储分配技术,创建越来越大的数组来保存生长模式。 有时对有限域上的生命进行明确的研究; 有些实现,例如 Golly,支持在标准无限域、一维无限域或有限域中进行选择,并可选择柱面、环面或[https://en.wikipedia.org/wiki/M%C3%B6bius_strip Möbius strip]。
 
原则上,生命域是无限的,但计算机的内存是有限的。 当活动区域侵入阵列的边界时,这就会导致问题。 程序员使用了几种策略来解决这些问题。 最简单的策略是简单地假设阵列外的每个单元格都已死亡。 这是很容易编程,但会导致不准确的结果,使得活动区跨越边界。 一个更复杂的技巧是考虑将场的左右边缘结合在一起,以及顶部和底部边缘,生成一个环形阵列。 其结果是,跨越场边缘的活动区域在相反的边缘重新出现。还可以使用动态存储分配技术,创建越来越大的数组来保存生长模式。 有时对有限域上的生命进行明确的研究; 有些实现,例如 Golly,支持在标准无限域、一维无限域或有限域中进行选择,并可选择柱面、环面或[https://en.wikipedia.org/wiki/M%C3%B6bius_strip Möbius strip]。
 +
 +
 
或者,程序员可以放弃用二维数组表示 Life 字段的概念,而使用不同的数据结构,例如用坐标对表示活细胞的向量。 这种方法允许模式在场中不受阻碍地移动,只要人口不超过活动坐标阵列的大小。 缺点是计算生存的邻居变成了散列表查找或搜索操作,降低了模拟速度。 使用更复杂的数据结构,这个问题也可以基本上得到解决。
 
或者,程序员可以放弃用二维数组表示 Life 字段的概念,而使用不同的数据结构,例如用坐标对表示活细胞的向量。 这种方法允许模式在场中不受阻碍地移动,只要人口不超过活动坐标阵列的大小。 缺点是计算生存的邻居变成了散列表查找或搜索操作,降低了模拟速度。 使用更复杂的数据结构,这个问题也可以基本上得到解决。
 +
 
对于在非常长的时间深度探索大型模式,像 Hashlife 这样的复杂算法可能是有用的。 还有一种方法,也适用于其他细胞自动机,用任意的异步更新来实现生命游戏,同时仍然完全模仿同步游戏的行为。 <ref> Nehaniv, Chrystopher L. (15–18 July 2002). Self-Reproduction in Asynchronous CellularAutomata (https://web.archive.org/web/20150403013723/http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=1029886). 2002 NASA/DoD Conference on Evolvable Hardware (http://ie
 
对于在非常长的时间深度探索大型模式,像 Hashlife 这样的复杂算法可能是有用的。 还有一种方法,也适用于其他细胞自动机,用任意的异步更新来实现生命游戏,同时仍然完全模仿同步游戏的行为。 <ref> Nehaniv, Chrystopher L. (15–18 July 2002). Self-Reproduction in Asynchronous CellularAutomata (https://web.archive.org/web/20150403013723/http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=1029886). 2002 NASA/DoD Conference on Evolvable Hardware (http://ie
 
eexplore.ieee.org/xpl/mostRecentIssue.jsp?punumber=8000). Alexandria, Virginia, USA: IEEEComputer Society Press. pp. 201–209. doi:10.1109/EH.2002.1029886 https://doi.org/10.1109%2FEH.2002.1029886). ISBN 0-7695-1718-8. Archived from the original (http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=1029886) on April 3, 2015. Retrieved 17 March 2015.</ref>在 Rosetta Code 中可以找到用各种编程语言(包括 c、 c + + 、 Java 和 Python)实现基本生命游戏场景的源代码示例。<ref> "Conway's Game of Life" (http://rosettacode.org/wiki/Conway%27s_Game_of_Life).</ref>
 
eexplore.ieee.org/xpl/mostRecentIssue.jsp?punumber=8000). Alexandria, Virginia, USA: IEEEComputer Society Press. pp. 201–209. doi:10.1109/EH.2002.1029886 https://doi.org/10.1109%2FEH.2002.1029886). ISBN 0-7695-1718-8. Archived from the original (http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=1029886) on April 3, 2015. Retrieved 17 March 2015.</ref>在 Rosetta Code 中可以找到用各种编程语言(包括 c、 c + + 、 Java 和 Python)实现基本生命游戏场景的源代码示例。<ref> "Conway's Game of Life" (http://rosettacode.org/wiki/Conway%27s_Game_of_Life).</ref>
      
==代码实现==
 
==代码实现==

导航菜单