【问题标题】:In-Cone only works for patch centers NetlogoIn-Cone 仅适用于补丁中心 Netlogo
【发布时间】:2014-11-07 20:29:12
【问题描述】:

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

【问题讨论】:

    标签: netlogo


    【解决方案1】:

    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 ]。例如,如果 dist1 并且 step0.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 越小,“跳过”补丁角落的可能性越小,但运行所需的时间越长。但我确信您可以找到适合您的价值。

    【讨论】:

    • 我希望看到patch-ahead 成为一种原语。我在 12 个不同的场合写了 10 种不同的方式。
    • 我在上面写的是一个 hack:应该有一种几何方式来做这件事,速度要快得多,而且不会冒丢失补丁角落的风险。一个合适的版本作为一个原语当然是有用的,如果不是在核心语言中,至少在扩展中是有用的。
    【解决方案2】:

    Nicolas 有一个更好的答案来解决沿直线看的问题,但如果您只是直接看前面的补丁,则使用 patch-ahead 1 它可以在所有角度和坐标上工作,并且比圆锥内快得多。

    完全是一回事,但您发现此错误的原因可能是因为您的圆锥体设置为 1 度宽和 10 个补丁长。长而窄的锥体容易破裂。

    【讨论】:

    • 细长的锥体破裂,因为当且仅当它的中心在锥体中时,补丁在锥体中。 (而不是像 OP 所希望的那样,如果补丁的任何部分在锥体中。)
    猜你喜欢
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 2015-05-21
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多