首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何激发蟒蛇的森林火灾?

我如何激发蟒蛇的森林火灾?
EN

Stack Overflow用户
提问于 2019-03-25 13:23:07
回答 2查看 312关注 0票数 0

我目前正在做一个学习python的小项目。该项目创建一个随机森林,然后设置森林着火,以刺激森林火灾。所以我设法用一个函数创建了这个林子。森林只是一个0和1的数组。0代表水,1代表一棵树。

所以现在我真的被困在如何用我的阵列来激发森林大火上了。我知道如何引发和蔓延火灾背后的逻辑,但我不知道该如何将其写成代码。

逻辑是:

  1. 我会用2来表示一场火灾,用3来代表被烧毁的区域。因此,当树木被烧毁时,数组中的所有1s都会变成2,然后是3。水,以0表示,不会受到影响。我认为这部分需要用一个循环来完成。因此,循环的一个迭代将改变1到2,然后下一个for-循环将改变2到3,并重复到数组的末尾。
  2. 火灾需要从森林的中心开始,所以我需要计算数组中心的位置索引,并检查是否为1,而不是0来引发火灾。这可以用如果-否则的条件来完成。
  3. 然后火就会向北、南、东、西等方向向邻接的1s扩散。

所以我很难写出循环,把1替换成2,然后用3来代替,这样它就从一棵树扩散到另一棵树。

我成功地编写了一个函数来创建随机林。问题是把森林放火焚烧。我试着写了一些for-循环,但我真的不知道该如何处理这个问题。

代码语言:javascript
复制
#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的数组:

代码语言:javascript
复制
[[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]]
EN

回答 2

Stack Overflow用户

发布于 2019-03-25 13:37:01

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

代码语言:javascript
复制
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坐标,用于在相邻单元格(坐标)中执行测试和操作。

您可以这样组合这些坐标对来迭代它们:

代码语言:javascript
复制
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也是必需的。

票数 0
EN

Stack Overflow用户

发布于 2019-03-25 13:38:43

您正在实现一个元胞自动机,为了模拟这个过程,您需要为您的工作创建一个数组的副本。基本算法的工作方式如下:

代码语言:javascript
复制
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

( calculate_new_cell(state, i, j)函数依赖于元胞自动机的规则。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55338811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档