【netlogo教學】第7章:用netlogo模擬細胞自動機(Celluar Automata , CA)

一、什麼是細胞自動機(Celluar Automata , CA)

細胞自動機,簡稱 CA,在1940年代由Stainslaw Ulam 和 John Von Neumann 所提出,是一種網格狀態的規則。

  1. 在一個由許多網格組成的環境中
  2. 網格只有兩種狀態 : 生或死(0或1)
  3. 每個網格在下一刻的狀態是由自己鄰居數有關
  4. 鄰居是指九宮格內除了自己以外的8個網格

二、Conway由細胞自動機衍化的生命遊戲(Game of Life)

1970年代,數學家康維(Conway)基於細胞自動機的基礎衍化出生命遊戲。生命遊戲的規則是周圍鄰居數太多或太少,自己的下個狀態都會死,詳細規則如下。

  1. 對於活的網格,周圍活的網格數大於等於1,且小於等於4(1 <= 活的鄰居數 <= 4),則自己仍為活的網格,否則下一個狀態會是死的網格。
  2. 對於死的網格,周圍活的網格數剛好等於3(3 = 活的鄰居數),則自己會變為活的網格,否則不變。
netlogo-CA-生命遊戲圖解
netlogo-CA-生命遊戲圖解

三、netlogo模擬生命遊戲

將netlogo的patches(網格)作為生命遊戲模擬中的網格,每個網格位有一個變數來代表目前是生是死,生的網格以紅色表示,死的網格以黑色表示。

(一)netlogo介面

setup按鈕:用來初始化環境設定

go按鈕:循環執行(forever),主程式

netlogo-CA-介面示意
netlogo-CA-介面示意

(二)netlogo完整程式碼

patches-own [ live-cell  value ] 
 
to setup 
  ca 
  ask n-of 100 patches 
    [birth] 
end 
 
to birth 
set value 1 
set pcolor red 
end 
 
to death 
 set value 0 
 set pcolor black 
end 
 
to go 
 ask patches 
 [ set live-cell count neighbors with [ value = 1 ] 
 ] 
 ask patches 
  [ifelse  ( value = 0 ) and ( live-cell  = 3 ) 
    [ birth ] 
  [ifelse ( ( value = 1 ) and ( live-cell >= 2 ) ) and  ( ( value = 1 ) and ( live-cell <= 3 ) ) 
  [ birth ] 
  [ death ] ] ] 
end

(二)netlogo程式碼-分段說明

1. 宣告變數

value:每個網格的狀態,生=1,死=0

live-cell:用來計算周圍8個鄰居有多少活的網格(value = 1)

patches-own [ live-cell  value ] 

patches-own語法:宣告幾個只屬於patch可以用的變數。

patches-own [ 變數1  變數2  ...  變數n ] 

2. setup初始化

先用ca清空所有設定,然後隨機讓100個網格的狀態為生。

to setup 
   ca 
   ask n-of 100 patches 
     [birth] 
 end 

ca語法:清除所有agent的各種設定。是clear-all的簡寫

ca
clear-all

3. 讓網格狀態為生的function : birth

將網格的value設為1,代表狀態為生,顏色設為紅色做區隔。

to birth 
 set value 1 
 set pcolor red 
 end 

4. 讓網格狀態為生的function : death

將網格的value設為0,代表狀態為死,顏色設為黑色(預設顏色)。

to death 
  set value 0 
  set pcolor black 
 end 

5. go主程式

(1) 將網格的live-cell設為周圍活的鄰居數量(count neighbors with [ value = 1 ])

(2) 如果目前狀態為生,且1 <= 活的鄰居數 <= 4,則自己的下個狀態會是活的網格;否則為死的網格。

(3) 如果目前狀態為死,且3 = 活的鄰居數,則自己的下個狀態會是活的網格;否則為死的網格。

to go 
  ask patches 
  [ set live-cell count neighbors with [ value = 1 ] 
  ] 
  ask patches 
   [ifelse  ( value = 0 ) and ( live-cell  = 3 ) 
     [ birth ] 
   [ifelse ( ( value = 1 ) and ( live-cell >= 2 ) ) and  ( ( value = 1 ) and ( live-cell <= 3 ) ) 
   [ birth ] 
   [ death ] ] ] 
 end

with語法:回傳符合條件的agents

agents  with  [ 條件 ]

neighbors語法:取得patch周圍8個patch (不含自己)

neighbors
netlogo-CA-neighbors圖示
netlogo-CA-neighbors圖示

count語法:計算符合條件的agent的數量

count  符合某條件的agent

ifelse語法:當條件判斷的結果為真(true)則執行第一段程式,否則執行第二段

 ifelse 條件判斷
 [ 執行程式1 ] ( 當條件判斷的結果為真(true)的時候會執行這裡 )
 [ 執行程式2 ] ( 當條件判斷的結果為假(false)的時候會執行這裡 )
netlogo-CA-ifelse說明圖
netlogo-CA-ifelse說明圖

更多netlogo教學系列
上一篇:【netlogo教學】第6章:用crt(create turtles)產生turtle

下一篇:【netlogo教學】第8章:用random產生隨機亂數


若有教學或其他合作需求,歡迎來信 nbablissfully@hotmail.com 詳談


小額支持鍾肯尼

如果我的文章有幫助到你,歡迎你點這裡開啟只要40元的小額贊助連結,可以贊助我一杯咖啡錢;我會更有動力繼續寫作,幫助大家解決更多問題。

發佈留言