岩手県 大船渡市の林野火災は、大分延焼を抑えつつあるそうで、鎮火宣言まではあと一息との事。
避難されておられる方々には、お見舞い申し上げます次第です。
少々不謹慎ながらも、Python Extra for fx-CG50 で、森林火災のシミュレーションをやってみました。
大船渡市の林野火災が、ここまで大規模になる前から着手していたのですが、鎮火宣言が近い様子なので、公開したく思います。
森林火災のシミュレーションは、森林を縦横のセルに分割し、各セルは、以下の状態を表現します。
- flat ; 平地
- tree ; 樹木がある
- fire ; 火災延焼中
- burn ; 鎮火 (火災後、燃え尽き)
セル平面には、適当な割合を指定して、樹木を置くか、平地にするかを設定します。
ここでは、0.7の割合で、樹木を置いております。
rate=0.7
その後、何処か適当なセルを指定して、そこに火を置きます。
そうしたら、シミュレーション開始です。
シミュレーションは、つぎの手続きで進行します。
すべてのセルについて調査
- 上下左右のいずれかに火災のセルがある
→ 調査中のセルに樹木がある場合、延焼として、火災セルに置き換える - 調査中セルが火災延焼中
→ 火災後に、樹木が燃え尽きたとして、鎮火セルに置き換える
重要なのは、Life Gameと同様、すべてのセルの状態更新は同時に行う、という点です。
そのため、セル平面は、ゲーム進行の前後で、2つ用意しておきます。
シミュレーションの処理としては、上記の処理を延々と繰り返すのですが、この過程で、火災セルが無くなったら、終了とできます。
この手続きを書き出したのが、以下のスクリプトです。
#
from gint import *
import random
size=8
wi=int(396/size)
he=int(224/size)
col=[C_RGB(31,31,31),C_RGB(0,31,0),C_RGB(31,0,0),C_RGB(0,0,0)]
flat = 0
tree = 1
fire = 2
burn = 3
grid_0=[[flat for j in range(he)] for i in range(wi)]
grid_1=[[flat for j in range(he)] for i in range(wi)]
rate=0.7
# is fire near here ?
def firep(x,y):
c=0
for k in range(4):
i=x+[0,1,0,-1][k]
j=y+[-1,0,1,0][k]
if (i!=x or j!=y)and i>=0 and j>=0 and i<wi and j<he:
if grid_0[i][j]==fire:
c+=1
return c
# evolve
def evl():
for j in range(he):
for i in range(wi):
c=firep(i,j)
if grid_0[i][j]==fire:
grid_1[i][j]=burn
elif grid_0[i][j]==tree and c>0:
grid_1[i][j]=fire
else:
grid_1[i][j]=grid_0[i][j]
# copy grid
def cpy():
for j in range(he):
for i in range(wi):
grid_0[i][j]=grid_1[i][j]
# show field
def show():
fire_sum = 0
for j in range(he):
for i in range(wi):
fire_sum += 1 if grid_0[i][j] == fire else 0
drect(i*size,j*size,(i+1)*size-1,(j+1)*size-1,col[grid_0[i][j]])
dupdate()
return True if fire_sum > 0 else False
# field gen
for j in range(he):
for i in range(wi):
if rate>random.random():
grid_0[i][j]=tree
# ignition
i=random.randrange(wi)
j=random.randrange(he)
grid_0[i][j]=fire
# show field
flg = True
while flg:
flg = show()
evl()
cpy()
getkey()
セル平面をリストによって実現しているので、残念ながら「劇的に早い」というものでもありません。
画像の状態を読み出せるので、うまく利用すれば、速度の改善につながる変更も出来るかも知れませんが、まだ、着手しておりません。
樹木を配置する割合を 0.7 にしていますが、これが 0.8, 0.9 と上がると、ほとんどのセルが火災に見舞われ、焦土と化します。
そこで、0.3, 0.4 と小さい値にすると、火災の延焼は食い止められるのですが、植樹して樹木を育てる、その収量も減ってしまい、寂しい事になってしまいます。
この辺り、色々と替えて、実行してみてください。