我目前正在做一个学习python的小项目。该项目创建一个随机森林,然后将森林点燃以激发森林火灾。所以我设法用一个函数创建了森林。林只是0和1的数组。0表示水,1表示树
所以现在我真的被困在如何用我的阵列激发森林大火上了。我确实知道火灾应该如何发生和蔓延的逻辑,但我不知道应该如何编写代码
逻辑是:
我将使用2表示火,3表示燃烧区域。因此,当树木被烧毁时,阵列中的所有1将变为2,然后是3。以0表示的水不会受到影响。我认为这部分需要使用for循环来完成。所以循环的一次迭代将1变为2,然后下一次for循环将2变为3,并重复直到数组结束
火灾需要从森林的中心开始,因此我需要计算出阵列中心的位置索引,并检查它是否为1,而不是0来启动火灾。这可以在if-else条件下完成
然后,火势将向外蔓延到北面、南面、东面、西面等相邻的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]]
不是为了帮你解决整个问题,带走所有的乐趣,但我相信缺少的部分是
np.where
:此函数输出矩阵中的x、y坐标,您可以使用该坐标对其执行测试,并在相邻单元格(坐标)中对其执行操作
您可以像这样组合这些坐标对以在其上迭代:
还需要state management as explained in this other answer on your question
您正在实现一个细胞自动机,要模拟它,您需要为您的工作创建一个阵列副本。基本算法的工作原理如下:
(函数依赖于细胞自动机的规则。)
相关问题 更多 >
编程相关推荐