乌龟均匀分布

Uniform distribution of turtles

我正在尝试在 max-pxcor 和 max-pycor = 49 的世界中创建海龟的均匀分布,左下角为 0,0,在一个不环绕的世界中。 我使用了来自虚拟实验室 (https://virtualbiologylab.org/population-ecology/) MarkRecpature 模型的代码来创建均匀分布,但我 运行 遇到了我不完全理解的问题。 (我的 NetLogo 知识不足以尝试创建我自己的代码来统一分配点!) 模型因运行时错误而停止:

 “ASK expected input to be an agent or agentset but got nobody instead” 

relating to: 
“ask patch x y” part of the code. 

已经设置了一些海龟,但不是全部,我不知道错误是什么,因为当我检查产生错误的海龟时,它有一个落在世界维度内的计数器和计数器 2 值,并且从这段代码中,我希望以 counter 和 counter2 作为 x,y 坐标的补丁也落在世界范围内。所以这段代码有些地方我没有完全理解。谁能帮忙?谢谢,爱妮

turtles-own [counter counter2 home_x home_y]

to setup
clear-all                               
reset-ticks                             
  
create-turtles N-turtles                  ;;create N turtles based on slider

end
  
to go
  
    ask turtles
[
    set counter max-pxcor  / sqrt N-turtles  / 2
set counter2 max-pycor / sqrt N-turtles  / 2
repeat N-turtles
[
let x (counter + random 5 - random 5)
let y (counter2 + random 5 - random 5)
ask patch x y
[
    sprout 1
    [
    set home_x x
    set home_y y
    ]
]
set counter counter +  max-pxcor  / sqrt N-turtles
if counter >= max-pxcor
[
    set counter max-pxcor  / sqrt N-turtles  / 2
    set counter2  counter2 + max-pycor  / sqrt N-turtles
    ]]]
  
end

我能够在两种不同的场景中重现崩溃。要找出错误的确切位置,它有助于在提供输出的代码中添加一些额外的命令:

  let x (counter + random 5 - random 5)
show word "x: " x
  let y (counter2 + random 5 - random 5)
show word "y: " y
  ask patch x y [...]

这告诉我错误主要发生在你的 Y 超过 49 时,此时不再有对应于坐标的补丁。您已经为 X 坐标自己解决了这个问题。通过在代码末尾附近添加 if counter2 >= max-pycor [set counter2 max-pycor / sqrt N-turtles / 2] 来重新调整您的解决方案,此问题已解决。

我崩溃的第二种情况是当 X 或 Y 低于 0 时。当您的 N-turtles 较高时可能会发生这种情况,因此您的 max-pxcor / sqrt N-turtles / 2 低于 5。如果发生这种情况,let x (counter + random 5 - random 5) 可能偶尔会 return 为负值。我建议让这里的随机数与你的世界大小和海龟数量成比例。 (我对统一分布的了解不够,无法在此处建议最佳选择)

原始模型不必担心这些问题,因为那里启用了世界环绕。

最后,虽然您没有特别要求,但您的代码会生成 (N-turtles^2 + N-turtles) 海龟,而不是 N-turtles,因为您首先生成 N-turtles 然后让它们中的每一个生成另一个 N-turtles。我删除了你的第一代乌龟,并将计数器移至全局变量。

turtles-own [home_x home_y]
globals [counter counter2]

to setup
clear-all                               
reset-ticks                             
end
  
to go

  let distance-x max-pxcor  / sqrt N-turtles
  let distance-y max-pycor / sqrt N-turtles
  
  set counter distance-x / 2
  set counter2 distance-y / 2
  repeat N-turtles [
    let x (counter + random distance-x / 2 - random distance-x / 2)
    show word "x: " x
    let y (counter2 + random distance-y / 2 - random distance-y / 2)
    show word "y: " y
    
    ask patch x y [
      sprout 1 [
        set home_x x
        set home_y y
      ]
    ]
    
    set counter counter + distance-x
    if counter >= max-pxcor [
      set counter distance-x / 2
      set counter2  counter2 + distance-y
      if counter2 >= max-pycor [
        set counter2 distance-y / 2
      ]
    ]
  ]
  
end