在NetLogo中计算海龟标题到特定补丁

时间:2014-07-08 19:36:55

标签: netlogo direction heading

在为特定生物体编写相关随机游走代码(根据包裹的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字典,浏览几个示例模型,并在互联网上闲逛之后,我还没有找到一种优雅的方法来计算TurtleDirectionToClosestHabitat。 "朝向"原始似乎是票,虽然我无法推理一种方法来指定原语,只返回景观边缘的海龟朝向最接近它们的栖息地斑块的标题。这就是我的概念和实际僵局所在。

欢迎使用建议,建议,批评和潜在的代码。谢谢大家。

2 个答案:

答案 0 :(得分:1)

从你到目前为止所说的话来看,下面的三个触发器将为你提供你所追求的东西:前往边界处每只乌龟最近的其他栖息地。 (我们不会防止栖息地上有乌龟。)

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

答案 1 :(得分:0)

如果其他人想要在栖息地边缘构建具有特定乌龟行为的模型,我会分享完成的代码部分。每个“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