岩手県 大船渡市の林野火災は、大分延焼を抑えつつあるそうで、鎮火宣言まではあと一息との事。
避難されておられる方々には、お見舞い申し上げます次第です。
少々不謹慎ながらも、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 と小さい値にすると、火災の延焼は食い止められるのですが、植樹して樹木を育てる、その収量も減ってしまい、寂しい事になってしまいます。
この辺り、色々と替えて、実行してみてください。
0 件のコメント:
コメントを投稿