我有补丁如下:
我想对白色贴片进行着色,如下图所示:
这里是我的代码,用蓝色着色白色补丁:
ask patches with [pcolor = white] [
if any? neighbors with [pcolor = blue] [set pcolor blue] ]
但问题是我获得了这个数字:。
提前感谢您的帮助。
答案 0 :(得分:2)
问题出现是因为补丁按顺序更改,因此一些白色补丁在响应ask
时发现它们有新的蓝色邻居。
ask patches with [pcolor = white and any? neighbors with [pcolor = blue]] [set pcolor blue]
注意:编辑此答案是为了回应Nicholas的观察,with
将在调用ask
之前创建整个代理集。但是我坚持使用neighbors
,因为我是如何阅读这个问题的。
答案 1 :(得分:2)
Alan对您的问题的原因是正确的,但您不需要创建next-pcolor
补丁变量。如果你将两个条件放在with
块内,NetLogo将首先构建补丁的代理集,然后要求这些补丁执行操作,从而避免计时你遇到的问题。我们来试试吧。而且由于你显然不得不同时使用蓝色和青色补丁,让我们构建一个更通用的版本:
to color-white-patches-v1 [ c ]
ask patches with [ pcolor = white and any? neighbors with [ pcolor = c ]] [
set pcolor c
]
end
然后您可以拨打:
color-white-patches-v1 cyan
color-white-patches-v1 blue
结果如下:
但这并不是你想要的。那是因为neighbors
为你提供了一个补丁的所有8个邻居。让我们尝试使用neighbors4
:
to color-white-patches-v2 [ c ]
ask patches with [ pcolor = white and any? neighbors4 with [ pcolor = c ]] [
set pcolor c
]
end
还没到那里。它认为你将不得不诉诸patch-at
之类的东西。在这个例子中,我只看上面的补丁:
to color-white-patches-v3 [ c ]
ask patches with [ pcolor = white and [ pcolor ] of patch-at 0 1 = c ] [
set pcolor c
]
end
我不确定这是否正是您想要的以及适用于您的一般问题的效果,但是patch-at
的某种组合,您应该能够得到您所需要的。