2

在为特定生物体编写相关随机游走代码(根据包裹的柯西分布)时,我在某种程度上处于概念和实践的僵局。在景观中,有机体的运动将根据其位置(栖息地内、栖息地外和边缘边界内)来确定。相关随机游走代码如下,其中 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。“朝向”原语似乎是一张票,尽管我无法推断出一种方法来指定原语以仅将景观边缘边界中的海龟的航向返回到最靠近它们的栖息地斑块。这就是我的概念和实践僵局所在。

欢迎提出建议、建议、批评和潜在的代码片段。谢谢你们。

4

2 回答 2

1

从你目前所说的来看,下面的三个 proc sd 让你得到你所追求的:边界处每只海龟到最近的其他栖息地的航向。(我们不防范栖息地补丁上有一只乌龟。)

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
于 2014-07-09T13:36:26.180 回答
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
于 2014-09-29T18:55:37.043 回答