生命游戏——元胞自动机初探
1. 介绍
康威生命游戏(英语:Conway's Game of Life),又称康威生命棋,是英国数学家约翰·何顿·康威在1970年发明的。
生命游戏中,对于任意细胞,规则如下:
- 每个细胞有两种状态 存活或死亡,每个细胞与以自身为中心的周围八格细胞产生互动(如图,黑色为存活,白色为死亡)
- 当前细胞为存活状态时,当周围的存活细胞低于2个时(不包含2个),该细胞变成死亡状态。(模拟生命数量稀少)
- 当前细胞为存活状态时,当周围有2个或3个存活细胞时,该细胞保持原样。
- 当前细胞为存活状态时,当周围有超过3个存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)
- 当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。(模拟繁殖)
2. 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)
for i in range(0,length):
for j in range(0,width):
cell_temp[i][j] = random.randint(0,1)
#当所有细胞状态不变时结束
#可能存在棋盘一直周期性变化,此时如果需要结束可手动结束
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
转载自:https://juejin.cn/post/7125797602548776973