森林火灾模拟代码
import numpy as np
import matplotlib.pyplot as plt
import random
import copy
class Forest:
def __init__(self):
self.forest_size = (100,100)
self.forest = np.zeros(self.forest_size,int)
self.forest_temp = copy.deepcopy(self.forest)
self.time=0.001
self.forest_rate = 0.25 #树木所占比例
#0:空位 1:燃着 2:树木
self.empty_grow = 0.0003
self.tree_get_fire = 0.0005
self.rec_forest = 0
self.rec_fired = 0
self.rec_turn = 0
#self.search=[(1,1),(1,0),(1,-1),(0,1),(0,-1),(-1,1),(-1,0),(-1,-1)]
self.search=[(1,0),(-1,0),(0,1),(0,-1)]
self.fire_color = [1]
self.empty_color = [0]
def possibility(self,p):
use = random.random()
return use<p
def make_forest(self):
for x in range(self.forest_size[0]):
for y in range(self.forest_size[1]):
if self.possibility(self.forest_rate):
self.forest_temp[x][y] = 2#变成树木
self.rec_forest += 1
return
def show(self):
self.forest = copy.deepcopy(self.forest_temp)
self.rec_turn +=1
plt.imshow(self.forest)
plt.pause(self.time)
print("回合数:",self.rec_turn)
print("着火地点:",self.rec_fired,"树木数:",self.rec_forest)
return
def get_color_nearby(self,use,x,y):
rec = 0
for id in self.search:
new_x = x+id[0]
new_y = y+id[1]
if new_x<0 or new_x>=self.forest_size[0] or new_y<0 or new_y>=self.forest_size[1]:
continue
rec += self.forest[new_x][new_y] in use
return rec
def work_empty(self,x,y):#是空地 有概率生长成树木
if self.possibility(self.empty_grow):
self.rec_forest += 1
self.forest_temp[x][y] = 2
return
def work_fire(self,x,y):#下回合熄灭
self.rec_fired -= 1
self.forest_temp[x][y] = 0
return
def work_tree(self,x,y):
tot = self.get_color_nearby(self.fire_color,x, y)#是树木 如果周围有火源 燃烧
if tot > 0:
self.rec_fired += 1
self.rec_forest -= 1
self.forest_temp[x][y] = 1
else:
if self.possibility(self.tree_get_fire):#有概率自行着火
self.rec_fired += 1
self.rec_forest -= 1
self.forest_temp[x][y] = 1
return
def go(self):
self.make_forest()
while 1:
self.show()
for x in range(self.forest_size[0]):
for y in range(self.forest_size[1]):
if self.forest[x][y] == 0:
self.work_empty(x, y)
if self.forest[x][y] == 1:
self.work_fire(x, y)
if self.forest[x][y] == 2:
self.work_tree(x, y)
return
if __name__ == "__main__":
forest=Forest()
forest.go()