1. 程式人生 > >生命遊戲(Game of Life)

生命遊戲(Game of Life)

大二了,想進一下學校的技術團隊,團隊的一輪的面試過了,二輪面試就是技術考核了,然後就發了一個讓我這菜鳥“目瞪狗呆”的考核試題,題目就是我這篇部落格的標題,“生命遊戲(Game of Life)” ,剛看到這個題目的時候整個人都懵(men)逼了,在腦子裡就閃現這這幾字,“這是什麼”“怎麼實現”“你TM在逗我?”“考核GG了/(ㄒoㄒ)/~~”,不過後面通過問團隊裡的師兄和自己百度google啥的瞭解到這個遊戲本生不難,但是其應用價值非常高,例如計算機圖形輔助設計,生成隨機數等作用。
我自己也幻想了一下,生命遊戲如果應用與人工只能的話,會不會人工智慧會真的達到更一個人一樣,有自己的思維,能獨立思考,當然,這只是我自己猜測的,我查詢資料的時候並沒有找到說有用到人工智慧上的例子,廢話了這麼多,也該進入正題了,不然大家會看不起我這個小白的。(菜鳥一隻,如果有大神一個不小心看到了這篇文章的話,希望多多指教一下。)

考核題目

生命遊戲(Game of Life)
生命遊戲是一個 零玩家遊戲 。它包括一個 二維矩形世界 ,這個世界中的每個方格居住著一個活著的或死了的 細胞 。一個細胞在下一個時刻生死 取決於相鄰八個方格中活著的或死了的細胞的數量。如果相鄰方格活著的細胞數量過多,這個細胞會因為資源匱乏而在下一個時刻死去;相反,如 果周圍活細胞過少,這個細胞會因太孤單而死去。實際中,玩家可以設定周圍活細胞的數目怎樣時才適宜該細胞的生存。如果這個數目設定過高, 世界中的大部分細胞會因為找不到太多的活的鄰居而死去,直到整個世界都沒有生命;如果這個數目設定過低,世界中又會被生命充滿而沒有什麼 變化。
實際中,這個數目一般選取 2 或者 3 ;這樣整個生命世界才不至於太過荒涼或擁擠, 而是一種動態的平衡。這樣的話,遊戲的規則就是:當一 個方格周圍有 2 或 3 個活細胞時,方格中的活細胞在下一個時刻繼續存活;即使這個時刻方格中沒有活細胞,在下一個時刻也會 “ 誕生 ” 活細胞。
在這個遊戲中,還可以設定一些更加複雜的規則,例如當前方格的狀況不僅由父一代決定,而且還考慮祖父 一代的情況。玩家還可以作為這個世界 的 “ 上帝 ” ,隨意設定某個方格細胞的死活,以觀察對世界的影響。 來自  基本要求
o 應用正常執行,無明顯示卡頓;
o 有開始、暫停、終止基本互動;
 可選
o 可以儲存、載入自定義初始狀態;
o 可以自定義額外的引數(迭代次數、演化規則);
o 可以從伺服器獲取初始狀態[1];
o 更好的互動體驗;

PS:大家有興趣也可以自己做來玩一下。

康威生命遊戲(英語:Conway’s Game of Life)

PS:一下內容來自wiki,如果文字連線連線不了就“fan qiang”咯。

  • 簡介

    康威生命遊戲(英語:Conway’s Game of Life),又稱康威生命棋,是英國數學家約翰·何頓·康威在1970年發明的細胞自動機。
    它最初於1970年10月在《科學美國人》雜誌上馬丁·葛登能的“數學遊戲”專欄出現。

  • 規則

    生命遊戲中,對於任意細胞,規則如下:
    每個細胞有兩種狀態-存活或死亡,每個細胞與以自身為中心的周圍八格細胞產生互動。(如圖,黑色為存活,白色為死亡)
    當前細胞為存活狀態時,當週圍低於2個(不包含2個)存活細胞時, 該細胞變成死亡狀態。(模擬生命數量稀少)
    當前細胞為存活狀態時,當週圍有2個或3個存活細胞時, 該細胞保持原樣。
    當前細胞為存活狀態時,當週圍有3個以上的存活細胞時,該細胞變成死亡狀態。(模擬生命數量過多)
    當前細胞為死亡狀態時,當週圍有3個存活細胞時,該細胞變成存活狀態。 (模擬繁殖)
    可以把最初的細胞結構定義為種子,當所有在種子中的細胞同時被以上規則處理後, 可以得到第一代細胞圖。按規則繼續處理當前的細胞圖,可以得到下一代的細胞圖,周而復始。

    • 概述
      生命遊戲是一個零玩家遊戲。它包括一個二維矩形世界,這個世界中的每個方格居住著一個活著的或死了的細胞。一個細胞在下一個時刻生死取決於相鄰八個方格中活著的或死了的細胞的數量。如果相鄰方格活著的細胞數量過多,這個細胞會因為資源匱乏而在下一個時刻死去;相反,如果周圍活細胞過少,這個細胞會因太孤單而死去。實際中,玩家可以設定周圍活細胞的數目怎樣時才適宜該細胞的生存。如果這個數目設定過高,世界中的大部分細胞會因為找不到太多的活的鄰居而死去,直到整個世界都沒有生命;如果這個數目設定過低,世界中又會被生命充滿而沒有什麼變化。
      實際中,這個數目一般選取2或者3;這樣整個生命世界才不至於太過荒涼或擁擠,而是一種動態的平衡。這樣的話,遊戲的規則就是:當一個方格周圍有2或3個活細胞時,方格中的活細胞在下一個時刻繼續存活;即使這個時刻方格中沒有活細胞,在下一個時刻也會“誕生”活細胞。
      在這個遊戲中,還可以設定一些更加複雜的規則,例如當前方格的狀況不僅由父一代決定,而且還考慮祖父一代的情況。玩家還可以作為這個世界的“上帝”,隨意設定某個方格細胞的死活,以觀察對世界的影響。
      在遊戲的進行中,雜亂無序的細胞會逐漸演化出各種精緻、有形的結構;這些結構往往有很好的對稱性,而且每一代都在變化形狀。一些形狀已經鎖定,不會逐代變化。有時,一些已經成形的結構會因為一些無序細胞的“入侵”而被破壞。但是形狀和秩序經常能從雜亂中產生出來。
      這個遊戲被許多計算機程式實現了。Unix世界中的許多黑客喜歡玩這個遊戲,他們用字元代表一個細胞,在一個計算機螢幕上進行演化。比較著名的例子是,GNU Emacs編輯器中就包括這樣一個小遊戲。
  • 原理

    細胞自動機(又稱元胞自動機),名字雖然很深奧,但是它的行為卻是非常美妙的。所有這些怎樣實現的呢?我們可以把計算機中的宇宙想象成是一堆方格子構成的封閉空間,尺寸為N的空間就有N*N個格子。而每一個格子都可以看成是一個生命體,每個生命都有生和死兩種狀態,如果該格子生就顯示藍色,死則顯示白色。每一個格子旁邊都有鄰居格子存在,如果我們把3*3的9個格子構成的正方形看成一個基本單位的話,那麼這個正方形中心的格子的鄰居就是它旁邊的8個格子。
    每個格子的生死遵循下面的原則:
    如果一個細胞周圍有3個細胞為生(一個細胞周圍共有8個細胞),則該細胞為生(即該細胞若原先為死,則轉為生,若原先為生,則保持不變) 。
    如果一個細胞周圍有2個細胞為生,則該細胞的生死狀態保持不變;
    在其它情況下,該細胞為死(即該細胞若原先為生,則轉為死,若原先為死,則保持不變)
    設定影象中每個畫素的初始狀態後依據上述的遊戲規則演繹生命的變化,由於初始狀態和迭代次數不同,將會得到令人歎服的優美圖案。
    這樣就把這些若干個格子(生命體)構成了一個複雜的動態世界。運用簡單的3條作用規則構成的群體會湧現出很多意想不到的複雜行為,這就是複雜性科學的研究焦點。
    細胞自動機有一個通用的形式化的模型,每個格子(或細胞)的狀態可以在一個有限的狀態集合S中取值,格子的鄰居範圍 是一個半徑r,也就是以這個格子為中心,在距離它r遠的所有格子構成了這個格子的鄰居集合,還要有一套演化規則,可以看成是一個與該格子當前狀態以及鄰居 狀態相關的一個函式,可以寫成f:S*S^((2r)^N-1)->S。這就是細胞自動機的一般數學模型。
    最早研究細胞自動機的科學家是馮·諾伊曼,後來康韋發明了上面展示的這個最有趣的細胞自動機程式:《生命遊戲》,而wolfram則詳盡的討論了一維世界中的細胞自動機的所有情況,認為可以就演化規則f進行自動機的分類,而只有當f滿足一定條件的時候,系統演化出來的情況才是有活力的,否則不是因為演化規則太死板而導致生命的死亡,就是因為演化規則太複雜而使得隨機性無法克服,系統亂成一鍋粥,沒有秩序。後來人工生命之父克里斯·朗頓進一步發展了元胞自動機理論。並認為具有8個有限狀態集合的自動機就能夠湧現出生命體的自複製功能。他根據不同系統的演化函式f,找到了一個引數lamda用以描述f的複雜性,得出了結論只有當lamda比混沌狀態的lamda相差很小的時候,複雜的生命活系統才會誕生,因此,朗頓稱生命誕生於“混沌的邊緣”!並從此開闢了“人工生命”這一新興的交叉學科!
    如今細胞自動機已經在地理學、經濟學、電腦科學等領域得到了非常廣泛的應用。

生命遊戲連線(點開就可以玩了)。還有一個在知乎上看到的大神做的生命遊戲,好炫酷的說,試一下你大概就可以理解生命遊戲在計算機輔助設計中的作用了。