为什么NetLogo创建Blob而不是透明形状?

时间:2019-02-28 15:38:47

标签: netlogo

我是编码的初学者。我很高兴收到关于我的问题以及我对问题的描述方式的建设性批评。

我在NetLogo中的这段代码有问题:

patches-own[grass]
to setup
  clear-all
  ask one-of patches              ;;pic a random patch as center of the pasture
    [set grass 1]                 ;;and plant grass on it
  ask patches                     ;;search through all the patches to find the one (or several ones) 
    [if grass > 0                 ;;with grass on it
      [ask patches in-radius 3    ;;select the area arround the patch with the grass
        [set grass 1]]]             ;;and also plant grass here
   ask patches                     ;;search through all the patches to find the one (or several ones)
    [if grass > 0                 ;;with grass on it
      [set pcolor green]]         ;;and paint them green
  reset-ticks
  end

原始代码较大,但我将问题缩小到此代码段。它是模型世界设置过程的一部分,此处的目的是在模型世界上随机创建定义大小的牧场。 (供奶牛搜索和吃东西,但这不是现在的主题)

我希望代码可以随机贴片并在其上种草,然后将该片周围的植被面积增加到一定大小。所以我期望的结果是这样的:

expected outcome

但是,我得到了一个绿色的区域,该区域的大小和形状各不相同,有时可以覆盖整个世界。就像Blob一样。这里有一些不同外观的示例:

the blobs

可以忽略“ Blob创建”,例如,如果在定义后第一个带有草的补丁被涂成绿色,然后在第二步中搜索绿色补丁而不是草> 0的补丁。我发现的每个解决方案都需要其他步骤,希望避免这些步骤。最重要的是,我想了解为什么会这样,所以我可以避免它,甚至在将来使用它。

代码非常简单明了。因此,我想这更多是理解Netlogos对命令的解释的问题。

NeLogo为什么不按我期望的那样执行命令?

1 个答案:

答案 0 :(得分:3)

好问题!关键部分是这一点:

  ask patches                     ;;search through all the patches to find the one (or several ones) 
    [if grass > 0                 ;;with grass on it
      [ask patches in-radius 3    ;;select the area arround the patch with the grass
        [set grass 1]]]

ask遍历每个补丁,让每个补丁依次运行随附的代码。 ask以随机顺序进行操作(或更准确地说,诸如patches之类的代理集是无序的)。例如,假设补丁0 0运行此代码并给出周围的补丁草。补丁0 1恰好接下来运行。由于它现在有草(由补丁0 0赋予),因此它也将草给它的邻居。现在,假设路径0 2恰好接下来运行,依此类推。因此,斑点的形状将取决于补丁程序运行代码的顺序。如果某个补丁程序的补丁程序被其邻居之一授予,则它将为其邻居程序提供草。

幸运的是,修复很简单。您可以使用with来要求补丁带有草的补丁来运行它,而不是检查补丁在运行该代码块时是否有草。看起来像这样:

  ask patches with [ grass > 0 ] ;;search through all the patches to find the one (or several ones) 
    [ask patches in-radius 3     ;;select the area arround the patch with the grass
      [set grass 1]]

patches with [ grass > 0 ]仅指那些带有草的补丁(在任何补丁执行任何操作之前),这样,在Ask运行时得到草的补丁不会最终自己运行。