
元胞自动机的一种规则是——
某个细胞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
