如何在python中激发森林火灾?

2024-09-27 21:32:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在做一个学习python的小项目。该项目创建一个随机森林,然后将森林点燃以激发森林火灾。所以我设法用一个函数创建了森林。林只是0和1的数组。0表示水,1表示树

所以现在我真的被困在如何用我的阵列激发森林大火上了。我确实知道火灾应该如何发生和蔓延的逻辑,但我不知道应该如何编写代码

逻辑是:

  1. 我将使用2表示火,3表示燃烧区域。因此,当树木被烧毁时,阵列中的所有1将变为2,然后是3。以0表示的水不会受到影响。我认为这部分需要使用for循环来完成。所以循环的一次迭代将1变为2,然后下一次for循环将2变为3,并重复直到数组结束

  2. 火灾需要从森林的中心开始,因此我需要计算出阵列中心的位置索引,并检查它是否为1,而不是0来启动火灾。这可以在if-else条件下完成

  3. 然后,火势将向外蔓延到北面、南面、东面、西面等相邻的1

所以我很难写出循环,用2替换1,然后用3替换2,这样它就可以从一棵树传播到另一棵树

我设法编写了一个函数来创建随机林。问题在于把森林放火。我试着写一些for循环,但我真的不知道该如何解决这个问题

#Define parameters for createForest Function. Sets the parameters for the forest too.
width = int(5) 
height = int(5) 
density = float(0.7) # probability of spawning a tree 
forest = [[]]

#Making a random forest
def createForest(width, height, density): 
    forest = np.random.choice(2, size=(width, height), p=[(1-density), density]) 
    return forest

print(createForest(width, height, density))
forest = createForest(width, height, density) # updates forest into the list

这将以随机顺序打印0和1的数组:

[[1 0 1 1 1]
 [1 1 1 1 1]
 [0 0 1 1 1]
 [1 1 1 1 1]
 [1 1 1 1 1]]

Tags: the项目函数for森林数组逻辑density
2条回答

不是为了帮你解决整个问题,带走所有的乐趣,但我相信缺少的部分是np.where

import numpy as np
forest = np.random.randint(0, 2, (10,10))
x, y = np.where(forest == 1)
print(x)  # up down
print(y)  # left right

此函数输出矩阵中的x、y坐标,您可以使用该坐标对其执行测试,并在相邻单元格(坐标)中对其执行操作

您可以像这样组合这些坐标对以在其上迭代:

coord_pairs = np.vstack((x,y))
coord_pairs.shape  # (2, 48)
coord_pairs[0,:]  # x
coord_pairs[1,:]  # y

for k in range(coord_pairs.shape[1]):
    print(f"x:{coord_pairs[0,k]}, y:{coord_pairs[1,k]}")

还需要state management as explained in this other answer on your question

您正在实现一个细胞自动机,要模拟它,您需要为您的工作创建一个阵列副本。基本算法的工作原理如下:

new_state = state.copy()
for i in range(height):
    for j in range(width):
        new_state[i,j] = calculate_new_cell(state, i, j)

state = new_state

(函数依赖于细胞自动机的规则。)

相关问题 更多 >

    热门问题