陳凱
一只兔子在自家菜園子里種白菜和胡蘿卜,兔子把田地劃成了17列,在第一行里種的基本上全是大白菜,然而在第一行的最中間種了胡蘿卜,它覺得這樣最漂亮了。接下來每一行的第一列和最后一列,它都種了大白菜,不過其他位置上,它種的究竟是什么呢?
要知道,這是一只有強迫癥的兔子,它所做的事情都遵循一種叫做對稱的規(guī)則,從第二行第二列開始,從兔子眼里看上前一行,若左前方、正前方、右前方所種的蔬菜恰巧排得對稱,那么,它就會在所站的地方種下大白菜,要是看上去不對稱,就種下胡蘿卜,一直到這一行的倒數(shù)第二列,其后的每一行也都是這樣。
● 筆下的自動機
繼續(xù)按這個規(guī)則種大白菜和胡蘿卜的話,會得到怎樣的景象呢?用一張紙,一支筆畫一下吧。
按照兔子的“對稱規(guī)則”,如果行列足夠多,那么相似結(jié)構(gòu)的三角形會不停地“繁衍”出來(該圖形被稱為謝爾賓斯基三角形,往期文章里曾通過其他方法生成過該圖形)。當然,也可以把規(guī)則改成其他樣子。類似的系統(tǒng)被稱為元胞自動機,借用學(xué)術(shù)一些的定義就是:散布在規(guī)則網(wǎng)格中的每一單元取有限的離散狀態(tài),所有單元依據(jù)確定且相同的規(guī)則做同步更新的動力學(xué)模型。由于兔子只觀察前一排的胡蘿卜和大白菜,而無需左顧右盼,因此這是一個簡單的一維元胞自動機,該自動機的規(guī)則可以詳述如下:111生成0(即左前、正前、右前都是胡蘿卜,則種白菜);110生成1;101生成0;100生成1;011生成1;010生成0;001生成1;000生成0。如果將以上規(guī)則中生成的二進制數(shù)字連起來排成一排,則得到01011010,換算成十進制數(shù)字就是90,因此,所謂“對稱規(guī)則”實際上被簡稱為一維元胞自動機第90號規(guī)則。
● 電子表格中的自動機
元胞自動機軟件模型運行起來場景頗為壯觀,如果有耐心,可以自行編寫完整的程序來實現(xiàn)該模型,也可以在網(wǎng)絡(luò)上找到現(xiàn)成的工具使用。不過,為了方便課堂演示和實驗,本文用身邊常見的電子表格來快速DIY出一個元胞自動機運行環(huán)境,以微軟的Excel為例,步驟如下。
1.將Excel中的單元格設(shè)置成小正方形的模樣,第一行除正中間的單元格設(shè)為1外,其他單元格設(shè)0,每一行的邊緣單元格均預(yù)設(shè)為0,如圖1所示。
2.在第二行第二列即B2單元格中輸入函數(shù)“=IF(A1=C1,0,1)”,然后在第二行中,利用拖曳功能將該函數(shù)自動擴展運用到該行的每一列(如圖2)。
3.利用拖曳功能將該函數(shù)自動擴展運用到該表格的每一行。
4.全選并復(fù)制所有數(shù)據(jù),在原來的位置,將剪貼板里的數(shù)據(jù)“選擇性粘貼”為數(shù)值。
5.利用“編輯/替換”菜單,將所有0替換為空字符串。
很容易通過修改函數(shù),來改變自動機的規(guī)則,若有興趣,可試試以下一維元胞自動機規(guī)則:111生成0;110生成0;101生成0;100生成1;011生成1;010生成1;001生成1;000生成0,結(jié)果會生成怎樣的圖案呢?(答案在本期找)