我是编码的初学者。我很高兴收到关于我的问题以及我对问题的描述方式的建设性批评。
我在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
原始代码较大,但我将问题缩小到此代码段。它是模型世界设置过程的一部分,此处的目的是在模型世界上随机创建定义大小的牧场。 (供奶牛搜索和吃东西,但这不是现在的主题)
我希望代码可以随机贴片并在其上种草,然后将该片周围的植被面积增加到一定大小。所以我期望的结果是这样的:
但是,我得到了一个绿色的区域,该区域的大小和形状各不相同,有时可以覆盖整个世界。就像Blob一样。这里有一些不同外观的示例:
可以忽略“ Blob创建”,例如,如果在定义后第一个带有草的补丁被涂成绿色,然后在第二步中搜索绿色补丁而不是草> 0的补丁。我发现的每个解决方案都需要其他步骤,希望避免这些步骤。最重要的是,我想了解为什么会这样,所以我可以避免它,甚至在将来使用它。
代码非常简单明了。因此,我想这更多是理解Netlogos对命令的解释的问题。
NeLogo为什么不按我期望的那样执行命令?
答案 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运行时得到草的补丁不会最终自己运行。