書名:代碼本色:用編程模擬自然系統(tǒng)
作者:Daniel Shiffman
譯者:周晗彬
ISBN:978-7-115-36947-5
第7章目錄
7.6 生命游戲
- 二維CA
- 二維CA會引入額外的復(fù)雜度:每個細(xì)胞將有更多鄰居,同時也為更多的應(yīng)用場景開啟了大門。畢竟,計算機(jī)圖形學(xué)的大部分應(yīng)用都是二維的,而本章將展示如何把CA思想應(yīng)用到Sketch的圖形繪制中。
1、生命游戲
- 在20世紀(jì)70年代,馬丁· 加德納在《科學(xué)美國人》雜志上寫了一篇文章,其中引用了數(shù)學(xué)家約翰·康威的新“生命游戲”模型,并稱之為“娛樂”的數(shù)學(xué)
- 現(xiàn)在,生命游戲早已經(jīng)成為陳詞濫調(diào)(有無數(shù)項目專門把生命游戲模型顯示在各種屏幕上)。呵呵,學(xué)習(xí)PASCAL時第一個大程序就是生命游戲。
- 但我們?nèi)杂斜匾獜念^開始構(gòu)建“生命游戲”模型,因為它讓我們有機(jī)會實踐各種編程技術(shù),如二維數(shù)組及面向?qū)ο缶幊獭?/li>
- 更重要的是,它的核心原理直接關(guān)系到我們的最終目標(biāo)——用代碼模擬大自然。
- 雖然我們不喜歡復(fù)制別人的實現(xiàn)方式,但這些實現(xiàn)背后的算法和技術(shù)將為我們提供更多靈感和基礎(chǔ),有助于我們以后模擬生物繁殖的特性和行為。
2、康威的模型
??馮·諾依曼喜歡用非常復(fù)雜的狀態(tài)和規(guī)則描述問題,約翰·康威則有所不同,他喜歡用最簡單的規(guī)則實現(xiàn)“類生命”系統(tǒng)。
??馬丁·加德納在《科學(xué)美國人》概述了康威的論點:
- (1)沒有初始模式可以很簡單地證明個體數(shù)量能無限制增長。
- (2)存在某種可以無限制增長的初始模式。
- (3)存在某種簡單的初始模式,在數(shù)次迭代之后,最終變成3種可能情況:
完全消失(由于過于擁擠或者松散)、
固定下來保持不變,
或者進(jìn)入以一定周期不斷重復(fù)循環(huán)的振蕩階段。
??上面的文字從本質(zhì)上描述了Wolfram提出的4種CA分類。CA應(yīng)該有固定的模式,但這種模式是無法預(yù)測的,隨著時間推進(jìn),它最終會進(jìn)入統(tǒng)一或來回交替的狀態(tài)。也就是說,康威的模型擁有復(fù)雜系統(tǒng)的所有特性,盡管他當(dāng)時沒有使用這個術(shù)語。
3、生命游戲的工作原理
- 首先,我們要面對的是一個二維細(xì)胞矩陣,而不是一行細(xì)胞。
對于初等CA模型,每個細(xì)胞可能的狀態(tài)都是0或1。
在本例中,我們討論的是“生命”的游戲,因此0代表“死亡”,1代表“活著”。 -
細(xì)胞的鄰居也被擴(kuò)展了。如果鄰居是相鄰的細(xì)胞,現(xiàn)在我們有9個鄰居細(xì)胞,而非原先的3個。
- 在只有3個鄰居的情況下,狀態(tài)組合可以用一個3位的二進(jìn)制數(shù)表示,也就是8種可能的組合?,F(xiàn)在有9個鄰居細(xì)胞,對應(yīng)9位的二進(jìn)制數(shù),也就是512種可能的狀態(tài)組合。
- 在大多數(shù)情況下,為這512種組合分別定義結(jié)果是不可行的。生命游戲根據(jù)鄰居的一般特征制定了一套規(guī)則,從而克服了這一問題。
4、生存規(guī)則
??生命游戲的生存規(guī)則類似于以下問題:周圍的個體數(shù)量是否過剩,是否被死亡的個體包圍,還是剛剛好?
- 1.死亡
如果某個細(xì)胞處于“活著”狀態(tài)(狀態(tài)為1),在以下情況下,將會變成“死
亡”狀態(tài)(狀態(tài)變?yōu)?)。
-- 群體過剩: 如果細(xì)胞有4個及以上的鄰居處于“活著”狀態(tài),則該細(xì)胞死亡。
-- 孤獨: 如果“活著”的鄰居數(shù)量等于或少于1個,則細(xì)胞死亡。 - 2.新生
處于“死亡”狀態(tài)(狀態(tài)為0)的細(xì)胞,如果它周圍剛好有3個“活著”的鄰居,
則它也會變?yōu)椤盎钪睜顟B(tài)。 -
3.靜止
在其他情況下,細(xì)胞的狀態(tài)保持不變。讓我們列舉所有這樣的場景。
-- 保持“活著”: 如果細(xì)胞是“活著”的,而且周圍有2個或3個活著的鄰居,它將繼續(xù)“活著”。
-- 保持“死亡”: 如果細(xì)胞是“死亡”的,而且周圍“活著”的鄰居數(shù)不等于3,它將繼續(xù)保持“死亡”狀態(tài)。
5、展示(可視化)
- 在初等CA中,我們將每次迭代的細(xì)胞狀態(tài)堆疊在一起,形成一個二維網(wǎng)格。
- 然而,在生命游戲中,CA本身就是二維的。同樣地,我們可以把每一次迭代用立體結(jié)構(gòu)堆疊在一起,形成一個三維的CA可視化視圖。
- 但對生命游戲而言,典型的可視化方式是用一幀動畫表示一次迭代。
因此,在某一時刻,我們只能看到一次迭代的細(xì)胞狀態(tài),而無法看到所有迭代的狀態(tài),整個運行結(jié)果看起來像是培養(yǎng)皿中快速生長的細(xì)菌。
6、有趣的特性
??生命游戲具有一個有趣的特性:某些初始圖案能帶來奇妙的結(jié)果。
-
以下圖案在迭代中保持靜止,不會發(fā)生任何改變。
-
以下圖案將會在兩個狀態(tài)之間交替出現(xiàn):
-
也有一些圖案,會在迭代過程中發(fā)生移動。(需要注意的是:我們看到的圖案移動是細(xì)胞生死交替產(chǎn)生的視覺結(jié)果,細(xì)胞本身并沒有發(fā)生移動。)
如果你對這些圖案感興趣,網(wǎng)上有很多“開箱即用”的生命游戲演示程序,你可以在里面設(shè)置CA的初始狀態(tài),觀察它在各種速度下的運行效果。
Exploring Emergence(http://llk.media.mit.edu/projects/emergence/),
開發(fā)者是麻省理工學(xué)院媒體實驗室Lifelong Kindergarten小組的Mitchel Resnick和Brian Silverman;
Conway's Game of Life (http://stevenklise.github.com/ConwaysGameOfLife),
開發(fā)者是Steven Klise,開發(fā)工具是Processing.js!




