1. 程式人生 > >元胞自動機(生命遊戲)

元胞自動機(生命遊戲)

元胞自動機

元胞自動機(Cellular Automaton,複數為Cellular Automata,簡稱CA,也有人譯為細胞自動機、點格自動機、分子自動機或單元自動機)。是一時間和空間都離散的動力系統。散佈在規則格網 (Lattice Grid)中的每一元胞(Cell)取有限的離散狀態,遵循同樣的作用規則,依據確定的區域性規則作同步更新。大量元胞通過簡單的相互作用而構成動態系統的演化。

不同於一般的動力學模型,元胞自動機不是由嚴格定義的物理方程或函式確定,而是用一系列模型構造的規則構成。凡是滿足這些規則的模型都可以算作是元胞自動機模型。因此,元胞自動機是一類模型的總稱,或者說是一個方法框架。其特點是時間、空間、狀態都離散,每個變數只取有限多個狀態,且其狀態改變的規則在時間和空間上都是區域性的。

元胞自動機的構建沒有固定的數學公式,構成方式繁雜,變種很多,行為複雜。故其分類難度也較大,自元胞自動機產生以來,對於元胞自動機分類的研究就是元胞自動機的一個重要的研究課題和核心理論,在基於不同的出發點,元胞自動機可有多種分類,其中,最具影響力的當屬S. Wolfram在80年代初做的基於動力學行為的元胞自動機分類,而基於維數的元胞自動機分類也是最簡單和最常用的劃分。除此之外,在1990年,Howard A.Gutowitz提出了基於元胞自動機行為的馬爾科夫概率量測的層次化、參量化的分類體系(Gutowitz,H. A.,1990)。下面就上述的前兩種分類作進一步的介紹。同時就幾種特殊型別的元胞自動機進行介紹和探討S. Wolfrarm在詳細分析研究了一維元胞自動機的演化行為,並在大量的計算機實驗的基礎上,將所有元胞自動機的動力學行為歸納為四大類(Wolfram. S.,1986):

平穩型:自任何初始狀態開始,經過一定時間執行後,元胞空間趨於一個空間平穩的構形,這裡空間平穩即指每一個元胞處於固定狀態。不隨時間變化而變化。

週期型:經過一定時間執行後,元胞空間趨於一系列簡單的固定結構(Stable Patterns)或週期結構(Perlodical Patterns)。由於這些結構可看作是一種濾波器(Filter),故可應用到影象處理的研究中。

混沌型:自任何初始狀態開始,經過一定時間執行後,元胞自動機表現出混沌的非週期行為,所生成的結構的統計特徵不再變止,通常表現為分形分維特徵。

複雜型:出現複雜的區域性結構,或者說是區域性的混沌,其中有些會不斷地傳播。

分別描述

從另一角度,元胞自動機可視為動力系統,因而可將初試點、軌道、不動點、週期軌和終極軌等一系列概念用到元胞自動機的研究中,上述分類,又可以分別描述為(譚躍進,1996;謝惠民,1994;李才偉、1997);

⑴均勻狀態,即點態吸引子,或稱不動點;

⑵簡單的週期結構,即週期性吸引子,或稱週期軌;

⑶混沌的非週期性模式,即混沌吸引子

⑷這第四類行為可以與生命系統等複雜系統中的自組織現象相比擬,但在連續系統中沒有相對應的模式。但從研究元胞自動機的角度講,最具研究價值的具有第四類行為的元胞自動機,因為這類元胞自動機被認為具有"突現計算"(Emergent Computation)功能,研究表明,可以用作廣義計算機(Universal Computer)以模擬任意複雜的計算過程。另外,此類元胞自動機在發展過程中還表現出很強的不可逆(lrreversibility)特徵,而且,這種元胞自動機在若干有限迴圈後,有可能會"死"掉,即所有元胞的狀態變為零。

應用

元胞自動機可用來研究很多一般現象。其中包括通訊、資訊傳遞(Communicahon)、計算(Compulation)、構造 (Construction)、生長 (Growth)、複製 (Reproduction)、競爭(Competition)與進化(Evolutio,])等(SmithA.,1969;Perrier,J.Y.,1996)。同時。它為動力學系統理論中有關秩序 (Ordering)、紊動 (Turbulence)、混沌 (Chaos)、非對稱(Symmetry-Breaking)、分形(Fractality)等系統整體行為與複雜現象的研究提供了一個有效的模型工具 (Vichhac。G,1984;Bennett,C,1985)。

元胞自動機自產生以來,被廣泛地應用到社會、經濟、軍事和科學研究的各個領域。應用領域涉及社會學、生物學、生態學資訊科學電腦科學數學物理學、化學、地理、環境、軍事學等。

在社會學中

元胞自動機用於研究經濟危機的形成與爆發過程、個人行為的社會性,流行現象,如服裝流行色的形成等。在生物學中,元胞自動機的設計思想本身就來源於生物學自繁殖的思想,因而它在生物學上的應用更為自然而廣泛。例如元胞自動機用於腫瘤細胞的增長機理和過程模擬、人類大腦的機理探索(Victor.Jonathan.D.,1990)、艾滋病病毒HIV的感染過程(Sieburg,H.B..1990)、自組織、自繁殖等生命現象的研究以及最新流行的克隆 (Clone)技術的研究等 (ErmentroutG。B。,1993)。

在生態學中

元胞自動機用於兔子-草,鯊魚-小魚等生態動態變化過程的模擬,展示出令人滿意的動態效果;元胞自動機還成功地應用於螞蟻大雁魚類洄游等動物的群體行為的模擬;另外,基於元胞自動機模型的生物群落的擴散模擬也是當前的一個應用熱點。在資訊學中。元胞自動機用於研究資訊的儲存、傳遞、擴散的過程。另外。Deutsch(1972)、Sternberg(1980)和Rosenfeld(1979)等人還將二維元胞自動機應用到影象處理和模式識別中 (WoIfram.S.,1983)。

在電腦科學中

元胞自動機可以被看作是平行計算機而用於平行計算的研究(Wolfram.S.1983)。另外。元胞自動機還應用於計算機圖形學的研究中。

數學中,元胞自動機可用來研究數論和平行計算。例如Fischer(1965)設計的素數過濾器(Prime NumberSieves)(Wolfram,S.1983)。

在物理學中

除了格子氣元胞自動機在流體力學上的成功應用。元胞自動機還應用於磁場、電場等場的模擬,以及熱擴散、熱傳導和機械波的模擬。另外。元胞自動機還用來模擬雪花等枝晶的形成

在化學中

元胞自動機可用來通過模擬原子、分子等各種微觀粒子在化學反應中的相互作用,而研究化學反應的過程。例如李才偉 (1997)應用元胞自動機模型成功模擬了由耗散結構創始人I·Prgogine所領導的Brussel學派提出的自催化模型---Brusselator模型,又稱為三分子模型。Y·BarYam等人利用元胞自動機模型構造了高分子的聚合過程模擬模型,在環境科學上,有人應用元胞自動機來模擬海上石油洩露後的油汙擴散、工廠周圍廢水、廢氣的擴散等過程的模擬

在軍事科學中

元胞自動機模型可用來進行戰場的軍事作戰模擬"提供對戰爭過程的aq理解(譚躍進等,1996)。

其他

元胞自動機作為一種動態模型,更多的是作為一種通用性建模的方法,其應用幾乎涉及社會和自然科學的各個領域


生命遊戲

生命遊戲是英國數學家約翰·何頓·康威在1970年發明的細胞自動機。它最初於1970年10月在《科學美國人》雜誌中馬丁·葛登能(Martin Gardner,1914年11月21日-2010年5月22日。又譯:馬丁·加德納)的“數學遊戲”專欄出現。

概述

生命遊戲其實是一個零玩家遊戲,它包括一個二維矩形世界,這個世界中的每個方格居住著一個活著的或死了的細胞。一個細胞在下一個時刻生死取決於相鄰八個方格中活著的或死了的細胞的數量。如果相鄰方格活著的細胞數量過多,這個細胞會因為資源匱乏而在下一個時刻死去相反,如果周圍活細胞過少,這個細胞會因太孤單而死去。實際中,你可以設定周圍活細胞的數目怎樣時才適宜該細胞的生存。如果這個數目設定過高,世界中的大部分細胞會因為找不到太多的活的鄰居而死去,直到整個世界都沒有生命;如果這個數目設定過低,世界中又會被生命充滿而沒有什麼變化。實際中,這個數目一般選取2或者3;這樣整個生命世界才不至於太過荒涼或擁擠,而是一種動態的平衡。這樣的話,遊戲的規則就是:當一個方格周圍有2或3個活細胞時,方格中的活細胞在下一個時刻繼續存活;即使這個時刻方格中沒有活細胞,在下一個時刻也會“誕生”活細胞。在這個遊戲中,還可以設定一些更加複雜的規則,例如當前方格的狀況不僅由父一代決定,而且還考慮祖父一代的情況。你還可以作為這個世界的上帝,隨意設定某個方格細胞的死活,以觀察對世界的影響。

在遊戲的進行中,雜亂無序的細胞會逐漸演化出各種精緻、有形的結構;這些結構往往有很好的對稱性,而且每一代都在變化形狀。一些形狀已經鎖定,不會逐代變化。有時,一些已經成形的結構會因為一些無序細胞的“入侵”而被破壞。但是形狀和秩序經常能從雜亂中產生出來。

這個遊戲被許多計算機程式實現了。Unix世界中的許多Hacker喜歡玩這個遊戲,他們用字元代表一個細胞,在一個計算機螢幕上進行演化。著名的GNU Emacs編輯器中就包括這樣一個小遊戲。

細胞自動機(又稱元胞自動機),名字雖然很深奧,但是它的行為卻是非常美妙的。所有這些怎樣實現的呢?我們可以把計算機中的宇宙想象成是一堆方格子構成的封閉空間,尺寸為N的空間就有N*N個格子。而每一個格子都可以看成是一個生命體,每個生命都有兩種狀態,如果該格子生就顯示藍色,死則顯示白色。每一個格子旁邊都有鄰居格子存在,如果我們把3*3的9個格子構成的正方形看成一個基本單位的話,那麼這個正方形中心的格子的鄰居就是它旁邊的8個格子。

每個格子的生死遵循下面的原則:

1. 如果一個細胞周圍有3個細胞為生(一個細胞周圍共有8個細胞),則該細胞為生(即該細胞若原先為死,則轉為生,若原先為生,則保持不變)。

2. 如果一個細胞周圍有2個細胞為生,則該細胞的生死狀態保持不變;

3. 在其它情況下,該細胞為死(即該細胞若原先為生,則轉為死,若原先為死,則保持不變)

設定影象中每個畫素的初始狀態後依據上述的遊戲規則演繹生命的變化,由於初始狀態和迭代次數不同,將會得到令人歎服的優美圖案。

這樣就把這些若干個格子(生命體)構成了一個複雜的動態世界。運用簡單的3條作用規則構成的群體會湧現出很多意想不到的複雜性為,這就是複雜性科學的研究焦點。

細胞自動機有一個通用的形式化的模型,每個格子(或細胞)的狀態可以在一個有限的狀態集合S中取值,格子的鄰居範圍是一個半徑r,也就是以這個格子為中心,在距離它r遠的所有格子構成了這個格子的鄰居集合,還要有一套演化規則,可以看成是一個與該格子當前狀態以及鄰居狀態相關的一個函式,可以寫成f:S*S^((2r)^N-1)->S。這就是細胞自動機的一般數學模型。

最早研究細胞自動機的科學家是馮·諾伊曼,後來康韋發明了上面展示的這個最有趣的細胞自動機程式:《生命遊戲》,而wolfram則詳盡的討論了一維世界中的細胞自動機的所有情況,認為可以就演化規則f進行自動機的分類,而只有當f滿足一定條件的時候,系統演化出來的情況才是有活力的,否則不是因為演化規則太死板而導致生命的死亡,就是因為演化規則太複雜而使得隨機性無法克服,系統亂成一鍋粥,沒有秩序。後來人工生命之父克里斯·朗頓進一步發展了元胞自動機理論。並認為具有8個有限狀態集合的自動機就能夠湧現出生命體的自複製功能。他根據不同系統的演化函式f,找到了一個引數lamda用以描述f的複雜性,得出了結論只有當lamda比混沌狀態的lamda相差很小的時候,複雜的生命活系統才會誕生,因此,朗頓稱生命誕生於“混沌的邊緣”!並從此開闢了“人工生命”這一新興的交叉學科!

MATLAB程式碼如下:

%生命遊戲---元胞自動機
%每個格子的生死遵循下面的原則: 
%1. 如果一個細胞周圍有3個細胞為生(一個細胞周圍共有8個細胞),則該細胞為生(即該細胞若原先為死,則轉為生,若原先為生,則保持不變) 。 
%2. 如果一個細胞周圍有2個細胞為生,則該細胞的生死狀態保持不變; 
%3. 在其它情況下,該細胞為死(即該細胞若原先為生,則轉為死,若原先為死,則保持不變) 

function ca
m=10;n=10;%世界大小m*n
p=.7;%用於初始化生命(p理解為為每一點出現生命的概率)
h=1000;%h為生命遊戲進行的輪數

%生命的隨機初始化設定(前兩重迴圈)
for x=1:m %對網格點的初始化
    for y=1:n
        r=rand(1); %r為U[0,1]中隨機產生的一個數字   rand(1)中的1代表矩陣r的規模為1*1即一個數
        if r>p
            a(x,y)=1;
        else
            a(x,y)=0;
        end
    end
end
for x=1:m%根據網格初始化後的結果來進行網格生命初始化設定
    for y=1:n
        if a(x,y)==1 %如果網格點(x,y)為1,則生命方塊(x-1,y-1) (x-1,y) (x,y-1) (x,y)賦予生命
            fx=[x-1,x-1,x,x];
            fy=[y-1,y,y,y-1];
            fill(fx,fy,'g')%填塗綠色表示獲得生命
            hold on
        else %否則保持不變,即不獲得生命
        end
    end
end


for k=1:h %一共進行h輪生命遊戲
    fx=[0,m,m,0];
    fy=[0,0,n,n];
    fill(fx,fy,'k'),%新的一輪開始,將所有的格子全部塗黑,按上一輪得到的新的a來重新塗色,便於觀察
    hold on
    
    for x=2:m-1%遍歷每一個點
        for y=2:n-1
            %b(x,y)為點a(x,y)附近八個點的和
            b(x,y)=a(x-1,y-1)+a(x-1,y)+a(x-1,y+1)+a(x,y-1)+a(x,y+1)+a(x+1,y-1)+a(x+1,y)+a(x+1,y+1);
            if b(x,y)==2 %如果a(x,y)附近有兩個點,a(x,y)保持不變
                c(x,y)=a(x,y);
            elseif b(x,y)==3,%如果a(x,y)附近有三個點,a(x,y)獲得生命
                c(x,y)=1;
            else         %否則,a(x,y)失去生命
                c(x,y)=0;
            end
        end
    end
    %a的第一列和最後一列保持不變,因為上面的迴圈是從x=2:m-1 y=2:n-1
    c(1:m,1)=a(1:m,1);
    c(1:m,n)=a(1:m,n);
    
    for x=1:m %根據這一輪點的生命情況來確定它左下角這個格子的生命情況
        for y=1:n
            if c(x,y)==1
                fx=[x-1,x-1,x,x];
                fy=[y-1,y,y,y-1];
                fill(fx,fy,'g')
                hold on
            else
            end
        end
    end
pause(0.01)%停止0.02秒後開始下一輪
a=c;
end