具有多重处理能力的n维元胞自动机。
cellular-automaton的Python项目详细描述
细胞自动机
这个包为Python 3
细胞自动机定义了一个细胞网格和一组规则。 然后,所有的细胞都会根据它们的邻居同时进化出它们的状态。
有关细胞自动机的更多信息,请参见mathworld.wolfram.com
又是一个细胞自动机模块?
它不是第一个提供细胞自动机的python模块, 但据我所知,第一款提供了以下所有功能:
- 易于使用
- n维
- 支持多进程
- 速度优化
- 记录在案
- 测试
我本来不打算写一个新的细胞自动机模块, 但是当我搜索一个时,我发现有些文档很少或者根本没有api文档,它们真的不符合我的需求 和/或迫切需要重构的代码。
所以我开始编写自己的模块,目的是提供一个用户友好的api 以及可接受的文件。在实施过程中,我想,为什么不提供 n维支持和读罗伯特c马丁的干净代码 要有一个干净的、经过测试的、覆盖率不错的代码,还需要增加一些要求。 速度优化和多过程能力对我来说是更大的挑战。 虽然模块现在达到了可接受的速度,但仍有改进的余地(例如,使用numba?).
用法
要启动和使用自动机,您必须定义三件事:
- 邻居
- 网格的尺寸
- 进化规律
neighborhood=MooreNeighborhood(EdgeRule.IGNORE_EDGE_CELLS)ca=CAFactory.make_single_process_cellular_automaton(dimension=[100,100],neighborhood=neighborhood,rule=MyRule)
邻里
邻域在相对坐标中为单元邻域定义。 细胞的进化将完全取决于这些邻居。
作为参数传递给邻域的边缘规则定义了如何处理网格边缘上的单元格。 有三个选项:
- 忽略边缘细胞:边缘细胞将没有邻居,因此不会进化。
- 忽略丢失的邻居:边缘单元将添加存在的邻居。这会导致边缘单元上的邻居计数不同。
- 每个维度的第一个和最后一个单元格是邻居:所有的单元格都具有相同的邻居计数,并且没有边缘存在。
尺寸
表示每个维度大小的列表或元组。 上面的示例定义了一个包含100 x 100个单元格的二维网格。
除了内存和处理器的能力之外,您选择的维度没有限制。
规则
规则有三个任务:
- 设置所有单元格的初始值。
- 进化出一个与其相邻的细胞。
- (可选)定义单元格的绘制方式。
classMyRule(Rule):definit_state(self,cell_coordinate):return(1,1)defevolve_cell(self,last_cell_state,neighbors_last_states):returnself._get_neighbor_by_relative_coordinate(neighbors_last_states,(-1,-1))defget_state_draw_color(self,current_state):return[255ifcurrent_state[0]else0,0,0]
从cellular_automaton.rule:Rule
继承,定义演化规则和初始状态。
可视化
该软件包为常见的二维自动机提供了一个pygame窗口中的可视化模块。
要添加另一种显示选项,例如,对于其他维度或六边形网格,可以拉伸提供的实现或构建自己的实现。 该模块的可视部分是完全解耦的,因此应该易于更换。
示例
该软件包包含两个示例:
这些示例自动化实现应该为您自己的项目提供一个良好的开端。
参与
请随意打开拉取请求,发送我的功能请求,甚至作为开发人员加入。 还有很多工作要做。
对所有其他人来说,当你有问题的时候,不要犹豫打开问题!
依赖关系
对于元胞自动机的直接使用,则不存在依赖关系。 但是,如果要使用display选项或执行示例,则必须安装 pygame对于vis形象化。 如果出于某种原因不想使用此引擎,则只需从display.drawengine继承并覆盖 必要的方法。(有关如何执行此操作的示例,请参见./test/test_display.py)
许可证
此包在Apache License, Version 2.0下分发,请参见LICENSE.txt