Python实现元胞自动机(生命游戏)
Python 3.7.1
康威生命游戏(英语:Conway’s Game of Life),又称康威生命棋,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。
它最初于1970年10月在《科学美国人》杂志上马丁·葛登能的“数学游戏”专栏出现。
概述
生命游戏是一个零玩家游戏。它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去;相反,如果周围活细胞过少,这个细胞会因太孤单而死去。实际中,玩家可以设定周围活细胞的数目怎样时才适宜该细胞的生存。如果这个数目设定过高,世界中的大部分细胞会因为找不到太多的活的邻居而死去,直到整个世界都没有生命;如果这个数目设定过低,世界中又会被生命充满而没有什么变化。
例:
(图片来自维基百科条目:生命游戏)
Python代码实现
- 引入所需库
import numpy as np
import random
import copy
import matplotlib.pyplot as plt
- 设定元胞生长棋盘的大小
length = 100
width = 200
- 根据棋盘的长宽创建矩阵
cell = np.zeros((length,width),int)
cell_temp = copy.deepcopy(cell)
- 初始化矩阵为一个随机的0-1矩阵,1代表细胞生存,0代表细胞死亡
for i in range(0,length):
for j in range(0,width):
cell_temp[i][j] = random.randint(0,1)
-
进行下一次生存状态的判断
- 当前细胞为存活状态时,当周围的存活细胞低于2个时(不包含2个),该细胞变成死亡状态。(模拟生命数量稀少)
- 当前细胞为存活状态时,当周围有2个或3个存活细胞时,该细胞保持原样。
- 当前细胞为存活状态时,当周围有超过3个存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)
- 当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。(模拟繁殖)
#当所有细胞状态不变时结束
#可能存在棋盘一直周期性变化,此时如果需要结束可手动结束
while not(cell_temp==cell).all():
#通过读取cell矩阵,不断判断每一个单元格是存活还是死亡,将判断结果保存在cell_temp中,最终再复制给cell矩阵
cell = copy.deepcopy(cell_temp)
#显示每一轮的图像
plt.imshow(cell)
plt.pause(0.2)
#两重循环遍历整个矩阵,判断每个细胞下一个状态是生存还是死亡
for i in range(0,length):
for j in range(0,width):
'''
count保存一个细胞周围8个方格内有几个存活的细胞,注意这两将上下边界和左右边界连接起来进行判断,
如对于8*8的棋盘,[0,0]与[0,7]和[7,0]在逻辑上相邻
'''
count = cell[(i-1)%length][j] + cell[(i+1)%length][j] + cell[i][(j-1)%width] + cell[i][(j+1)%width] + cell[(i+1)%length][(j+1)%width] + cell[(i-1)%length][(j+1)%width] + cell[(i+1)%length][(j-1)%width] + cell[(i-1)%length][(j-1)%width]
#如果一个单元格是死亡,且周围是三个单元格则存活,否则保持死亡
if(cell[i][j] == 0 and count != 3):
continue
if(cell[i][j] == 0 and count == 3):
cell_temp[i][j] = 1
continue
#如果一个存活的单元格周围有2或3个单元格存活则该单元格继续存活,否则死亡
if(count == 2 or count ==3):
continue
cell_temp[i][j] = 0
运行结果示例
棋盘 40*80