陈凯
一只兔子在自家菜园子里种白菜和胡萝卜,兔子把田地划成了17列,在第一行里种的基本上全是大白菜,然而在第一行的最中间种了胡萝卜,它觉得这样最漂亮了。接下来每一行的第一列和最后一列,它都种了大白菜,不过其他位置上,它种的究竟是什么呢?
要知道,这是一只有强迫症的兔子,它所做的事情都遵循一种叫做对称的规则,从第二行第二列开始,从兔子眼里看上前一行,若左前方、正前方、右前方所种的蔬菜恰巧排得对称,那么,它就会在所站的地方种下大白菜,要是看上去不对称,就种下胡萝卜,一直到这一行的倒数第二列,其后的每一行也都是这样。
● 笔下的自动机
继续按这个规则种大白菜和胡萝卜的话,会得到怎样的景象呢?用一张纸,一支笔画一下吧。
按照兔子的“对称规则”,如果行列足够多,那么相似结构的三角形会不停地“繁衍”出来(该图形被称为谢尔宾斯基三角形,往期文章里曾通过其他方法生成过该图形)。当然,也可以把规则改成其他样子。类似的系统被称为元胞自动机,借用学术一些的定义就是:散布在规则网格中的每一单元取有限的离散状态,所有单元依据确定且相同的规则做同步更新的动力学模型。由于兔子只观察前一排的胡萝卜和大白菜,而无需左顾右盼,因此这是一个简单的一维元胞自动机,该自动机的规则可以详述如下:111生成0(即左前、正前、右前都是胡萝卜,则种白菜);110生成1;101生成0;100生成1;011生成1;010生成0;001生成1;000生成0。如果将以上规则中生成的二进制数字连起来排成一排,则得到01011010,换算成十进制数字就是90,因此,所谓“对称规则”实际上被简称为一维元胞自动机第90号规则。
● 电子表格中的自动机
元胞自动机软件模型运行起来场景颇为壮观,如果有耐心,可以自行编写完整的程序来实现该模型,也可以在网络上找到现成的工具使用。不过,为了方便课堂演示和实验,本文用身边常见的电子表格来快速DIY出一个元胞自动机运行环境,以微软的Excel为例,步骤如下。
1.将Excel中的单元格设置成小正方形的模样,第一行除正中间的单元格设为1外,其他单元格设0,每一行的边缘单元格均预设为0,如图1所示。
2.在第二行第二列即B2单元格中输入函数“=IF(A1=C1,0,1)”,然后在第二行中,利用拖曳功能将该函数自动扩展运用到该行的每一列(如图2)。
3.利用拖曳功能将该函数自动扩展运用到该表格的每一行。
4.全选并复制所有数据,在原来的位置,将剪贴板里的数据“选择性粘贴”为数值。
5.利用“编辑/替换”菜单,将所有0替换为空字符串。
很容易通过修改函数,来改变自动机的规则,若有兴趣,可试试以下一维元胞自动机规则:111生成0;110生成0;101生成0;100生成1;011生成1;010生成1;001生成1;000生成0,结果会生成怎样的图案呢?(答案在本期找)