Netlogo 获得一定距离内所有邻居的推力

Netlogo Get a pushing force from all neighbours within a distance

对于每只海龟,我有一个名为 visible-neighbors 的代理集,它们是一定距离内的海龟。

我想从每个可见的邻居那里得到对这只乌龟的拉力。然后总结力量。对于来自一个邻居的每个拉力都遵循等式力 = 1 / 距离 ^ 2。我的想法是将力分解为 x 和 y 分量,然后将 x 和 y 上的力相加,最后再次合成力。

这是我目前拥有的代码。它是可运行的,但由于某些原因它不起作用。

to get-direction-naive
  set visible-neighbors (other turtles) in-radius 75 with [ distance myself > 0 ]
  ifelse any? visible-neighbors
    [let distance-list [distance myself] of visible-neighbors
     let x-cors [xcor] of visible-neighbors
     let x-diff map [? -> ? - xcor] x-cors
     let x-forces (map [ [a b] -> a / (b ^ 3) ] x-diff distance-list)
     let x-sum sum x-forces
     let y-cors [ycor] of visible-neighbors
     let y-diff map [? -> ? - ycor] y-cors
     let y-forces (map [ [a b] -> a / (b ^ 3) ] y-diff distance-list)
     let y-sum sum y-forces
     ifelse y-sum = 0
      [ifelse x-sum > 0
        [set heading 0]
        [set heading 180] ]
      [set heading atan x-sum y-sum]
    ]
    [right random 360]
end

如有任何建议,我们将不胜感激。

您发现什么不起作用?你想让海龟被拉向彼此,对吗?这似乎可以根据需要设置海龟的标题——不过我认为您可以删除两个嵌套的 ifelse 语句。查看此玩具版本:

to setup
  ca
  crt 20 [
    setxy random-xcor random-ycor
    pd
  ]
  reset-ticks
end

to force-pull
  ask turtles [
    let visible-neighbors other turtles in-radius 10 
    ifelse any? visible-neighbors [
      let distance-list [distance myself] of visible-neighbors
      let x-cors [xcor] of visible-neighbors
      let x-diff map [ ? -> ? - xcor] x-cors
      let x-forces force-calc x-diff distance-list
      let x-sum sum x-forces
      let y-cors [ycor] of visible-neighbors
      let y-diff map [? -> ? - ycor] y-cors
      let y-forces force-calc y-diff distance-list
      let y-sum sum y-forces
      set heading atan x-sum y-sum
      let hyp sqrt ( ( x-sum ^ 2 ) + ( y-sum ^ 2 ) )
      fd e ^ ( -0.5 * hyp )
    ] [
      right random 360
    ]
  ]
  tick
end

to-report force-calc [ dif-list dist-list ]
  report ( map [ [ a b ] -> a / ( b ^ 3 ) ] dif-list dist-list )
end

在我看来,海龟正确地面向计算出的方向并聚集在一起。