康威生命游戏是康威提出的一种细胞繁殖的一种数学模型。
起始状态:细胞的状态不是“生”就是“死”,并且是随机的。
规则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]]