参考: 『Mathematica自然現象の計算モデル化』
サイト値: 1:木、0:空き地、e:火
ルール:
- 空き地の周りに木が一本立っていれば、自分の場所にも木が立つ。
- 火の周りに木がある時は、火が周囲に移って、現在の場所は空き地になる
- 木が立っている場所で、周りに一カ所でも火があればそこにも火が移る。
パラメータ:
- n0: 森のサイズ
- r0: 初期状態で木が生えている確率
- t: 繰り返し時間
showSites[board_] := ArrayPlot[Reverse[board],
ColorRules -> {e -> Red, 1 -> Green, 0 -> Black}]
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]]
foreststeps = forestFire[100, 0.7, 50];
showSites/@Take[foreststeps, {1,50,5}]