現今而言,想模擬自然界的外貌形態有許多方式,這在先前專欄〈隨機演算之美〉、〈自然噪聲與碎形〉與〈碎形與L-system〉等,曾談過一些,簡單來說,自然有其規律,在規律未被發掘之前被稱為隨機,在隨機中加入已知的規律,就有了模擬自然的可能性,而那份規律性,可以用數學來描述。

這就是我喜歡透過程式來模擬自然的原因之一,因為,程式碼的本質就是用來描述規律,而數學可以用來描述自然規律,所以,只要能找出相應的數學,就能使用程式碼來描述自然;或者更確切地說,程式碼的本質就是數學,用來表達自然規律,是再自然也不過的一件事。

那麼,生物方面的現象呢?開發者對神經網路等為出發點的人工智慧應該不陌生,本質上來說,神經網路就是試著將簡單的數學公式予以組合,構成非線性轉換,從而模仿生物複雜的學習行為。

圖靈紋

程式碼的本質就是數學,例如,艾倫圖靈(Alan Turing)早就提出了圖靈機來證明這件事,確切地說,圖靈是想探究「運算」這件事,本質上由哪些規律組成,而且,圖靈熱衷於尋找事物的規律性,甚至是胚胎發育的規律性,也不放過。

他的出發點在於:明明一開始就只是一個受精卵,為什麼後來會發展出各種骨骼、血管、器官呢?於是,他試著以數學來觀察、描述這個過程,成果發表於1952年的〈形態發生的化學基礎The Chemical Basis of Morphogenesis)〉論文之中,並在計算的手稿上,畫出了與動物身上紋路非常相近的圖案,據說他還到處問人這是否很像乳牛身上的斑紋。

在圖靈的論文中,談到型態素(morphogen)、濃度(concentration)、反應(reaction),以及擴散(diffusion)等字眼,而這樣的理論後來被稱為型態發生的反應擴散(reaction-diffusion),因此,基於其理論而形成的圖樣,後來被稱為圖靈紋(Turing pattern)。

反應擴散系統

在論文中,圖靈提出了下列假設。系統中只有X、Y兩種我們感興趣的型態素(忽略其他的型態素),用Xr、Yr代表r細胞的濃度,反應是指X會與Y作用,因此,我們若以f(X,Y)來表示反應會增加X濃度的速度,用g(X,Y)表示反應會增加Y濃度的速度,而型態素會從高濃度往低濃度處擴散;若X擴散系數為μ,而Y擴散係數為v,細胞r的型態素濃度隨著時間的變化,將可用微分方程式來描述(請參考〈形態發生的化學基礎〉第47頁公式6-1)。

我們可以想像一下X、Y兩種型態素,就像草食動物與肉食動物。當草食動物遇上肉食動物就會被吃掉,而這些動物會因為其他因素而死亡,也會繁殖,這些是公式中f(Xr,Yr)、g(Xr,Yr)的部份,也就是反應的部分;因此,草食動物與肉食動物的數量增加,會往數量少的地方擴大棲息地,而公式中其他的部分,也就是擴散的部分。

草食動物與肉食動物間的反應與擴散,有可能發生肉食動物過度捕食的狀況,導致草食動物減少,然而也會因食物減少而使得肉食動物數量降低。因此,在一個生態系的長期演化後,同時存在著草食動物與肉食動物,那麼,兩者必然維持巧妙平衡。

如果將X、Y兩種型態素,看成決定細胞顏色的兩種激素,激素會以一定的速率補充(feed)與排除(kill)──激素會進行擴散,彼此碰上之後會反應,而根據不同的擴散係數與反應條件,最後可能達到一種平衡狀態,例如,變成其中一種顏色,或者兩個顏色形成了平衡。

自然界中許多生物身上的圖樣,就呈現出了各種平衡下的結果,像是熱帶魚身上花紋、花豹的斑點、乳牛的黑白斑塊等;實際上,不限於生物,乾裂的大地、風吹的沙丘,甚至是化學元素的晶體,都有可能出現反應擴散下的類似紋路。

Gray-Scott模型

在圖靈定出的公式中,擴散比較容易理解,基本上就是擴散系數乘上Laplacian運算,我們可以簡單理解為:擴散系數大就容易擴散,某位置濃度的變化速率大也容易擴散,那麼f(Xr,Yr)、g(Xr,Yr)呢?

化學家Gray與Scott曾在1983年發表的論文提出一個模型:物質A會以一定速率補充,A與兩個B反應會變成三個B,然後B會以一定速率變成C,而C成惰性,不再參與反應,相當於B被排除,而這個模型成了反應擴散系統最常見的代表。

圖靈的f(Xr,Yr)在Gray-Scott模型中,相當於-AB^2+f(1-A),f是補充率,g(Xr,Yr)相當於AB^2-(k+f)B,k是排除率,我們可以在〈Reaction-Diffusion Tutorial〉看到Gray-Scott模型的簡單說明,以及不同的擴散係數、k與f數值下,所產生出來的各式圖靈紋,也有生成過程的動畫展示。

其中,比較有趣的部分是,類似Voronoi的圖靈紋。一般而言,Voronoi的基本概念是勢力均衡,然而,我們可以從反應擴散的狀況來看整個過程,例如,細胞一開始會努力擴散,直到與另一個細胞接觸,壓力成了抑制反應,直到均衡為止。

另外,在其中一個動畫的展示,則出現了類似細胞有絲分裂的行為,文中解釋了這個現象:兩個元素接觸的邊界,若有其中一個呈現突起,就會有越多反應的機會,從而得到越多擴散的機會,最後將聚在一起的元素看來會是被切分為二,就像是細胞分裂。

如果你有興趣玩玩各種圖靈紋,可以看看〈生物圖案是如何形成的?〉,作者實作了一個網頁,我們可以在其中選擇不同的f、k組合,或者使用Presets預設的f、k組合,並且隨意地點選畫布,看看各種圖靈紋產生的過程。

實作Gray-Scott模型

若想以程式碼實作Gray-Scott模型,我們可以準備兩個二維陣列,陣列中各元素代表各位置的A、B濃度,一開始A濃度都是1,B濃度都是0,然後在點選位置處設置其他的A、B濃度,接著,在每個離散時間中,針對兩個二維陣列,進行〈Reaction-Diffusion Tutorial〉的公式運算(選定適當的擴散濃度、f與k組合),然後將A或B繪製出來。

關於方才談到的程式碼實作,原始碼放在GitHub的〈grayscott〉,作者是透過Three.js實現視覺化,至於我,則是運用CadQuery進行3D模型,而模型與原始碼鏈結,可參考〈Reaction-Diffusion〉。相關的程式碼實作其實非常簡單,因為需要對二維陣列進行運算,若配合Numpy,在程式碼的撰寫上,只要短短幾行就能解決。

若需要詳細的程式碼說明,我們可以參考《A-Life 使用Python實作人工生命模型》,當中的第二章,一開始就介紹了反應擴充系統與Gray-Scott模型,其中就是使用Numpy實作。

該書介紹的自動機等其他系統,也值得一看。因為,單就程式的角度來看那些複雜結果,似乎需要複雜的程式邏輯才能完成;然而,從數學的角度來描述,後續若要透過程式碼來實現,就變得易常簡單,每次在試著以程式模擬自然的過程中發現到這些,總有種窺見了某種祕密的感覺,也正因此才令人樂此不疲!

專欄作者


熱門新聞

Advertisement