In-Cone仅适用于补丁中心Netlogo

时间:2014-11-07 10:19:15

标签: netlogo

我在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

2 个答案:

答案 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 ]。例如,如果dist1step0.2,则您获得[0.2 0.4 0.6 0.8 1]。这些值表示我们要寻找补丁的距离。

  • 它使用map为列表中的每个值调用patch-ahead并构建补丁列表。请注意,此列表可能包含重复的修补程序,尤其是step较小时,因为patch-ahead 0.1patch-ahead 0.2可能是相同的修补程序。

  • 它使用patch-set将该列表转换为适当的补丁代理集,而不会重复。

(您可以使用while循环和递增计数器实现相同的功能,但代码会更长,更容易出错,而且更不优雅。)

要使用它,只需在代码中用patches in-cone 10 1替换patches-ahead 10 0.1的实例。

您会注意到精确度和速度之间存在权衡:step越小,“跳过”补丁角落的可能性越小,但运行时间越长。但我相信你能找到一个适合你的价值。

答案 1 :(得分:1)

尼古拉斯有一个更好的解决方案来解决直线问题,但是如果你只是简单地看看前面的补丁那么使用前置补丁1它可以在所有角度和坐标上工作,并且比锥形更快。

完全抛开一边,但可能是你发现这个错误的原因是因为你的锥体设置为1度宽,10个贴片长。狭长的锥体往往会破裂。