元胞自動機(cellular automaton)
元胞自動機是由元胞組成的網格,每個元胞都根據鄰域的狀態來選擇開或關。所有的元胞都遵循同樣的規則,也稱為元胞的更新規則,規則根據各元胞鄰域的當前狀態決定元胞的下一步狀態。同自然界的複雜系統一樣,元胞自動機也是由大量簡單個體(元胞)組成,不存在**控制,每個個體都只與少量其他個體互動。而且元胞自動機也能表現出非常複雜的行為,它們的行為很難甚至不可能通過其更新規則來**。元胞自動機有很多種型別,著名的「生命遊戲」也是元胞自動機的一種。
初等元胞自動機(elementary cellular automaton)
初等元胞自動機是一維兩狀態的元胞自動機,每個元胞僅與兩個相鄰元胞相連。元胞自動機的時空圖表現了元胞自動機的立體構型隨時間的變化,最頂上一行是一維元胞自動機的初始狀態設定,下面跟著的依次是每一步更新後的狀態。
執行「多數分類(majority classification)」任務的元胞自動機
該元胞自動機要能區分初始狀態中是開狀態還是關狀態占多數。如果是開狀態占多數,最後所有元胞就應當都變成開狀態。同樣,如果是關狀態占多數,最後所有元胞就應該都變成關狀態。多數分類任務有點類似於選舉,是在大家都只知道最近鄰居政治觀點下**兩個候選人誰會贏。
我們使用一維元胞自動機,每個元胞與相鄰的6個元胞相連,這樣元胞的鄰域中就有7個元胞(包括自己)。乙個合理的想法是:「元胞應當變成鄰域中當前占多數的狀態。」這就好象根據你自己和鄰居的多數意見來**哪個候選人會當選。然而,這個「區域性多數投票」元胞自動機並不能完成任務。
我們使用的是梅拉妮·公尺歇爾(melanie mitchell)在《複雜》(complexity: a guided tour)一書第203頁給出的規則:
第1位是鄰域全為0時中間元胞的更新狀態,第2位是鄰域為0000001時中間元胞的更新狀態,依次往後。由於鄰域狀態有 27 = 128 種可能,因此該規則有128位。但是光看這些數字是看不出這個規則如何運作,也無法知道為何它進行多數分類時適應度很高。
實現該演算法的 c# 程式
下面就是相應的 c# 源程式 mainform.cs:
1 usingsystem;2 usingsystem.drawing;3 usingsystem.windows.forms;4
5 namespaceskyiv.cellularautomaton.majorityclassification6 28
29 protected override voidonpaint(painteventargs e)30 41 base.onpaint(e);42 }43
44 void stepit(bool cellulars)45 51
52 int getvalue(bool cellulars, intidx)53 68
69 void displaymessage(bool cellulars)70 white:", blacks, cellulars.length -blacks);76 }77
78 void out(string fmt, params object args)79 83
84 bool getinitcellulars()85 92
93 void drawgrid(boolonlyborder)94 102 len = lines *sizecellular;103 for (var i = onlyborder ? ncellular : 0; i <= ncellular; i++)104 108 }109
110 void set(int x, inty)111 115
簡要分析
第9行的靜態唯讀變數 sizecellular 表示每個元胞方格的邊長,必須為奇數。
第10行的靜態唯讀變數 ncellular 表示每行有多少個元胞,最好為奇數,以免在多數分類時出現平局的情況。
第11行的靜態唯讀變數 lines 表示要迭代多少次。
第13行的靜態唯讀變數 strruler 表示迭代的規則。
主要工作在從第29行到42行的 onpaint 方法中進行。
第84行到第91行的 getinitcellulars 方法隨機地初始化元胞的初始狀態。
第36行到第40行的迴圈按照指定的規則進行迭代。
第44行到第50行的 stepit 方法執行具體的迭代步驟。
第52行到第60行的 getvalue 方法計算元胞鄰域的值。
執行結果
該程式幾次典型的執行結果如下所示:
上圖顯示白色佔優,結果正確。這種情況很常見。
上圖顯示黑色佔優,結果正確。這種情況也很常見。
上圖顯示白色佔優,結果錯誤。這種情況比較少見。
上圖顯示黑色佔優,結果錯誤。這個結果錯誤在於最終的迭代結果不是全黒,而混入了少量的白色元胞。這個程式只迭代 200 步,其實只要再迭代幾步後就可以得到正確的結果。這種情況非常的少見。
參考資料
元胞自動機
即生命遊戲,今天下午迅雷的筆試程式設計題。簡單的版本,給定當前的狀態,給出下乙個時刻的狀態。status函式獲取某點當時周圍的活的細胞數量,寫的比較渣 include include include using namespace std define max 10010 int status ve...
元胞自動機
這 幾個關於元胞自動機的問題 元胞自動機 森林火災模型 規則 1 正在燃燒的樹變成空格位 2 如果綠樹格位的最近鄰居中有乙個樹在燃燒,則它變成正在燃燒的樹 3 在空格位,樹以概率p生長 4 在最近的鄰居中沒有正在燃燒的樹的情況下樹在每一時步以概率f 閃 電 變為正在燃燒的樹。參考文獻 祝玉學,趙學龍...
元胞自動機
元胞自動機 ca 是一種用來 區域性規則和區域性聯絡的方法。典型的元胞自動機是定義在網格上的,每乙個點上的網格代表乙個元胞與一種有限的狀態。變化規則適用於每乙個元胞並且同時進行。典型的變化規則,決定於元胞的狀態,以及其 4 或 8 鄰居的狀態。森林火災元胞自動機模型 一片森林由於自然或人為原因,有一...