Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
者:Pleiades
來源:http://www.cnblogs.com/pleiades/p/8353713.html
生命游戲是英國數(shù)學(xué)家約翰·何頓·康威在1970年發(fā)明的細(xì)胞自動(dòng)機(jī)。它包括一個(gè)二維矩形世界,這個(gè)世界中的每個(gè)方格居住著一個(gè)活著的或死了的細(xì)胞。一個(gè)細(xì)胞在下一個(gè)時(shí)刻生死取決于相鄰八個(gè)方格中活著的或死了的細(xì)胞的數(shù)量。如果相鄰方格活著的細(xì)胞數(shù)量過多,這個(gè)細(xì)胞會(huì)因?yàn)橘Y源匱乏而在下一個(gè)時(shí)刻死去;相反,如果周圍活細(xì)胞過少,這個(gè)細(xì)胞會(huì)因太孤單而死去。
規(guī)則看起來很簡(jiǎn)單,但卻能演繹出無窮無盡的內(nèi)容。
滑翔者:每4個(gè)回合"它"會(huì)向右下角走一格。雖然細(xì)胞早就是不同的細(xì)胞了,但它能保持原本的形態(tài)。
輕量級(jí)飛船:它的周期是4,每2個(gè)回合會(huì)向右邊走一格。
脈沖星:它的周期為3,看起來像一顆周期爆發(fā)的星星。
更復(fù)雜的圖案。
來體會(huì)一下這些作品的腦洞以及震撼:
史詩般的生命游戲http://www.iqiyi.com/w_19rsq435c9.html
用生命游戲?qū)崿F(xiàn)生命游戲:http://www.bilibili.com/video/av616329/index.html
生命游戲的規(guī)則其實(shí)很簡(jiǎn)單。我們可以把計(jì)算機(jī)中的宇宙想象成是一堆方格子構(gòu)成的封閉空間,尺寸為N的空間就有NN個(gè)格子。而每一個(gè)格子都可以看成是一個(gè)生命體,每個(gè)生命都有生和死兩種狀態(tài),如果該格子生就顯示藍(lán)色,死則顯示白色。每一個(gè)格子旁邊都有鄰居格子存在,如果我們把33的9個(gè)格子構(gòu)成的正方形看成一個(gè)基本單位的話,那么這個(gè)正方形中心的格子的鄰居就是它旁邊的8個(gè)格子。
每個(gè)格子的生死遵循下面的原則:
1. 如果一個(gè)細(xì)胞周圍有3個(gè)細(xì)胞為生(一個(gè)細(xì)胞周圍共有8個(gè)細(xì)胞),則該細(xì)胞為生(即該細(xì)胞若原先為死,則轉(zhuǎn)為生,若原先為生,則保持不變) 。
2. 如果一個(gè)細(xì)胞周圍有2個(gè)細(xì)胞為生,則該細(xì)胞的生死狀態(tài)保持不變;
3. 在其它情況下,該細(xì)胞為死(即該細(xì)胞若原先為生,則轉(zhuǎn)為死,若原先為死,則保持不變)
設(shè)定圖像中每個(gè)像素的初始狀態(tài)后依據(jù)上述的游戲規(guī)則演繹生命的變化,由于初始狀態(tài)和迭代次數(shù)不同,將會(huì)得到令人嘆服的優(yōu)美圖案。
我們用#代表活的細(xì)胞,空格表示死的細(xì)胞,那么我們可以用控制臺(tái)打印字符、清屏來模擬生命游戲。我的代碼在github上:
https://github.com/Pleiades0428/GameOfLife/blob/master/Demo/gameOfLife.py
游戲世界尺寸為60x20,隨機(jī)生成初始狀態(tài),循環(huán)邊界,按任意鍵進(jìn)入下一幀,q退出。
單純的看這段程序,好像并沒有什么問題,代碼邏輯正確、清晰。
效果圖:
我們來嘗試一些python的高級(jí)特性,比如列表生成式。
例如,在生成初始值時(shí),我們一般這樣寫:
1 screen=
2 width=60
3 height=20
4 def Init:
5 for i in range(height):
6 line=
7 for j in range(width):
8 if random.random > 0.8:
9 line.append('#')
10 else:
11 line.append(' ')
12 screen.append(line)
如果用列表生成式,我們可以這樣寫:
1 def Init:
2 global screen
3 screen=[['#' if random.random() > 0.8 else ' ' for i in range(width)] for j in range(height)]
注意這里必須用global聲明,否則screen將默認(rèn)作為函數(shù)內(nèi)的局部變量。這里用了兩層列表生成式來生成一個(gè)二維數(shù)組。
列表生成式很好很強(qiáng)大,如果用好能大大提高效率。但會(huì)犧牲一定的可讀性,如果單個(gè)表達(dá)式寫的過于復(fù)雜,那就變成write-only了。尤其是在團(tuán)隊(duì)開發(fā)情況下,可讀性日益重要。
重寫后的代碼:
https://github.com/Pleiades0428/GameOfLife/blob/master/Demo/gameOfLife.1.py
如果僅僅是作為練習(xí),這樣就已經(jīng)足夠好了,簡(jiǎn)潔易讀。
可是我們還不能滿足,我們來給生命插上面向?qū)ο蟮某岚颍谀K化的天空中翱翔。對(duì),就是讓他跟別的模塊搞對(duì)象!
先來定義一個(gè)類GameOfLifeWorld,之前那些丑陋的全局變量,讓他們統(tǒng)統(tǒng)變成成員變量,再也不能在外興風(fēng)作浪。
class GameOfLifeWorld:
width=100
height=100
cells=
…略
然后把UI層剝離,只保留游戲的核心邏輯。
代碼:
https://github.com/Pleiades0428/GameOfLife/blob/master/Demo/gameOfLifeWorld.py
有了上一步的鋪墊,我們終于可以讓Tkinter粉墨登場(chǎng)了。Tkinter是著名的UI庫,Python自帶的Tkinter是一個(gè)精簡(jiǎn)版,不過也夠我們用的了。
我們這里用到的主要是Canvas,Button控件。Canvas畫布用來繪制游戲區(qū),Button用來交互。
效果:
以上就是這樣,項(xiàng)目我還會(huì)繼續(xù)改進(jìn),希望大家喜歡。
題圖:pexels,CC0 授權(quán)。
ython 實(shí)現(xiàn)生命游戲
這次我們使用 Python 來實(shí)現(xiàn)生命游戲,這是一種簡(jiǎn)單的元胞自動(dòng)機(jī)。基于一定規(guī)則,程序可以自動(dòng)從當(dāng)前狀態(tài)推演到下一狀態(tài)。制作的成品如下:
先來說說生命游戲的規(guī)則:
在生命游戲中,每個(gè)單元格有兩種狀態(tài),生與死。在我們的實(shí)現(xiàn)中,黃色的單元格代表活著的細(xì)胞,紅色單元格表示死亡的細(xì)胞。而每一個(gè)細(xì)胞的下一狀態(tài),是由該細(xì)胞及周圍的八個(gè)細(xì)胞的當(dāng)前狀態(tài)決定的。
具體而言:
當(dāng)前細(xì)胞為活細(xì)胞
當(dāng)前細(xì)胞為死細(xì)胞
所需模塊
無需安裝的標(biāo)準(zhǔn)庫:
第三方庫:
導(dǎo)入模塊:
import argparse from enum import IntEnum import matplotlib.pyplot as plt import matplotlib.animation as animation # 制作動(dòng)圖 import numpy as np
編程要點(diǎn)
首先,我們要知道細(xì)胞的生存空間是 N * N 的方陣,每個(gè)細(xì)胞都有兩種狀態(tài):on, off。on 為 255,off 為 0。我們使用 numpy 產(chǎn)生 N * N 的方陣。np.random.choice 是在 State.on 和 State.off ,等概率隨機(jī)抽取一個(gè)元素構(gòu)造 N * N 的方陣。
class State(IntEnum): on=255 off=0 ? def random_data(length=4, seed=420) -> np.array: np.random.seed(seed) return np.random.choice([State.off, State.on], size=(length, length), p=[0.5, 0.5])
其次我們要明白如何計(jì)算細(xì)胞周圍活細(xì)胞的個(gè)數(shù),尤其是邊界一圈的細(xì)胞。我們可以采用余數(shù)的方式,假設(shè)棋盤大小為 9 * 9,那么對(duì)于左右邊界而言,左邊界的左邊一個(gè)元素的計(jì)算方式: - 1 % 9=8,自動(dòng)折到右邊界上。將細(xì)胞周圍八個(gè)單元格的數(shù)值加起來,除以 255,就可以得到細(xì)胞周圍活細(xì)胞的個(gè)數(shù)。
def _count(data, row, col): shape=data.shape[0] up=(row - 1) % shape down=(row + 1) % shape right=(col + 1) % shape left=(col - 1) % shape return (data[up, right] + data[up, left] + data[down, right] + data[down, left] + data[row, right] + data[row, left] + data[up, col] + data[down, col]) // 255
接下來是對(duì)規(guī)則的翻譯,即根據(jù)當(dāng)前世代的狀態(tài),推演出下一世代,細(xì)胞的狀態(tài)。initial 為當(dāng)前世代的矩陣,data為下一世代的矩陣,我們根據(jù) initial 的數(shù)值,計(jì)算出 data 的數(shù)值。total 為周圍活細(xì)胞的個(gè)數(shù),如果當(dāng)前為活細(xì)胞,total 大于三或者小于二,下一世代就會(huì)死去。如果當(dāng)前為死細(xì)胞,total 等于三,下一世代活細(xì)胞就會(huì)繁殖到該單元格上。
def count(initial, data, row, col): total=_count(initial, row, col) if initial[row, col]: if (total < 2) or (total > 3): data[row, col]=State.off else: if total==3: data[row, col]=State.on
接下來是制作動(dòng)圖的過程,前面幾行是繪圖的基本操作。之后,我們使用到了 matplotlib.animation 的方法。其中,F(xiàn)uncAnimation 接受的參數(shù)含義:fig 為圖像句柄,generate 函數(shù)是我們更新每一幀圖像所需數(shù)據(jù)的函數(shù),下面會(huì)有介紹,fargs 為 genrate 函數(shù)的除去第一個(gè)參數(shù)的其他參數(shù),第一個(gè)參數(shù)由 FuncAnimation 指定 framenum(幀數(shù)) 傳給 generate 函數(shù)。frames 是幀數(shù),interval 是更新圖像間隔,save_count 為從幀到緩存的值的數(shù)量。
如果指定保存路徑(html),則保存為 html 動(dòng)畫。
def update(data, save_name): update_interval=50 fig, ax=plt.subplots() ax.set_xticks([]) ax.set_yticks([]) img=ax.imshow(data, cmap='autumn', interpolation='nearest') ani=animation.FuncAnimation(fig, generate, fargs=(img, plt, data), frames=20, interval=update_interval, save_count=50) if save_name: ani.save(save_name, fps=30, extra_args=['-vcodec', 'libx264']) plt.show()
下面我們來看 generate 函數(shù),NUM 為當(dāng)?shù)螖?shù),frame_num 接收來自 FuncAnimation 的幀數(shù)。通過嵌套的 for 循環(huán),我們逐個(gè)地更新方陣中各元素的狀態(tài)。
NUM=0 ? def generate(frame_num, img, plt, initial): global NUM NUM +=1 plt.title(f'{NUM} generation') data=initial.copy() rows, cols=data.shape for row in range(rows): for col in range(cols): count(initial, data, row, col) img.set_data(data) initial[:]=data[:] return img
最后,我們可以通過命令行參數(shù),運(yùn)行我們的程序:
-- size 參數(shù)為棋盤大小,--seed 為隨機(jī)種子,用于產(chǎn)生不同的隨機(jī)方陣。
python conway.py --size 50 --seed 18
高斯帕滑翔機(jī)槍(Gosper Glider Gun)
可將 --gosper 更改為 --glider 滑翔機(jī)。--save 為動(dòng)圖保存的地址。
python conway.py --size 80 --gosper --save gosper.html
點(diǎn)擊鏈接,回復(fù) 2019527, 獲取源代碼。
https://mp.weixin.qq.com/s/6ys7zyIV11NX2EVaVtlQIQ
類是社會(huì)動(dòng)物,而人類的社會(huì)活動(dòng)則既簡(jiǎn)單又復(fù)雜。長(zhǎng)期以來,數(shù)學(xué)家、計(jì)算機(jī)科學(xué)家和社會(huì)學(xué)家們一直試圖用簡(jiǎn)單明了的方式方法去刻畫錯(cuò)綜復(fù)雜的社會(huì)現(xiàn)象,其中“生命游戲”提供了一個(gè)“寓科學(xué)于娛樂”的活動(dòng)框架。
【一】導(dǎo)引
讓我們先來玩一個(gè)簡(jiǎn)單的棋子游戲。
在一個(gè)充分大的圍棋棋盤上,為簡(jiǎn)單起見每個(gè)空格表示已經(jīng)放有一個(gè)白子(而白子就不標(biāo)畫出來了)。如果空格內(nèi)出現(xiàn)一個(gè)黑子,就表示黑子取代了原有的白子。現(xiàn)在,讓黑子表示“生”而白子表示“死”。另外,在棋盤上的任何9個(gè)格子組成的正方形區(qū)域里(見圖1),對(duì)處于中心位置的黑子或白子來說,它上下左右和兩對(duì)角線外的8個(gè)黑子(如果它們存在的話)都稱為是它的鄰居。
我們的棋子游戲有4條規(guī)則,在整個(gè)過程中每一步都同時(shí)應(yīng)用于棋盤上所有的黑子和白子上。規(guī)則如下:
(1)如果一個(gè)黑子只有1個(gè)或者沒有黑子鄰居的話,它在下一步就會(huì)死去,如圖1(a) 所示。這操作表示該黑子在社會(huì)里太孤單了,它不能繼續(xù)生存下去。
(2)如果一個(gè)黑子有2個(gè)或者3個(gè)黑子鄰居的話,它在下一步就繼續(xù)存在,如圖1(b) 的第一步所示。這操作表示該黑子有合適的社會(huì)環(huán)境,它可以繼續(xù)生存下去。
(3)如果一個(gè)黑子有4個(gè)或者更多黑子鄰居的話,它在下一步也會(huì)死去,如圖1(c) 的中心黑子(為了不影響這一說明,其它黑子和白子同時(shí)發(fā)生的變化暫且不表示出來)。這操作表示該黑子所處的社會(huì)環(huán)境太擁擠了,它不能繼續(xù)生存下去。
(4)如果一個(gè)白子有恰好3個(gè)黑子鄰居的話,它在下一步就會(huì)變成黑子,如圖1(d) 所示。這操作表示該白子具有良好的社會(huì)環(huán)境,它可以誕生或復(fù)活。
明白了這幾條簡(jiǎn)單規(guī)則之后,你就可以開始玩這個(gè)棋子游戲了。當(dāng)然,只放少許幾個(gè)黑棋子的話,你可以在書桌上玩一陣子,但棋子數(shù)目稍多,你就得編程在電腦上玩了。
你很自然會(huì)有一個(gè)感覺,就是開始時(shí)放入多少個(gè)黑子以及怎樣放置它們,這對(duì)于游戲如何一步一步地演變下去會(huì)有決定性的影響。比如圖1(d)中四個(gè)黑子處于穩(wěn)定狀態(tài),它們永遠(yuǎn)都不會(huì)死去,即是“長(zhǎng)生不老”,而其它初始放置方式(圖1(a)、(b)、(c))則會(huì)讓黑子在若干步之內(nèi)全部死光。
你這個(gè)感覺是對(duì)的:游戲的初始條件(即放入多少個(gè)黑子以及怎樣放置它們)的確很重要,它們會(huì)生成各式各樣的黑子組合斑圖以及許多不同的最終結(jié)果。比如圖1(d) 就生成一個(gè)永遠(yuǎn)不變的斑圖,稱為“靜物”(still life);圖2(a) 則生成周期-2的“振蕩器”(oscillator);圖2(b) 卻生成一種會(huì)移動(dòng)的周期“宇航船”(spaceship)。后面這種情形特別有趣,它在一步一步變化的過程中,起始的5個(gè)黑子不會(huì)減少也不會(huì)增多,但會(huì)頻繁地改變位置,像一艘不斷變形的宇航船一直往右方和下方移動(dòng)。在第四步,它變回到了初始狀態(tài),不過整個(gè)斑圖的位置向右方和下方各移動(dòng)了一格。之后,它繼續(xù)往前移動(dòng),期間斑圖的變化不斷重復(fù)前面的過程。這是一艘移動(dòng)的周期-4振蕩宇航船,稱為“滑翔機(jī)”(glider),它永遠(yuǎn)不停地向右下方滑翔前進(jìn)。你看,這個(gè)滑翔機(jī)會(huì)永遠(yuǎn)無休止地生存并移動(dòng)下去,期間代表“生”和“死”的黑子和白子交替出沒,整個(gè)族群在發(fā)展和演變過程中就像有“生命”一樣,對(duì)吧?
圖1 游戲4條規(guī)則
圖2 “振蕩器”和“滑翔機(jī)”例子
至此,你看到了,這個(gè)棋子游戲的規(guī)則是固定的,但初始條件(黑子的個(gè)數(shù)和位置)可以有許多不同的選擇。因此,容易想象,你能夠嘗試著去生成多種多樣的“最終趨于死亡”、“不同周期振蕩”和“永遠(yuǎn)變化生存”斑圖。由于這個(gè)游戲可以用來描繪一些社會(huì)生命現(xiàn)象,故此設(shè)計(jì)師把它叫做“生命游戲”(Game of Life)。
上面介紹的這個(gè)趣味橫生的生命游戲簡(jiǎn)單而復(fù)雜,它的設(shè)計(jì)師是數(shù)學(xué)家約翰·康威(John Horton Conway,1937-2020)。關(guān)于康威的生平和貢獻(xiàn),筆者曾有過簡(jiǎn)單介紹[1]。康威在開發(fā)這個(gè)有趣的生命游戲時(shí)是英國劍橋大學(xué)數(shù)學(xué)講師。1970年10月,科普作家馬丁·加德納(Martin Gardner,1914-2010)在《科學(xué)美國人》雜志的“數(shù)學(xué)游戲”專欄對(duì)這個(gè)生命游戲作了詳細(xì)介紹。從此,學(xué)界和民間對(duì)游戲的興趣和熱情一發(fā)而不可收拾。據(jù)說,在那個(gè)生命游戲風(fēng)靡世界的年代,全球有四分之一的電腦都在玩這個(gè)游戲。
2010年,物理學(xué)家史蒂芬·霍金(Stephen W. Hawking,1942-2018)在他的科普著作《大設(shè)計(jì)》(The Grand Design)中寫道:“我們可以想象,像‘生命游戲’這樣的玩兒,它只有一些基本規(guī)則,便可以產(chǎn)生高度復(fù)雜的功能,甚至智慧。當(dāng)然它可能需要包含數(shù)十億個(gè)正方形的網(wǎng)格。但這并不困難,我們大腦中就有數(shù)千億個(gè)細(xì)胞。”
【二】簡(jiǎn)史
現(xiàn)在,我們來說說“生命游戲” 的前世今生。
康威并不是構(gòu)思出這類具有深刻數(shù)學(xué)原理和社會(huì)學(xué)意義的生命游戲的第一人。游戲的基本思想要追溯到兩位美國數(shù)學(xué)家:波蘭裔的斯塔尼斯拉夫·烏拉姆(Stanislaw Ulam,1909-1984)和匈牙利裔的約翰·馮·諾伊曼(John von Neumann,1903-1957),他們?cè)谏鲜兰o(jì)40-50年代為模擬生物細(xì)胞的自我復(fù)制提出了“元胞自動(dòng)機(jī)理論”(Cellular Automata)的雛形。當(dāng)年,由于沒有高速大型電腦,他們的構(gòu)想沒有得到驗(yàn)證因而未受學(xué)術(shù)界的重視。1970年,馬丁·加德納在《科學(xué)美國人》雜志介紹了康威的生命游戲之后,元胞自動(dòng)機(jī)理論才受到了越來越廣泛的關(guān)注。
在眾多卓有成效的元胞自動(dòng)機(jī)理論研究者中,特別值得提及的是美國電腦科學(xué)家史蒂芬·沃爾夫勒姆(Stephen Wolfram,1959-)。
沃爾夫勒姆是個(gè)很有故事的人物。他1959年出生于倫敦,12歲編寫了一部關(guān)于物理學(xué)的詞典草稿,13-14歲間寫了三本關(guān)于粒子物理的手稿,15歲發(fā)表了第一篇學(xué)術(shù)論文,17歲進(jìn)入了牛津大學(xué)。1978年,19歲的沃爾夫勒姆接到美國物理學(xué)家默里·蓋爾曼(Murray Gell-Mann,1929-2019)的電話邀請(qǐng),來到了加州理工學(xué)院就讀研究生。蓋爾曼因發(fā)現(xiàn)基本粒子夸克在1969年獲諾貝爾物理學(xué)獎(jiǎng),他是圣塔菲研究所首任所長(zhǎng)。1979年,在加州理工學(xué)院讀書期間,沃爾夫勒姆便開創(chuàng)了自己的第一個(gè)大型電腦語言SMP,用以輔助物理學(xué)研究。該語言是后來著名數(shù)學(xué)軟件Mathematica和電腦Wolfram語言的前身。1980年,21歲的沃爾夫勒姆獲得了理論物理學(xué)博士學(xué)位,其答辯委員會(huì)成員包括有諾貝爾物理獎(jiǎng)得主理查德·費(fèi)曼(Richard P. Feynman,1918-1988)。之后,沃爾夫勒姆留校任教,隨即獲得MacArthur獎(jiǎng)。接下來,23歲的他開始推動(dòng)并主導(dǎo)了關(guān)于“復(fù)雜系統(tǒng)”的科學(xué)研究,并在27歲時(shí)創(chuàng)立了自己的Stephen Wolfram公司,從事數(shù)學(xué)軟件和電腦軟件開發(fā)。如所周知,他獲得了巨大成功,不過那是后話了。
1983年,由于知識(shí)產(chǎn)權(quán)糾紛,沃爾夫勒姆離開了加州理工學(xué)院,到了普林斯頓大學(xué)自然科學(xué)學(xué)院工作。沒過多久,他就發(fā)明了元胞自動(dòng)機(jī)的計(jì)算程序。沃爾夫勒姆后來回憶說:“我開始時(shí)并不覺得簡(jiǎn)單的元胞自動(dòng)機(jī)有什么有趣之處,不過還是利用電腦試著對(duì)它們做了些試驗(yàn)。令我十分驚訝的是,就算是構(gòu)造極為簡(jiǎn)單的元胞自動(dòng)機(jī),它們?nèi)匀挥兄鴺O其復(fù)雜的行為,這對(duì)傳統(tǒng)的科學(xué)教條是個(gè)莫大的沖擊。過了些日子,我才意識(shí)到它的巨大潛力。那是我寫這本《一種新科學(xué)》(A New Kind of Science)的最早動(dòng)機(jī)。”我們知道,該書實(shí)際上代表了一條與圣塔菲研究所不一樣的復(fù)雜性科學(xué)研究路線。
當(dāng)年,沃爾夫勒姆使用電腦模擬對(duì)基本元胞自動(dòng)機(jī)的類別進(jìn)行了系統(tǒng)性的分析,對(duì)一維基本元胞自動(dòng)機(jī)的256種規(guī)則所產(chǎn)生的模型進(jìn)行了深入的研究,并用熵(entropy)的概念來描述元胞自動(dòng)機(jī)的演化行為。他根據(jù)復(fù)雜性理論將元胞自動(dòng)機(jī)大致分為平穩(wěn)型、周期型、混沌型和復(fù)雜型。從幾乎所有的隨機(jī)初始模式開始,平穩(wěn)型將演化為穩(wěn)定靜止?fàn)顟B(tài),周期型將演化為穩(wěn)定振蕩狀態(tài),混沌型將演化為偽隨機(jī)混沌狀態(tài),復(fù)雜型將變化為相互作用繁復(fù)狀態(tài)且其局部結(jié)構(gòu)會(huì)在長(zhǎng)時(shí)間內(nèi)甚至永遠(yuǎn)地存在。沃爾夫勒姆發(fā)現(xiàn),絕大多數(shù)的生命游戲演化是無法被決定的(undecidable):即使給定了初始模式,依然找不到或者根本就不存在一個(gè)算法可以用來判斷后續(xù)模式是否會(huì)出現(xiàn)和何時(shí)會(huì)出現(xiàn)。沃爾夫勒姆指出110號(hào)規(guī)則對(duì)應(yīng)的元胞自動(dòng)機(jī)具有圖靈完備性(Turing completeness)。在電腦科學(xué)中,圖靈完備性是指具有無限存儲(chǔ)能力的通用編程語言,它可以通過一系列數(shù)據(jù)操作規(guī)則來模擬圖靈數(shù)學(xué)邏輯機(jī)。沃爾夫勒姆發(fā)現(xiàn),凡是可以通過編寫程序去計(jì)算的復(fù)雜系統(tǒng)演化行為,都可以用元胞自動(dòng)機(jī)來實(shí)現(xiàn)。順便提及,沃爾夫勒姆從分類開始時(shí)就已經(jīng)看到了元胞自動(dòng)機(jī)理論和美國數(shù)學(xué)家史蒂芬·斯梅爾(Stephen Smale,1930–)的艱深混沌數(shù)學(xué)理論的內(nèi)在聯(lián)系,因?yàn)樯螒虻臒o法決定性和混沌的長(zhǎng)期不可預(yù)測(cè)性[2]是類似的。
上面討論的只是平面上的生命游戲和元胞自動(dòng)機(jī)理論。對(duì)于任意一條游戲規(guī)則,每個(gè)格點(diǎn)的黑子和白子鄰居的組合共有29=512種,而每種組合都可以用二進(jìn)制的0–1序列來表示并且是各自獨(dú)立變化的,于是總共有2512種可能。即便排除了那些沒有靜止、旋轉(zhuǎn)和反射對(duì)稱可能的不重要情形,剩下來的依然是一個(gè)天文數(shù)字。至于三維和更高維數(shù)的生命游戲和元胞自動(dòng)機(jī)理論,那就復(fù)雜得無法描述了,只能用幾個(gè)簡(jiǎn)單文字來概括:超乎想象的豐富多彩!
【三】應(yīng)用
故事講到這里,你一定會(huì)好奇,這迷人的元胞自動(dòng)機(jī)理論及其計(jì)算程序會(huì)有什么實(shí)際應(yīng)用呢?
作為回應(yīng),我們簡(jiǎn)單地介紹一下元胞自動(dòng)機(jī)技術(shù)在電腦科學(xué)、生物學(xué)、化學(xué)、物理學(xué)和音樂藝術(shù)方面的幾個(gè)具體應(yīng)用或潛在應(yīng)用[3]。
圖3 芋螺貝殼和Wolfram 30號(hào)規(guī)則生成的班圖[4]
(1)電腦科學(xué):
元胞自動(dòng)機(jī)處理器是該概念的物理實(shí)現(xiàn),它通過計(jì)算方式來處理信息。元胞的狀態(tài)僅通過與相鄰鄰居元胞的相互作用來確定,而不需要也不存在與更遠(yuǎn)的元胞進(jìn)行直接通信。一種典型的元胞自動(dòng)機(jī)處理器具有脈動(dòng)陣列配置,其中元胞相互作用通過電荷、磁性、振動(dòng)或其他物理手段來實(shí)現(xiàn)。
Wolfram 30號(hào)規(guī)則最初被建議作為一種可能的分組密碼用于密碼學(xué)。二維元胞自動(dòng)機(jī)可用于構(gòu)建偽隨機(jī)數(shù)發(fā)生器,而且元胞自動(dòng)機(jī)的演化是單向函數(shù),其逆很難破解,即容易計(jì)算未來狀態(tài),但回算先前的狀態(tài)卻異常困難。元胞自動(dòng)機(jī)后來也被提議用于公鑰密碼學(xué)并用來設(shè)計(jì)各種糾錯(cuò)碼。
(2)生物學(xué):
一些漂亮的海螺貝殼圖案可以用元胞自動(dòng)機(jī)生成,例如分布廣泛的芋螺纖維(conus textile)具有類似于 Wolfram 30號(hào)規(guī)則的班圖(圖3),因而元胞自動(dòng)機(jī)理論能夠用來解釋和研究貝殼的顏色細(xì)胞自然生長(zhǎng)內(nèi)在規(guī)律。
動(dòng)物體內(nèi)的成纖維細(xì)胞(fibroblast)與元胞自動(dòng)機(jī)有很多相似之處,例如每個(gè)成纖維細(xì)胞只與其鄰居相互發(fā)生作用。
植物調(diào)節(jié)氣體吸入和呼出的機(jī)制類似于元胞自動(dòng)機(jī)的演化過程,例如樹葉上的每個(gè)氣孔有呼和吸兩個(gè)動(dòng)作,對(duì)應(yīng)于一個(gè)元胞的兩種狀態(tài)。
頭足類(cephalopod)動(dòng)物例如烏賊的皮膚班圖中,每個(gè)狀態(tài)對(duì)應(yīng)于色素細(xì)胞的展開和收縮,可以用二維元胞自動(dòng)機(jī)進(jìn)行模擬和解釋。
生物神經(jīng)元的活動(dòng)甚至動(dòng)物識(shí)別和學(xué)習(xí)等復(fù)雜行為都可以用閾值自動(dòng)機(jī)來模擬。
(3)化學(xué):
化學(xué)中的Belousov–Zhabotinsky反應(yīng)是一種時(shí)空化學(xué)振蕩過程,它可以通過元胞自動(dòng)機(jī)來進(jìn)行模擬和分析。例如一層單薄而均勻的丙二酸、酸化溴酸鹽和高鈰鹽混合在一起時(shí),迷人的幾何圖案如同心圓和螺旋曲線便在介質(zhì)中傳播,所產(chǎn)生的波形與某種元胞自動(dòng)機(jī)生成的圖案非常相似。
(4)物理學(xué):
概率元胞自動(dòng)機(jī)可用于統(tǒng)計(jì)學(xué)和凝聚態(tài)物理學(xué)的研究中,去分析流體動(dòng)力學(xué)和相變等現(xiàn)象。伊辛(Ising)模型是一個(gè)典型的例子,其中每個(gè)單元格可以處于“向上”或“向下”狀態(tài),從而用于理想化地表示磁鐵。通過調(diào)整元胞自動(dòng)機(jī)模型參數(shù),可以改變處于相同狀態(tài)的元胞比例,解釋了為何對(duì)鐵磁體加熱可以消磁。物理學(xué)中還有一種格子氣體元胞自動(dòng)機(jī),可以用來模擬液體流動(dòng)并對(duì)之給予合理解釋。
(5)音樂藝術(shù):
元胞自動(dòng)機(jī)可用來生成一些新穎動(dòng)聽的音樂作品和設(shè)計(jì)電子游戲。某些類型的元胞自動(dòng)機(jī)還可用于生成各種迷宮。兩個(gè)著名的元胞自動(dòng)機(jī)迷宮Maze和Mazectric類似于前面介紹的“生命游戲”,復(fù)雜而有趣。此外,元胞自動(dòng)機(jī)還能生成豐富多彩的圖案用于藝術(shù)設(shè)計(jì)。
今天,元胞自動(dòng)機(jī)理論及各種數(shù)學(xué)游戲的研究仍在繼續(xù)。我們期待在不久的將來會(huì)得到更豐富更有趣的成果。
注:原文發(fā)表在《復(fù)雜學(xué)》2024年第2卷第2期45-52頁,經(jīng)作者授權(quán)轉(zhuǎn)載
【參考文獻(xiàn)】
[1] 陳關(guān)榮(2023),愛玩的天才數(shù)學(xué)家康威,《數(shù)學(xué)文化》第14卷第4 期,36-46頁,https://www.global-sci.com/intro/article_detail/mc/22165. html
[2] 陳關(guān)榮(2022 年),這門復(fù)雜性科學(xué)有個(gè)別致的名稱―混沌,《復(fù)雜學(xué)》第1 卷第1 期,69-75頁
[3] Wikipedia: Cellular automaton,https://en.wikipedia.org/wiki/Cellular_automaton
[4] Stephen Wolfram (2019), Announcing the rule 30 prizes,https://writings.stephenwolfram.com/2019/10/announcing-the-rule-30-prizes/
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。