我在Netlogo中使用in-cone命令时遇到了一些问题。我试图直接在我的海龟当前位置(即它穿过的所有变量的总和)之前识别所有补丁变量的总和/平均值。然而,当我的乌龟位于补丁的中心时,这似乎只能起作用(坐标是整数而不是小数),这也意味着我只能以正确的角度移动我的乌龟。我还没有在Stackoverflow或其他地方找到有关同一问题的任何其他问题。所以,如果有人能提供一些见解,我将非常感激。
以下是简单的示例代码。我已经注释了进行更改的原因导致此操作无效。
干杯 保罗
turtles-own [value]
patches-own [value-test]
to Set-Up
ca
reset-ticks
ask patches [if pycor > 150 [set value-test 1]]
ask patches [if pxcor > 150 [set value-test 1]]
ask patches [if value-test = 1 [set pcolor red]]
create-turtles 1
ask turtles[
;It works when the turtle is created at the origin (0 0), or at defined coordinates (but not random-xcor random-ycor)
;setxy random-xcor random-ycor
set value 0
set size 10
set color yellow]
end
to go
ask turtles[
;heading has to be 0, 90, 180, or 270.
set heading 270]
ask turtles[
let test mean [value-test] of patches in-cone 10 1
print test
print xcor
print ycor
ask patches in-cone 10 1 [set pcolor blue]
forward 10]
end
答案 0 :(得分:2)
in-cone
不适合这项工作。不幸的是,NetLogo没有一个直线向前看的原语。但是,它确实有patch-ahead
,它会报告给定距离的单个补丁。我们可以使用它来构建类似于您所寻找的东西:
to-report patches-ahead [ dist step ]
report patch-set map patch-ahead n-values (dist / step) [ step + ? * step ]
end
这个代码起初可能看起来令人费解,但实际上它的作用非常简单:
它使用n-values
来构建递增值列表:n-values (dist / step) [ step + ? * step ]
。例如,如果dist
为1
且step
为0.2
,则您获得[0.2 0.4 0.6 0.8 1]
。这些值表示我们要寻找补丁的距离。
它使用map
为列表中的每个值调用patch-ahead
并构建补丁列表。请注意,此列表可能包含重复的修补程序,尤其是step
较小时,因为patch-ahead 0.1
和patch-ahead 0.2
可能是相同的修补程序。
它使用patch-set
将该列表转换为适当的补丁代理集,而不会重复。
(您可以使用while
循环和递增计数器实现相同的功能,但代码会更长,更容易出错,而且更不优雅。)
要使用它,只需在代码中用patches in-cone 10 1
替换patches-ahead 10 0.1
的实例。
您会注意到精确度和速度之间存在权衡:step
越小,“跳过”补丁角落的可能性越小,但运行时间越长。但我相信你能找到一个适合你的价值。
答案 1 :(得分:1)
尼古拉斯有一个更好的解决方案来解决直线问题,但是如果你只是简单地看看前面的补丁那么使用前置补丁1它可以在所有角度和坐标上工作,并且比锥形更快。
完全抛开一边,但可能是你发现这个错误的原因是因为你的锥体设置为1度宽,10个贴片长。狭长的锥体往往会破裂。