生命棋
呢篇文或者呢段要 翻譯(或者由 en:Conway's Game of Life加料)。 |
生命棋(粵拼:sang1 ming6 kei2;英文:Game of Life)係架元胞自動機,英國數學人John Horton Conway響1970年設計。
雖然話「棋」,但其實都唔使人郁,個遊戲自動由初始態進化。人插得手嘅只係砌好開頭個樣。
基本規則
編輯生命棋係一場零玩家遊戲,一開始咗玩家就完全唔使畀任何嘅 input [1]。遊戲嘅起始係一塊無窮咁大嘅 2D 平面,塊平面分做一格格四方格,每格叫做一粒細胞或者格仔(cell)。每粒細胞都有一個狀態:
個系統一開始嗰陣嘅狀態可以由用家決定。成個系統嘅唯一種籽係棋盤開頭個樣。砌好原初狀態之後,遊戲就會開始,每一格都會同佢嘅上下左右同埋對角嗰八格「鄰居」互動。喺每一步(每步算係一吓
- 一粒生嘅細胞,若果鄰居數量少過 2 就會死 —「孤獨死」;
- 一粒生嘅細胞,若果鄰居數量多過 3 就會死 —「擠逼死」;
- 一粒生嘅細胞,若果鄰居數量係 2 或者 3,就會繼續生存落去;
- 一粒死嘅細胞,若果鄰居數量啱啱好係 3,就會「出世」變成生嘅細胞。
如是者場遊戲會一吓剔一吓剔噉一路行落去。事實表明,生命棋往往會形成好多獨特嘅變化形態。呢啲噉嘅變化引起咗唔少數學愛好者嘅注意[2]。
源
編輯數學人John von Neumann喺1940年代時問過:存唔存在一架理論上可覆製自己嘅機器?渠響四方格上砌出一架嘅數學模型,但要用一套好複雜嘅規則。Conway 試簡化 von Neumann 嘅構思,終於成功:夾埋渠之前響羣論中 Leech's problem 嘅念頭同埋渠響自我覆製機器嘅興趣,Conway 設計出生命棋。
Conway 設計呢的規則時好小心,亦試驗過吓。渠要求:
- 唔要有初始棋形,可以好易證明渠會無限增長。
- 應有的初始棋形,睇落真會無限增長。
- 應該有的簡單嘅初始棋形,係一時間內變、增長,直到以下嘅結局:
- 完全消失(塞死或者太散而孤獨死);或
- 成為一舊舊穏定嘅棋形,或唔變,或週期循環。
Conway 曾猜想:無一種棋形可以無限增長——換言之,每一種僅有有限子嘅初始棋形都有有限嘅增長上限。開頭,生命棋響 "Mathematical Games" 出現時,Conway 提議:邊個首先證明道猜想嘅真假,就畀五十蚊美金渠。一種反證嘅方法係去揾一種唔停加嘢入棋盤嘅棋形:例如一支「鎗」:渠可以重覆咁射出曉得郁嘅棋,如滑翔機同埋噴煙火車 (puffer train,即一隻會郁而且會留低一行唔會散嘅「煙」嘅棋)。
麻省理工學院由Bill Gosper領頭嘅一隊人喺同年十一月攞走咗呢五十蚊。下面支"Gosper 鎗" 喺第十五個循環時整好第一架滑翔機,之後每卅個循環一架。至今呢支鎗仍然係已知最細嘅。
特别嘅棋形同埋術語
編輯四方(Block) | 艇(Boat) | 蟾蜍(Toad) | 貶眼(Blinker) | 滑翔機(Glider) | 輕太空船(LWSS) |
---|---|---|---|---|---|
1 1 | 1 1 0 | 1 1 1 0 | 0 1 0 | 0 1 0 | 0 1 0 0 1 |
1 1 | 1 0 1 | 0 1 1 1 | 0 1 0 | 0 0 1 | 1 0 0 0 0 |
0 1 0 | 0 1 0 | 1 1 1 | 1 0 0 0 1 | ||
1 1 1 1 0 |
- Methuselah:要等好耐先至變成穏定週期嘅形。
- 命硬(diehard):好耐先至消失嘅棋形
- 滑翔機鎗(Glider Gun):會週期咁射出一架架滑翔機嘅鎗,第一架喺下面,發現者係MIT嘅 Bill Gosper:
- 噴煙嘅火車(puffer train(:會郁、重會留低一舊舊嘢嘅棋形
- 伊甸園:有出無入嘅棋形
用生命棋砌Turing機
編輯可放幾架滑翔機撞埋啲嘢道,產生各種效果。例如,若校啱兩架滑翔機,用某種方式射向一舊四方形,咁舊四方形就會郁向支滑翔機嘅來源。若校啱三架滑翔機,用某種方式射向舊四方,恁舊四方就會郁開。咁樣舊四方嘅位置就可用來記嘢。我哋甚至可用滑翔機來砌出邏輯閘,例如AND、OR同埋NOT。我哋亦可用生命棋模擬出一架連住兩個計算機嘅有限態機(finite state machine)- 呢架機等價於通用Turing機(universal Turing machine),等價於一架有無限記憶嘅計算機:換言之,生命棋係Turing完全(en:Turing complete)嘅。
重有,一舊棋可以包括一集可以夾埋砌出新棋形嘅鎗,甚至可以重新砌出原本個棋形。我嘅可以砌出一架「普適砌棋者」("universal constructor")-渠包括成架Turing 完全嘅計算機,可以用來砌出好多種複雜嘅嘢,砌番渠自己嘅 copies 都得。Conway、Elwyn Berlekamp 同埋Richard Guy寫嘅Winning Ways有介紹。
呢篇文度作者提出一架生命棋Turing機:[3]
算法
編輯最早期嘅發現,例如靜物、搖擺形,都來自紙筆、黑板同埋圍棋盤之類。嗰陣 Conway 發現咗 F-pentomino(Conway 叫渠做 "R-pentomino")好耐先至演變到穏定嘅循環。
呢的發現觸發咗世界各地嘅人寫程式去跟踪生命棋嘅進化。多數早期算法都差唔多:用兩維陣列來代表棋盤;多數人用兩塊陣列,一塊代表而家,一塊代表下一代;用 0 1 代表死生格;用雙循環來計每一格嘅下一代;輸出下一代嘅陣列;跟住再塊陣列嘅作用對掉…
有好幾種細修改可以慳番的計算。例如:若一格上次無變,而渠嘅隔蘺亦無變,咁今次都唔會變。所以唔使改無活動嘅區。
理論上生命棋盤應無限大,但計算機記憶始終有限,而且通常一開始就要設定的 array幾大。咁當盤棋嘅近邊開始郁時就會出問題。有幾種方法處理:最簡單嘅解決就係當外圍嘅格咸辦闌永遠都係死嘅。(少少似Template:生命棋開頭嘅設計[4]咁)。咁樣雖然方便編程,但如果陣列嘅邊活躍起上來,結果會唔準。好少少嘅做法係黏埋上下、左右,做成個錨環 (torus)。咁,過界嘅棋型亦可借用棋盤對面,就可消除咗的病態嘅邊界效果;當然,若舊棋變到太大,終會唔準。另外,我哋亦可用「動態儲存配置 」來變大個棋盤。
我哋可以唔用兩維陣列來表示棋盤,改用其他結構,例如用座標對向量(?vector of coordinate pairs)來表示生嘅格仔。咁樣塊棋可以自由無阻咁郁,除非渠嘅「人口」增長到大過架生嘅座標陣列(? live-coordinate array);但缺點就係要揾(search)一輪先知道有一格有幾多鄰居,慢。 我哋可用更仔細嘅資料結構大致解決呢個問題。
如要深入探索大規模嘅棋形,有精細嘅算法用,例如Hashlife。
生命棋嘅程式
編輯生命棋程式有好多,下面啲有多人玩同有特別功能:
- Conway's Game of Life , Alan Hensel 寫嘅。係種彈出來嘅 Java web applet。算法快。有間有好多好玩生命棋形嘅圖書館。
- Golly. Andrew Trevorrow 同埋 Tomas Rokicki 寫嘅誇平臺 (Windows, Macintosh, and Linux) 開源嘅生命棋模擬系統,用hashlife算法,極之快,編輯同模擬上有Python scriptability。
- Life32 -- Windows 機上行嘅自由程式,有強勁、可編碼(scriptable)嘅圖形編緝功能。
- Mirek's Cellebration-行Windows 嘅自由1維埋2維元胞自動機 編輯器。有強勁嘅模擬一大系列自動機規則嘅工具,同埋 scriptable 嘅編輯器 editor.
- Xlife Jon Bennett 寫嘅元胞自動機實驗室。長期係 Linux 嘅標準生命棋模擬程式,亦都搬咗過 Windows 用。可以搞掂有同生命棋一樣嘅鄰域而每格有多至釞種態嘅元胞自動規律。呢度 有好多第啲版本。
- Conway's game of life implementation. (Silverlight)
- Game of Life on JavaScript
- Template:生命棋
睇埋
編輯攷、註
編輯- ↑ MATHEMATICAL GAMES: The fantastic combinations of John Conway's new solitaire game "life" by Martin Gardner (1970).
- ↑ The Game of Life.
- ↑ 〈存档副本〉 (PDF)。原著 (PDF)喺2007年5月11號歸檔。喺2007年3月28號搵到。
- ↑ 〈存档副本〉。原著喺2020年3月28號歸檔。喺2007年4月4號搵到。