用python玩转元胞自动机

用python玩转元胞自动机

元胞自动机的一种规则是——

某个细胞a(a=0或1)周围的八个细胞有k个数字1:

如果k大于3,或者小于2,这个细胞变为0;

如果k=3,这个细胞变为1;

如果k=2,这个细胞变为1-a。

本文,用python结合numpy、matplotlib模块,玩转元胞自动机。

关于输出,有两种模式:

一种是使用IDLE编译器运行代码,可以呈现动画效果;至于Anaconda如何使用IDLE编译器,可以参考《怎么在anaconda里面使用IDLE编译器》;

一种是导出动态图,这一点imageio扩展包比较靠谱。无须导出每一帧图片,而是把每一帧图片临时存放到内存里面,导出图片之后就会释放内存。这一点,可以在百度经验里面搜索imageio,有我写的应用文章。

2怎么在anaconda里面使用IDLE编译器?

整体代码,请下载于:pan.baidu.com/s/1bpbL0nZDQBuICD8PWo26oQ,

提取码: 4e43。

元胞自动机需要一个初始状态,这里给出一个初始状态:

a=np.zeros((100,136))

u,v=a.shape

for i in range(u):

for j in range(v):

if (i+j)%10<2 or (i-j)%10<2:

a[i,j]=1

只有0和1的简单情形。本文只考虑这种简单情形。

它的前36步变化的动画如下。

前100步变化。

换一种初始状态:

a=np.zeros((100,136))

u,v=a.shape

for i in range(u):

for j in range(v):

if (i+j)%10<2 or (i-j)%10<3:

a[i,j]=1

前100步动画如下。

a=np.zeros((100,136))

u,v=a.shape

for i in range(u):

for j in range(v):

if (i**2+j**2)%10<2:

a[i,j]=1

a=np.zeros((100,136))

u,v=a.shape

for i in range(u):

for j in range(v):

if 20<(i**2+j**2)%36<30:

a[i,j]=1

a=np.zeros((100,136))

u,v=a.shape

for i in range(u):

for j in range(v):

if 20<(i+j)%36<30:

a[i,j]=1

a=np.zeros((100,136))

u,v=a.shape

for i in range(u):

for j in range(v):

if i==68 or j==68:

a[i,j]=1