元胞自动机是很常用的传播/交通模型,因此写下这篇文章,以后忘了可以再翻看
元胞自动机元胞自动机又被称为康威生命游戏,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。它最初于1970年10月在《科学美国人》杂志上马丁·葛登能的“数学游戏”专栏出现
元胞自动机是一个零玩家游戏。他包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞。一个细胞在下一时刻的生死取决于相邻八个方格中或者的或死了的细胞数量
规则
每个细胞有两种状态-存活或死亡,每个细胞与以自身为中心的周围八格细胞产生互动:细胞过少:当周围低于2个(不包含2个)存活细胞时,本单元活细胞死亡
稳定:当周围有2个或3个存活细胞时,本单元细胞保持原样
人口过剩:当周围有3个以上的存活细胞时,本单元活细胞死亡
繁殖:当周围有3个存活细胞时,本单元细胞存活/活化
初看觉得这就是个模拟细胞繁衍的东西,规则也很简单。
随着游戏的进行,杂乱无序的细胞会逐渐演化出各种精致、有形的结构,这些结构往往有很好的对称性,而且每一代都在变化形状,一些形状已经锁定,不会逐代变化。有时,一些已经成形的结构会因为一些无序细胞的"入侵"而被破坏。但是形状和秩序经常能从杂乱中产生出来。对于生成的形状和秩序,我们称作pattern(模式)
开发准备
首先安装pygamepip install pygame
开发步骤
我们使用矩阵来记录我们的游戏世界,其中0表示细胞死亡,1表示细胞存活
感谢The Game of Life in Python这篇博文,一行代码解决了计算细胞周围活细胞数量的问题nbrs_count = sum(np.roll(np.roll(X, i, 0), j, 1)
for i in (-1, 0, 1) for j in (-1, 0, 1)
if (i != 0 or j != 0))
由于我们的游戏世界是上下左右循环的,所以将矩阵往8个方向进行循环移位得到8个新矩阵,将8个新矩阵相加就能得到每个细胞周围的活细胞数量矩阵了
np.roll操作就是循环移位操作。np.roll(X, i, 0)中的X代表输入矩阵ÿ