2012/03/10

Rabbit : Cellular Automata 細胞自動機 (grasshopper教學)

到現在還有寫教學的動力我想這都要規功於過去學長是怎麼幫我的,
無論是三小阿振先邦青澤Gary吉甫大頭到大大大大(周星馳口吻)~學長CCC,
一路走來從skp到現在grasshopper,沒有他們的幫助,我想我現在也不會走到這裡.

現在我好不容易懂了一點點東西,總覺得自己也應該做些什麼,
有鑑於小綠說我看起來很兇,所以在我預設大家不敢問我問題的情況下,
還不如訴諸武力文字來讓大家可以直接透過blog的方式來了解一些簡單的東西.

認識我的一定會覺得平常我瘋瘋癲癲的怎麼突然給它感性了起來,
幹,我也是有血有淚有屁股的好男兒好不好!

好了,再講下去一定又是冗長的感謝文,又不是得普力茲克.
讓我們進入細胞自動機的正題.

-------------------------------------------------------------------------------------------------------

細胞自動機是我在大四時就碰過的一個演算法,
英文名字叫Cellular Automata之後都會以CA簡稱,請勿以為是California.
那時要用CA可是得寫Rhinoscript的年代,
到現在可以透過gh簡單的接一接就可以用真的是要心懷感激.
如果你想知道詳細,請點進以下連結去了解更多,

細胞自動機介紹

如果只想簡單知道它,那就看下圖.



基本上細胞自動機是以網格系統下去跑的一種演算法,
每個網格都可視為一個細胞,而身處在網格系統下,
身為一個細胞其週遭一定包圍著八個細胞,
而這也將影響每個細胞本身的狀態.

/

首先,你要知道每個細胞本身可擁有的狀態只分生與死,
以電腦語言來看又可看做1與0或true與flase.

/

而影響這些細胞生死的規則可分為兩種,
誕生規則(Born rule)與存活規則(Survive rule),

誕生規則只適用於死細胞,其設定為,

當本體為死細胞時,
其週遭八個細胞有N個為活時,則本體在運算後於下一代時誕生.

也就是說,你可以設定

當本體為死細胞時,
其週遭八個細胞有2個為活時,則本體在運算後於下一代時誕生.
                                                      或
其週遭八個細胞有4個為活時,則本體在運算後於下一代時誕生.
                                                      或
其週遭八個細胞有5個為活時,則本體在運算後於下一代時誕生.

因此只要本體為死細胞,
但它週遭八個細胞有2或4或5個細胞為活細胞時,
本體於運算後在下一代會變成活細胞.


同理,


存活規則只適用於活細胞,其設定為,

當本體為活細胞,
其週遭八個細胞有N個為活時,則本體在運算後於下一代時維持活狀態.

也就是說,你可以設定

當本體為活細胞時,
其週遭八個細胞有1個為活時,則本體在運算後於下一代時誕生.
                                                      或
其週遭八個細胞有7個為活時,則本體在運算後於下一代時誕生.

因此只要本體為活細胞,
但它週遭八個細胞有1或7個細胞為活細胞時,
本體於運算後在下一代會維持為活細胞,
反之若有0,2,3,4,5,6,8個細胞為活細胞時,
本體於運算後在下一代會變成死細胞.

/

透過這些兩種規則的設定,
我們會得到無法估計的演算結果,
其中最有名的規則即是John Horton Conway的Game of life

Game of life 解說

其規則設定分別為

誕生規則, 當本體為死細胞時,
其週遭八個細胞有3個為活時,則本體在運算後於下一代時誕生.

存活規則,
當本體為活細胞,
其週遭八個細胞有2或3個為活時,則本體在運算後於下一代時維持活狀態.

有興趣的可在最後透過gh的設定去跑跑看結果.

/

在知道基本規則後,我們就要解說如何在gh內用Rabbit去設定CA.
我會先介紹2D再講1D的.

首先整個gh會拆為六個部分,


a部分為先畫出一網格系統,並取各網格中點為細胞,


b部分為任意選一部分的細胞設定為活細胞,
其餘則為死細胞,這是在跑CA的必須設定,一初始狀態.
因此這些被選出設定為活細胞的點必須input到rabbit CA內的
custom state configuration電池,定義它們為活細胞.


接著c部分則是設定誕生規則與存活規則,
我們可以看到它是以slider為設定,
而每個細胞週遭只有8個細胞,
因此slider範圍我們要設成整數的0~8.
B input是輸入誕生規則,
S input是輸入存活規則,
在此我們以Game of life的設定去輸入.
用的是rabbit CA內的Life-like cell電池.


最終,a部分所有的細胞,b部分要被定義為活細胞的細胞,c部分規則的設定,
全部都會各別接上rabbit CA裡最重要的電池,
2D regular cellulat automaton model,也就是d部分.
a接P input,b接SC input,c接C input.


當CA已經設定完了,
我們剩下要做的只剩如何讓它開始運算跟把結果輸出.

在e部分即是做讓它開始運算的步驟,
使用rabbit CA內的CA evolver電池,
t input代表運算幾次,CA input則是將前面d部分輸入的地方.
t input我們可以單純接一個slider,用手動拉slider去運算.

如果今天我們是要看最終結果那還好,
但如果你要看運算1000次的每次結果呢,
那你不是得慢慢拉slider拉到死?
因此你可以用rabbit CA內的Discrete time電池.
它的r input需接boolean,
t output則去接CA evolver的t input,
另外還需用一個timer去設定Discrete time每次運算的間隔時間,
當timer啟動時它就自動開始運算,算到你按停為止.


最後在f部分,靠的是rabbit CA的list cell去將所有運算結果輸出
將e部分CA evolver的m output接到c input,
在f input則輸入true或false,true是輸出活細胞的運算結果,false是輸出死細胞的運算結果.
list cell的P和t ouput最終將可被拿來處理,看要畫圓畫方畫大餅看你開心就好. :)
P output是每次運算出的點,t output是第幾回的運算.


如果還不太懂可以抓gh檔自己開來用用看.
我是2D CA的gh檔,抓我抓我.

/

1D CA則是更簡單的原理,不像2D CA有上下左右的關係,
1D CA只有自身與左右的關係,因此只有在規則輸入的地方與2D CA不同.
你所看到自rabbit CA內1D CA使用的elementary cell電池,
它input的那些什麼010,101,110,001.....
都是在講細胞自身與左右細胞的關係可能性.

例.
010代表自身細胞為活,左右細胞為死
101代表自身細胞為死,左右細胞為活
110代表自身細胞為活,左細胞為活,右細胞為死
001代表自身細胞為死,左細胞為死,右細胞為活

而input進這些0,101,110,001的boolean,
即代表當本身細胞為某狀態時其經運算後再下次會死或維持活狀態.


如果還不太懂沒關係,一樣可以抓gh檔自己開來用用看.
我是1D CA的gh檔,抓我抓我.

/

大概介紹到這,
至於這本體與周圍相對關係的演算法到底可以幹什麼,
那就看你怎麼去定義規則,然後成為你自己的演算法.

:)))))



以上.


Tien

ps.
別忘記抓rabbit,要不然你開了我的gh def也沒用,
抓了之後將rabbit.gha放到gh的components資料夾下,tks.
我是一隻小白兔,抓我抓我.

1 則留言:

  1. 在设计上有什么应用啊 看了很多文献都是土质防灾流行病模拟等

    回覆刪除