约翰康威的细胞自动机Life
详见:百度安全验证
此细胞自动机是由剑桥数学家约翰·霍顿·康威(John Horton Conway)于1970年设计的,并在马丁·加德纳(Martin Gardner)的《科学美国人》专栏(1970年10月和1971年2月)公开了此设计。
Life中的规则很简单。即宇宙是一个矩形网格,每个网格方格代表一个细胞,它可以是活的也可以是死的。
每个细胞显然有八个相邻细胞,每一代细胞的情况取决于与之相邻细胞的数目:
N Next generation:2 No change, 3 Alive or On, 0,1,4-8 Dead or off
请注意,此规则非常简单。想象如果你是一个巨大矩形细胞中间的细胞,你就知道你该做什么了。你只需计算与你相邻的八个细胞中有多少是活着的,如果结果为3,则将你的状态设置为“开启”(无论当前你是开启还是关闭状态)。如果计算结果正好是2,那么你将不对当前状态进行更改,而对于任何其他值,你都需要把状态设置为“关闭”。
以下是演示这一过程的python代码:
import matplotlib.pyplot as plt
import numpy as np
# by John Horton Conway https://baijiahao.baidu.com/s?id=1629331712004653022
#此细胞自动机是由剑桥数学家约翰·霍顿·康威(John Horton Conway)于1970年设计的,
#并在马丁·加德纳(Martin Gardner)的《科学美国人》专栏(1970年10月和1971年2月)公开了此设计
#N Next generation: 2 No change, 3 Alive or On 0,1,4-8 Dead or off
H,W = 50,50
im = np.zeros((H,W),dtype=int)
def conway_rule(ih,iw):
global im
score = np.sum(im[max(0,ih-1):min(ih+2,H-1), max(0,iw-1):min(iw+2,W-1)]) - im[ih,iw]
#if score !=0: print('ih,iw,im[ih,iw],score=',ih,iw,im[ih,iw],score)
return [0,0,im[ih,iw],1,0,0,0,0,0][score]
def conways_life(N_points,loop):
global im
n,r = N_points//2,N_points%2
if 1: #life
im[H//2-n:H//2+n+r,W//2] = [1] * N_points
else:#glider
im[H//2-1:H//2+2,W//2-1:W//2+2] = np.array([[0,0,1],[1,0,1],[0,1,1]])
im1 = [[0 for i in range(W)] for j in range(H)]
if True:
for j in range(H):
for i in range(W):
im1[j][i] = conway_rule(j,i)
im = np.array(im1)
if np.sum(im)==0:
print("loop %d: all 0s!"%loop)
def visualize(N=0):
img = np.zeros((H*8,W*8,3),dtype="uint8")
for i in range(H*8):
for j in range(W*8):
img[i,j,0] = 255 if im[i>>3,j>>3]==1 else 0
#cv2.imwrite("conways_life_%d.png"%N,img)
return img
# 打开交互模式
plt.ion()
fig1 = plt.figure('conways_life',figsize=(8,8))
numsFrame = 20
for ii in range(0, numsFrame):
# 进行自己的处理
#conways_life(19,ii)
#conways_life(3,ii)
conways_life(6,ii)
img = visualize(ii)
#--------动态显示----------#
ax1 = fig1.add_subplot(1, 1, 1)
ax1.axis('off') # 关掉坐标轴
ax1.imshow(img, cmap='brg')
#ax1.plot(p1[:, 0], p1[:, 1], 'g.')
#停顿时间
plt.pause(0.9)
#清除当前画布
fig1.clf()
plt.ioff()
将生成的图片保存为动画视频
def gen_vedio(N_points,li_img):
fps,seconds =5, len(li_img)//5
size = (li_img[0].shape[0],li_img[0].shape[1])
#video = cv2.VideoWriter(f"./conwayslife_seed%d.avi"%N_points, cv2.VideoWriter_fourcc(*'XVID'), fps, size)
video = cv2.VideoWriter(f"./conwayslife_seed%d.mp4"%N_points, cv2.VideoWriter_fourcc(*'mp4v'), fps, size)
for _ in range(fps*seconds):
img = li_img[ _ ]
video.write(img) # fps=5,一秒5帧画面,5*2为2秒画面
video.release()
if 1:
li_img,N_points = [],23
for ii in range(100):
conways_life(N_points,ii)
li_img.append( visualize(ii) )
gen_vedio(N_points,li_img)