在为特定生物体编写相关随机游走代码(根据包裹的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。 "朝向"原始似乎是票,虽然我无法推理一种方法来指定原语,只返回景观边缘的海龟朝向最接近它们的栖息地斑块的标题。这就是我的概念和实际僵局所在。
欢迎使用建议,建议,批评和潜在的代码。谢谢大家。
答案 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