元胞自动机(Cellular automata)

定义

  元胞自动机,也叫细胞自动机,是一种离散模型。散布在规则格网 (Lattice Grid)中的每一元胞(Cell)取有限的离散状态,遵循同样的作用规则,依据确定的局部规则作同步更新。大量元胞通过简单的相互作用而构成动态系统的演化。不同于一般的动力学模型,元胞自动机不是由严格定义的物理方程或函数确定,而是用一系列模型构造的规则构成。凡是满足这些规则的模型都可以算作是元胞自动机模型。因此,元胞自动机是一类模型的总称,或者说是一个方法框架。其特点是时间、空间、状态都离散,每个变量只取有限多个状态,且其状态改变的规则在时间和空间上都是局部的。以上摘自此网站
  元胞自动机可以分为一维和二维以及更高维,也有三角形和六角形等形式。我们从最简单的一维初等元胞自动机说起。对于每个格点的状态,我们用0和1表示,邻居半径为r,即局部映射时我们考虑当前格点与其左右格点的状态以确定其下一状态,用公式表示为:
S i t + 1 = f ( S i − 1 t , S i t , S i + 1 t ) S_{i}^{t+1}=f(S_{i-1}^{t},S_{i}^{t},S_{i+1}^{t}) Sit+1=f(Si1t,Sit,Si+1t)
一个简单的示例如下:

t111110101100011010001000
t+111001100

对于以上8种状态,每种状态有2种取值,所以此种自动机的局部变换规则一共有 2 8 = 256 2^8=256 28=256种。Wolfram研究了这类元胞自动机,并将其分为了四个种类:

  • 1类:几乎所有的初始模式迅速演变成一个稳定的,均匀的状态。在初始模式的任何随机性会消失。
  • 2类:几乎所有的初始模式迅速演化为稳定或振荡结构。一些在初始模式的随机性可能会被过滤掉,但是还有一些保留。
  • 3类:几乎所有的初始形态将会演变成一个伪随机或混沌的形式。任何稳定的结构很快会被周围的噪音破坏。在初始模式的局部变化有无限蔓延的倾向。
  • 4类:几乎所有的初始模式将会演变成相互作用的复杂和有趣的方式结构,并且局部结构的形成能够长时间存在。2类的稳定或振荡的结构可能是最终的结果,但需要达到这个状态的步骤数目可能是非常大的,即使在初始模式比较简单的情况下。初始模式的局部变化可能会无限蔓延。
      某些特定的元胞自动机是图灵完备的。下面我来介绍一些比较经典的元胞自动机。

实例

  • 康威生命游戏(Convay’s game of life)

    格点的邻居定义为东南西北,东北,西北,东南,西南这八个方位。
    规则如下:

    • 当格点处于1状态时:
      如果1类邻居的数量为2或3,则下一时刻该格点为1;否则为0
    • 当格点处于0状态时:
      如果1类邻居的数量为3,则下一时刻该格点为1;否则为0

    这和生命体的规律很类似,如果周围同类太少,则会因为"孤独"而死去;如果同类太多,又会因为竞争而"饿死"。
    代码实现如下:

    import matplotlib.pyplot as plt
    import numpy as np
    %matplotlib qt5
    def iterate(canvas):
     pre=canvas.copy()
     w,h=canvas.shape
     def getneighbors(pre,x,y):
         neighbors=0
         directions={(-1,-1),(-1,0),(-1,1),(-1,0),(1,0),(1,-1),(1,0),(1,1)}
         for dir in directions:
             i=dir[0]+x
             j=dir[1]+y
             if i>=0 and i<w and j>=0 and j<h and pre[i][j]==1:
                 neighbors+=1
         return neighbors  
     for i in range(w):
         for j in range(h):
             if pre[i][j]==1:
                 if (getneighbors(pre,i,j)==2 or getneighbors(pre,i,j)==3):
                     canvas[i][j]=1
                 else:
                     canvas[i][j]=0
             else:
                 if getneighbors(pre,i,j)==3:
                     canvas[i][j]=1
                 else:
                     canvas[i][j]=0
     fig,ax=plt.subplots()
     canvas=np.random.randint(0,2,(100,100),dtype=int)
     pre=np.zeros((100,100))
     while(True):
    	iterate(canvas)
     	ax.imshow(canvas)
     	plt.pause(0.2)
     	ax.cla()
         
    

    可以看看这个链接Convay’s game of life

  • 兰顿蚂蚁

    兰顿蚂蚁由黑白格子和一只"蚂蚁"组成,在平面的网格上有一只蚂蚁,它可以朝上下左右四个方向爬行,规则如下:

    • 若蚂蚁在白格,右转90度,将该格改为黑格,向前移一步
    • 若蚂蚁在黑格,左转90度,将该格改为白格,向前移一步

    兰顿蚂蚁是图灵完备的。
    代码实现如下:

    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib qt5
    def iterate(canvas,x,y,directions,cur):
    	if canvas[x][y]==1:
       	 	cur=(cur+1)%4
        	canvas[x][y]=0
        	x=x+directions[cur][0]
        	y=y+directions[cur][1]
    	else:
        	cur=(cur-1+4)%4
        	canvas[x][y]=1
        	x=x+directions[cur][0]
        	y=y+directions[cur][1]
    	return x,y,cur
    x,y=50,50
    canvas=np.zeros((100,100))
    direction={ 0:(0,-1),1:(1,0),2:(0,1),3:(-1,0) }
    fig,ax=plt.subplots()
    cur=0
    while(True):
     	ax.imshow(canvas)
    	plt.pause(0.2)
    	ax.cla()
    	x,y,cur=iterate(canvas,x,y,direction,cur)
    

总结

  寒假打美赛的时候还没听过元胞自动机,不过有同学在建模的时候用到了这个模型,现在只是简单地了解一些基本的概念,等以后需要用到的时候再做进一步的学习,有兴趣的同学可以与我一同探讨。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值