森林火災をセルオートマトンでシミュレーションする
私の最近の興味はもっぱらセルオートマトン(CA, Cellular Automaton)ですが、PC初心者かつまだまだ学び始めの身のため、まずは慣れるためにセルオートマトンを使ったプログラムを書いてみようと思います。
そもそもセルオートマトンってなに?
セルオートマトンとは
セルオートマトンとは、格子状に敷き詰められたセルが単純なルールによって相互作用し状態変化し続ける計算機械のことです。セルはその近傍のセルの状態によって、自身の次の状態を決定し出力します。最近では、様々な複雑な現象をモデル化するためのツールとして用いられています。
一次元セルオートマトン
一列に敷き詰められたセルについて考えるのが一次元のセルオートマトンです。
ここでは、10個のセルを用い、以下のようなルールを考えることとします。
各セルには0または1の2通りの状態をとる。
セルはその左右のセルの状態と自身のセル状態によって次の状態を決定する。
端からすべてのセルについてその両隣を見て、その状態によってセルは変化します。
このルール、1を粒子在り/0を粒子なしと見ると、以下の2つのルールに読み替えることもできます。ある粒子がいるセルにおいて、
次のセルに粒子がいない場合、1つ進む。
次のセルに粒子がいる場合、その場にとどまる。
上のセルを時刻$${t}$$における状態、下のセルを時刻$${t+1}$$における状態とし、左から順にセル番号を1,2,…,10と振るとします。時刻$${t}$$においてセル2ではセル3に粒子がいないため次に時刻でセル3へ移動します。セル4にいる粒子は、セル5に粒子がいるため、次の時刻にも動かずその場にとどまります。
このようなルールで動く1次元のセルオートマトンを表1の10111000の並びからルール184と呼ばれ、交通渋滞などのモデルとしてよく用いられます。
2次元セルオートマトン
セルオートマトンはよく2次元でも考えられます。1次元では一列に並べられたセルを考えましたが、2次元では名の通り縦と横にセルを敷き詰めて考えます。先ほどはセルの左右の状態を見ましたが、2次元では左右上下(斜め4方向を含めることも)の状態を見ます。
よく2次元セルオートマトンの例として用いられるライフゲームがあります。ライフゲームとは生物の捕食被捕食の関係をモデル化するのに用いられるものです。以下がそのルールです。
セルは生か死のいずれかの状態をとる。
セルの周囲8セルを隣接するセル(ムーア近傍)を考える。
死んでいるセルに隣接する生きたセルがちょうど3つあれば、そのセルに次の世代が誕生する。
生きているセルに隣接する生きたセルが2つか3つならば、そのセルは次の世代でも生存する。
生きているセルに隣接する生きたセルが1つ以下ならば、そのセルは過疎により死滅する。
生きているセルに隣接する生きたセルが4つ以上ならば、過密により死滅する。
生物が少ないと死滅し、集まりすぎても死滅する、程よい集まり具合でのみ成長するというのがよく表されていることが分かりますね。
森林火災のシミュレーションをしてみる
森林火災
近年、森林火災のニュースがよく耳に入ってきます。木々の密集する地域では、ある木が燃え始めるとすぐ隣の木に燃え移り、これを繰り返して広い範囲へ火災が広がってしまいます。
森林火災をセルオートマトンで考える
発火の原因は様々かもしれませんが、その燃焼が移り行くさまはまさに周囲に影響を及ぼすという意味でセルオートマトンでのシミュレーションが可能であると考えられます。以下のようなルールを適用します。
セルは木、空地、燃焼の3通りの状態をとり得る。
$${n \times n}$$のセルからなる空間に、木をランダムで配置。
$${g}$$を免疫を表す値とし、隣接するセルの少なくとも1つが燃えているとき、確率$${1-g}$$で燃え始める。
セルは、燃えたら単位時間後に空地へと変わる。
他にも木の発火確率や木の成長などを考慮することもできますが、今回はある1セルの燃焼がそのように広がるかを見たいので新たな発火は考えず、また森林の成長速度は火災の拡大測度に比べて極めて小さいことから、森林の成長なども無視することとします。
実際にシミュレーションしてみる
実際にプログラムを書いて動かしてみます。今回はMATLAB R2023aを使用しました。
森林密度を57%、60%、70%として中心1セルの燃焼からの火災の広がりを実験した結果が以下の通りです。$${n=200}$$、$${g=0.01}$$としています。
森林密度70%
森林密度60%
森林密度57%
木の密度によって広がり方もだいぶ違うことが分かりました。70%ではかなりの速度で燃焼が広がってしまっています。60%ではそこそこの広がりは見られましたが、最大ステップ数を200に設定していたので時間内には広がり切らなかったです。もう少し最大ステップ数を増やせば、より広がったかもしれません。57%では途中で途絶えてしまうことが多く、あまり広域には広がりませんでした。
実際には他にも風や湿度など、様々な考慮すべき点があるとは思いますが、とりあえず簡単なシミュレーションを行うことができました。
今回は以上です。