CA-森林火災

参考: 『Mathematica自然現象の計算モデル化』

サイト値:  1:木、0:空き地、e:火

ルール:
- 空き地の周りに木が一本立っていれば、自分の場所にも木が立つ。
- 火の周りに木がある時は、火が周囲に移って、現在の場所は空き地になる
- 木が立っている場所で、周りに一カ所でも火があればそこにも火が移る。

パラメータ:
- n0: 森のサイズ
- r0: 初期状態で木が生えている確率
- t: 繰り返し時間
In [ ]:
showSites[board_] := ArrayPlot[Reverse[board], 
        ColorRules -> {e -> Red, 1 -> Green, 0 -> Black}]
In [ ]:
forestFire[n0_, r0_, t_] := 
 Module[{checkMap, vnNeghbors0, updateMap, rule, forest},
  setupMap[r_, n_] := Module[{map},
    map = Partition[Table[Floor[r + RandomReal[]], {n*n}], n];
    map[[RandomInteger[{n, 3}], RandomInteger[{n, 5}]]] = e;
    map];
  forest = setupMap[r0, n0];
  rule = {
    {{_, _, _}, {1, e, _}, {_, _, _}} -> 0,
    {{_, _, _}, {_, 1, e}, {_, _, _}} ->  e, 
    {{_, 1, _}, {_, e, _}, {_, _, _}} -> 0,
    {{_, _, _}, {_, 1, _}, {_, e, _}} ->  e, 
    {{1, _, _}, {_, e, 1}, {_, _, _}} -> 0,
    {{_, _, _}, {e, 1, _}, {_, _, _}} ->  e, 
    {{1, _, _}, {_, e, _}, {_, 1, _}} -> 0,
    {{_, e, _}, {_, 1, _}, {_, _, _}} ->  e, 
    {{_, 0, _}, {0, e, 0}, {_, 0, _}} ->  0,
    {{_, 0, _}, {1, 0, 0}, {_, 0, _}} ->  0,
    {{_, 1, _}, {0, 0, 0}, {_, 0, _}} ->  0,
    {{_, 0, _}, {0, 0, 1}, {_, 0, _}} ->  0,
    {{_, 0, _}, {0, 0, 0}, {_, 1, _}} ->  0,
    {{_, _, _}, {_, self_, _}, {_, _, _}} -> self};
  CellularAutomaton[rule, forest, t]]
In [ ]:
foreststeps = forestFire[100, 0.7, 50];
In [ ]:
showSites/@Take[foreststeps, {1,50,5}]
Out[ ]:
Output
In [ ]: