康威生命游戏的Python实现
- 2019 年 12 月 12 日
- 笔记
康威生命游戏是康威提出的一种细胞繁殖的一种数学模型。
起始状态:细胞的状态不是“生”就是“死”,并且是随机的。
规则1:当周围的邻居细胞低于两个(不包含两个)存活时,该细胞变成死亡状态(模拟生命数量稀少)。
规则2:当周围有3个以上的存活细胞时,该细胞变成死亡状态(模拟生命数量过多)。
规则3:当周围有3个存活细胞时,则迭代后该细胞存活状态。
规则4:当周围有2个存活细胞时,该细胞保持原样。
分别对应下面四个图:




根据规则,用Python书写代码如下:
#!/usr/bin/env python
#coding:utf-8
'''
如果当前细胞周围细胞个数:
小与2个或者大于3个,这下一代死去
=3个:则下一代活着
=2个;则选一代保持不变
'''
import copy,random
#康威生命游戏规则
def life_rule(cell):
new_cell = copy.deepcopy(cell)
width = len(cell)
higth = len(cell[0])
for x in range(width):
for y in range(higth):
new_cell[x][y] = judeg_current_node(cell,x,y,width,higth)
print(new_cell)
if new_cell != cell:
life_rule(new_cell)
#判断当前节点下一次迭代的生死
def judeg_current_node(cell,x,y,width,higth):
live = 0
#左上角
if x-1>0 and y-1>0:
live+=cell[x-1][y-1]
#上边
if y-1>0:
live+=cell[x][y-1]
#右上角
if x+1<width and y-1>0:
live+=cell[x+1][y-1]
#左边
if x-1>0:
live+=cell[x-1][y]
#右边
if x+1<width:
live+=cell[x+1][y]
#左下角
if x-1>0 and y+1<higth:
live+=cell[x-1][y+1]
#下边
if y+1<higth:
live+=cell[x][y+1]
#右下角
if x+1<width and y+1<higth:
live+=cell[x+1][y+1]
if live<2 or live>3:
return 0
elif live == 3:
return 1
elif live ==2:
return cell[x][y]
#随机产生细胞
def create_cell(x,y):
cell1=[]
for i in range(x):
cell2=[]
for j in range(y):
cell2.append(random.randint(0,1))
cell1.append(cell2)
return cell1
if __name__=="__main__":
#1活,0死
cell = create_cell(5,5)
life_rule(cell)
根据测试结果,有些时候所有细胞都死亡,有些时候进行几次繁衍,细胞达成一个稳态,还有一次迭代超过了Python的最大迭代次数后仍旧没有达到稳态。康威生命游戏说明,当周围细胞过多的时候,细胞为了争夺资源最后全部灭亡(比如列表中的值都为1);当周围细胞过少的时候,没有互相协助也将全部灭亡(比如列表中的值大部分为0)。下面为一个经过九次繁殖达到一个稳态的例子。
[[0, 1, 1, 1, 0], [1, 1, 1, 1, 0], [0, 0, 0, 1, 0], [0, 1, 0, 0, 1], [0, 0, 1, 0, 0]]
[[1, 1, 0, 1, 0], [0, 0, 1, 1, 0], [1, 1, 0, 1, 1], [0, 0, 1, 1, 0], [0, 0, 0, 0, 0]]
[[0, 0, 0, 1, 0], [0, 0, 1, 1, 1], [0, 1, 0, 0, 1], [0, 0, 1, 1, 1], [0, 0, 0, 0, 0]]
[[0, 0, 1, 1, 1], [0, 0, 1, 1, 1], [0, 1, 0, 0, 0], [0, 0, 1, 1, 1], [0, 0, 0, 1, 0]]
[[0, 0, 1, 0, 1], [0, 0, 1, 1, 0], [0, 1, 0, 0, 0], [0, 0, 1, 1, 1], [0, 0, 1, 1, 1]]
[[0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 1, 0, 0, 1], [0, 1, 0, 0, 1], [0, 0, 1, 0, 1]]
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 1, 1, 1, 0], [0, 1, 1, 0, 1], [0, 0, 0, 1, 0]]
[[0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 1, 0, 1, 0], [0, 1, 0, 0, 1], [0, 0, 1, 1, 0]]
[[0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 1, 0, 1, 0], [0, 1, 0, 0, 1], [0, 0, 1, 1, 0]]
在这个例子中,在一个5X5=25的细胞组织中,7个细胞处于存活状态。下面的例子中,细胞经过5次繁殖均全部死亡
[[1, 1, 1, 0, 0], [0, 0, 0, 0, 0], [0, 1, 0, 0, 1], [0, 1, 1, 0, 1], [0, 1, 1, 0, 0]]
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 1, 1, 1, 0], [1, 0, 0, 0, 0], [0, 1, 1, 1, 0]]
[[0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [1, 0, 0, 0, 0], [0, 0, 1, 0, 0]]
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]