編程模擬天然(九):元胞自動機

  舊書有云:發鳩之山,其上多柘木。有鳥焉,其狀如烏,文首、白喙、赤足,名曰精衛,其鳴自詨。html

  一日,精衛遊於碼海,溺而不返,後常銜西山之木石,以堙於海。有詩爲證:git

  萬事有不平,爾何空自苦;github

  長將一寸身,銜木到終古?編程

  我願平碼海,身沉心不改;後端

  碼海無平期,我心無絕時。數組

  嗚呼!君不見,西山銜木衆鳥多,鵲來燕去自成窠!學習

  (前情提要:主角元乘坐返回艙降落到了碼海上,隨後遇到了個鳥人...)測試

  「咳咳,遠道的客人,我名精衛 XIV,乃是先祖精衛鳥的第十四代後裔...」鳥人做自我介紹ui

  「...你是誰,從哪裏來又要到哪裏去?」鳥人頓了頓接着問道spa

  元不由陷入了沉思,哲學問題老是難以快速給出答案。

  精衛 XIV 打量了會兒元,見其仍沉默不語,更是堅決了本身的想法,又道

  「少年,我看你頸椎清奇,必是萬中無一的編程奇才,今日與你有緣,這裏有一本《碼海之巔》,就贈予你了。」

  「唔,這講的是什麼?」元好奇道。

  「精衛變成了個鳥人,但他沒有放棄這個世界的愛,他始終微笑着,終於被一名仁慈的老闆發覺,老闆把他招聘來作了後端開發,十年之後,精衛終於成爲了一名偉大的軟件測試師。因此,咱們不要放棄但願,天使永遠住在你微笑的嘴角。」

  ...

注:碼海,充斥着代碼的海洋

注:Bug,碼海中廣泛存在的一種生物

第一章 複雜系統

  Hawaii 讀者評論:

  「我最近讀到一本好書《碼海之巔 》,文中提到了如何用元胞自動機模型更好地理解碼海中 Bug 的繁衍模式。」--從事編程 20 餘年的 LuisIbara

  「不少編程書讀起來味同嚼蠟,大多數的編程課程一樣枯燥無聊。本書給出了我目前所知各類編程概念最深刻淺出的雞湯解釋。」--不肯意透露姓名的 Alice

  「我是一名文學愛好者,最喜歡的就是做者在書中的回憶錄,在我看來這實際是一本講述軟件測試員與 Bug 之間愛恨情仇的書。」--自稱文學愛好者的 Youkili

  ...

 --節選自《碼海之巔·抵得上 20 年工資的 3 句評論》

  複雜系統的性質

  個體之間存在小範圍的聯繫

  個體的動做是並行的

  系統在總體上會呈現出自發現象

  什麼是元胞自動機?

  它能構建隨時間推移發生狀態轉移的系統

  細胞存在於一維或多維網格中

  每一個細胞都有一個或多個狀態

  每一個細胞都有鄰居(即鄰近的細胞)

  元胞自動機分類

  平穩型:自任何初始狀態開始,通過必定時間運行後,元胞空間趨於一個空間平穩的構形,這裏空間平穩即指每個元胞處於固定狀態。不隨時間變化而變化。
  週期型:通過必定時間運行後,元胞空間趨於一系列簡單的固定結構(Stable Patterns)或週期結構(Perlodical Patterns)。因爲這些結構可看做是一種濾波器(Filter),故可應用到圖像處理的研究中。
  混沌型:自任何初始狀態開始,通過必定時間運行後,元胞自動機表現出混沌的非週期行爲,所生成的結構的統計特徵再也不變止,一般表現爲分形分維特徵。
  複雜型:出現複雜的局部結構,或者說是局部的混沌,其中有些會不斷地傳播。

圖1-1 二維元胞自動機

第二章 生命遊戲

  初九日,驚蟄。

  我經常眺望碼海,覺得會等到一我的。不少年之後,我去了碼海,我才知道是我錯了。

  不少年之前,我有個綽號叫作瘋子,任何人均可以變得瘋狂,只要你嘗試過什麼叫作 Debug 時的無助。我不會介意其餘人怎麼看我,我只不過不想看到別人比我更無助。

  又是一個下雨天,我帶了把雨傘。但是每次我一我的撐傘走在雨中的時候,我都會難過。

  之前我是不打傘的,由於我感受本身是一隻無腳鳥,只能不停的飛,飛的累了就在風裏休息。這樣也挺好的,不知道疲倦。

  直到有一天,一個大眼睛的女人和我一塊兒在樹下躲雨。

  咱們最接近的時候,我跟她之間的距離只有 0.01 公分,2 個小時以後,我愛上了這個女人。

  我相信除了寂寞,緣分是男人和女人之間相愛的另外一種起因。寂寞是每時每刻,緣分是不知不覺。

 --節選自《碼海之巔·時間是座彼岸橋》

  四邊網格-死亡

  競爭:細胞周圍存在 4 個及以上的鄰居時,細胞死亡

  孤獨:細胞周圍「活着」的鄰居等於或小於 1 時,細胞死亡

  四邊網格-新生

  處於死亡狀態的細胞,當它周圍恰好有三個活着的鄰居,它也會變爲活着的狀態

  四邊網格-靜止

  保持活着:若是細胞是「活着」的,並且周圍有 2 個或 3 個鄰居時,它將繼續活着

  保持死亡:若是細胞是「死亡」的,並且鄰居數目不等於3時,它將保持死亡狀態

圖2-1 保持靜止的組合

圖2-2 交替出現的組合

第三章 擴展屬性

  驚蟄,忌驕暴動怒。每一年的這個時候,我都會駕着船,去東方的沙洲,見一我的。我知道,她見不到我,會悄悄咬本身的頭髮。

  「咱們在哪裏見過嗎?」她的船艙裏,總有幾個奇奇怪怪的夥計。

  「你忘了嗎?忘了最好--」那個圓臉蛋的夥計擦了擦桌子,臉色變了變。

  「咱們發過誓要殺了你的,不過很不巧,咱們如今也不算是敵人。」一個瘦高個,山羊鬍子的人答道。我以爲他們都很奇怪,明明是店裏的夥計,總說本身是敵人。

  她這裏有一種泡了桃花的酒,她說酒叫「醉生夢死」,喝了以後,能夠叫你忘掉之前作過的任何事情。

  我很奇怪,爲何會有這樣的酒。她說,人最大的煩惱,就是記性太好,若是什麼均可以忘了,之後的每一天,都會是新的開始。那你說多開心。

  她陪着我一塊兒喝,喝了以後還會唱曲調很怪的歌曲。

  如今,我只記得兩句,醜 Bug 怪~呀咦呀啊啊~啊啊啊,可否別把燈打開。

 --節選自《碼海之巔·人生如夢》

  擴展的屬性

  位置:網格中的位置

  顏色:實際顯示的 ARGB 顏色

  大小:單個網格佔據的像素大小

  形狀:方塊、圓形或其餘形狀

  生命:記錄迭代次數

  其餘:其餘自定義的屬性

  擴展屬性的特色

  多狀態:前述中細胞只有「生」與「死」兩種狀態,如今它的狀態變得極其豐富,好比 RGB 顏色可表示多達 1678 萬種色彩。

  歷史性:在面向對象的生命遊戲程序中,若是你用一個數組存放細胞的狀態歷史,會有怎樣的特性?事實上這種特性經常使用於開發「複雜自適應系統」,它能從歷史學習中不斷適配和改變規則。

圖3-1 保留歷史的 CA 圖案

第四章 六邊網格

  立春事後,一場清剿碼海 Bug 的戰役打響了,我擔任測試資源調度員,也就是運糧官。不過不要緊,戰場上總能聽到風聲。

  「精衛小賊,咱們來取你的命。」我看到山羊鬍子和圓臉胖子發出白光,以爲很好笑。自動化測試大軍勢如破竹,已經攻到了近海,還有這種不怕死的 Bug 嗎?

  他們說他們叫沙洲八怪。可是好奇怪,我殺了一隻又一隻,爲什麼仍是少一隻。

  一個小時之後,碼海上有一股波浪線直衝雲霄。這天是驚蟄,萬物復甦,是新的開始。如今,卻有一個 Bug 來找死。

  個人編譯器再也不提示錯誤了。甲板前方有一個扶着兵器的女人,一句話也不說,向着我走來。

  我認識時就知道她是 Bug,她騙的了編譯器,卻騙不了我。有時候最瞭解你的人不是你的朋友,而是你的敵人。

  「回去很差嗎?在你的沙洲泡酒,快活一世。我攔不住他們,只能攔下你了。」

  「可我不圖一世,只圖一時。我是個 RuntimeException。」

  「哎--」她拋出的空指針暗器來勢洶洶,卻沒有多少殺意。我看到她的嘴角流血,本身的心也開始莫名的痛了一下。

  我知道全部的悲歡都已化爲灰燼,任世間哪一條路,她都不能與我同行。

 --節選自《碼海之巔·世界上最遙遠的距離》

  二維CA空間劃分

  三角網格:較少的鄰居數目,這在某些時候頗有用

  四邊網格:適合在計算機環境下進行可視化輸出

  六邊網格:天然真實,能較好地模擬各向同性的現象

  六邊網格的實現

  六邊網格依然能夠用二維數組存儲

  奇數層相對偶數層偏移必定的距離

  奇數層、偶數層對應不一樣的鄰居關係

圖4-1 六邊網格鄰居關係

圖4-2 六邊網格生命遊戲

第五章 CA應用

  當我站在沙洲前,以爲很是的難過,我總以爲,應該是兩我的站在這裏。

  不少年後,總有些代碼,你想寫殊不知從何寫起,總有些人,你想見卻又無處找尋,瑣碎生活與時間倦怠的逐步侵蝕,感受日益趨於遲鈍,心也由得毫不在意。

  只是記憶不禁得你,或閒庭信步的觸景傷情,或夢醒時分的黯自惆悵,或只是某個漫不經心的調侃後,那昔日的情景乍然浮現心間,遙遠得恍若海市蜃樓。

  其實「醉生夢死」只不過是她跟我開的一個玩笑,你越想知道本身是否是忘記的時候,你反而記得越清楚。我曾經聽人說過,當你不可以再擁有,你惟一能夠作的,就是令本身不要忘記。

--節選自《碼海之巔·總在寒夜裏想着一我的》

  CA可用來研究不少通常現象  

  通訊(Communication)

  計算(Compulation)

  構造(Construction)

  生長(Grain Growth)

  複製(Reproduction)

  競爭(Competition)

  進化(Evolution)

  計算機科學領域的應用

  並行計算:CA 能夠被看做是並行計算機,從而用於並行計算的研究

  圖像處理:CA 規則能夠用於模擬墨水在紙上的浸散效果及圖像的水紋效果

圖5-1 CA 模擬水墨浸散(50% 保留)

圖5-2 CA 模擬水墨浸散(100% 保留)

 

後記

  「暴風雨就要來了!我得走了。」

  精衛 XIV 居高臨下對着元說到。

  「碼海中充滿了危險,你也最好離開吧,要不要我載你一程?」  

  元一聲不響,點了點頭。只是,他從另外一個世界來,又能去哪裏呢?

  ...

附錄

  在線演示:CA - GameOfLife

  未完待續。瞭解更多請瀏覽目錄導航

相關文章
相關標籤/搜索