森林火灾模拟

该博客介绍了一个使用Python实现的森林火灾模拟程序。通过创建一个二维森林矩阵,模拟了树木生长、火灾蔓延和熄灭的过程。程序利用numpy、matplotlib等库进行数据处理和可视化,并设置了各种概率参数以控制森林的状态变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

森林火灾模拟代码

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值