python实现细胞自动机的动画演示

本文介绍了约翰·康威设计的细胞自动机Life,其简单的规则在Python中通过编程实现,并展示了如何通过迭代更新细胞状态。作者还演示了如何将这些变化可视化为动态图像,最后生成了动画视频。
摘要由CSDN通过智能技术生成

约翰康威的细胞自动机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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值