在 NetLogo 中计算特定补丁的海龟航向

Posted

技术标签:

【中文标题】在 NetLogo 中计算特定补丁的海龟航向【英文标题】:Calculating Turtle Heading to Specific Patches in NetLogo 【发布时间】:2014-08-29 16:36:02 【问题描述】:

在为特定生物体编写相关随机游走代码(根据包裹的 Cauchy 分布)时,我在概念上和实践上都陷入了僵局。在景观中,有机体的运动将根据其位置(栖息地内、栖息地外和边缘边界内)来确定。相关随机游走代码如下,其中rho和步长将根据生物是在栖息地还是栖息地外来确定。

set heading ((heading * pi / 180 + 2 * atan  (( (1 - rho) / (1 + rho)
  ) * tan(pi * ( random-float 1 - 0.5 ))) 1)) * 180 / pi
set step-size random-gamma alpha lambda
set xc xc + (step-size * dx)
set yc yc + (step-size * dy)

棘手的部分,也是我被卡住的地方,是在边缘边界。在这里,有机体的运动受到有机体到最近栖息地斑块的方向的影响。该方向乘以一个参数以产生修改后的相关随机游走代码。为了编写这段代码,有必要知道每只海龟前往景观中最近的栖息地。一旦知道了,我相信我可以修改相关随机游走代码如下:

set heading [(EdgeParameter * TurtleDirectionToClosestHabitat) + [(1 -
  EdgeParameter)*[((heading * pi / 180 + 2 * atan (( (1 - rho) / (1 +
  rho) ) * tan(pi * ( random-float 1 - 0.5 ))) 1)) * 180 / pi]]]

在浏览了 NetLogo 字典、浏览了几个示例模型并浏览了 Internet 之后,我还没有找到一种优雅的方法来计算 TurtleDirectionToClosestHabitat。 “朝向”原语似乎是一张票,尽管我无法推断出一种方法来指定原语以仅将景观边缘边界中的海龟的航向返回到最靠近它们的栖息地斑块。这就是我的概念和实践僵局所在。

欢迎提出建议、建议、批评和可能的代码片段。谢谢大家。

【问题讨论】:

那么你想要的是让所有处于景观边缘边界的海龟看向一个特定的方向? 你为什么使用xcyc而不是xcorycor 大卫:是的,这就是我想要做的。 Seth:xc 和 yc 是海龟专用的全局变量。我的一位同事是这样写的,我们只是没有改变它。 【参考方案1】:

从您目前所说的来看,shd 下面的三个 proc 可以为您提供所需的内容:边界处每只海龟前往最近的其他栖息地。 (我们不防备有乌龟的栖息地。)

to-report edge-turtles  ;;observer proc
  ;;assume wrapping has been turned off in this world
  report turtles with [count neighbors < 8]
end

to-report closest-habitat  ;;turtle-proc
  ;;here we assume habitat patches are green (change appropriately)
  let %closest nobody
  ask patch-here [
    set %closest min-one-of (other patches with [pcolor = green]) [
      distance myself
    ]
  ]
report %closest
end

to-report heading-to-closest-habitat ;;turtle-proc
  report towards closest-habitat
end

【讨论】:

我认为您不需要heading-to-closest-habitat 程序?不应该只是 towards closest-habitat 工作吗? other patch with ... 不会在这里做你想做的事。 other 只排除调用代理,但这里调用代理是海龟,不是补丁。【参考方案2】:

我想我会为此分享完整的代码部分,以防其他人正在寻找在栖息地边缘构建具有特定海龟行为的模型。每个“if pcolor =”标识一个特定类型的补丁,分隔栖息地、矩阵和三个边缘边界,每个边界都有特定的运动参数。另请注意,包装的 Cauchy 与 Alan 的代码的特殊用途 - 这是根据 Schultz 和 Crone 2001 的偏差相关随机游走构造的。

如果有人有更多反馈,我将不胜感激。

to fly-butterflies
 ask butterflies [
  if pcolor = green [
    set heading ((heading * pi / 180 + 2 * atan  (( (1 - cos TurningAngleLupine) / (1 + cos TurningAngleLupine) ) * tan(pi * ( random-float 1 - 0.5 ))) 1)) * 180 / pi
    set step-length random-exponential MoveLengthLupine
    set xc xc + (step-length * dx)
    set yc yc + (step-length * dy)]
  if pcolor = black [
    set heading ((heading * pi / 180 + 2 * atan  (( (1 - cos TurningAngleMatrix) / (1 + cos TurningAngleMatrix) ) * tan(pi * ( random-float 1 - 0.5 ))) 1)) * 180 / pi
    set step-length random-exponential MoveLengthMatrix
    set xc xc + (step-length * dx)
    set yc yc + (step-length * dy)]
  if pcolor = cyan [
    set heading ((heading * pi / 180 + 2 * atan  (( (1 - cos TurningAngleEdge) / (1 + cos TurningAngleEdge) ) * tan(pi * ( random-float 1 - 0.5 ))) 1)) * 180 / pi
    set step-length random-exponential MoveLengthEdge
    set xc xc + (step-length * dx)
    set yc yc + (step-length * dy)]
  if pcolor = blue [
    set heading ((heading * pi / 180 + 2 * atan  (( (1 - cos TurningAngleEdge) / (1 + cos TurningAngleEdge) ) * tan(pi * ( random-float 1 - 0.5 ))) 1)) * 180 / pi
    set step-length random-exponential MoveLengthMatrix
    set xc xc + (step-length * dx)
    set yc yc + (step-length * dy)]
  if pcolor = sky [
    let %closest nobody
    ask patch-here [set %closest min-one-of (other patches with [pcolor = green]) [distance myself]]
    set heading (Bias * towards %closest) + ((1 - Bias) * ((heading * pi / 180 + 2 * atan  (( (1 - cos TurningAngleEdge) / (1 + cos TurningAngleEdge) ) * tan(pi * ( random-float 1 - 0.5 ))) 1)) * 180 / pi)
    set step-length random-exponential MoveLengthEdge
    set xc xc + (step-length * dx)
    set yc yc + (step-length * dy)]
  ifelse patch-at (xc - xcor) (yc - ycor) = nobody
    [ ht ]
    [ st
    set xcor xc
    set ycor yc ]
]
end

【讨论】:

以上是关于在 NetLogo 中计算特定补丁的海龟航向的主要内容,如果未能解决你的问题,请参考以下文章

NetLogo - 如何显示海龟的当前坐标

如何让海龟在 netlogo 中从世界边界反弹

如何让一只乌龟能够在 Netlogo 中保存其他乌龟 ID?

Netlogo - 将补丁标签的位置设置为中心

将指南针的航向计算到特定坐标而不是北

创建补丁的“行程”代理集