Netlogo 在一个包裹的世界里,海龟之间的中点

Netlogo 在一个包裹的世界里,海龟之间的中点,netlogo,Netlogo,我试图在一个x轴和y轴都缠绕的世界中,找到一组海龟之间的中点。显而易见的解决办法是 let mid-point list mean [xcor] turtles mean [ycor] turtles 但当世界结束时,这返回的结果并不完全是我想要的。也就是说,如果在一个25 x 25的世界中,两个海龟分别处于[0-25]和[0 23],我想返回[0 24](或者可能是[0 24.5])。但是平均值方法返回[01]。有人对如何做到这一点有好的建议吗?一种方法是找到与相关海龟之间距离总和最小的区域

我试图在一个x轴和y轴都缠绕的世界中,找到一组海龟之间的中点。显而易见的解决办法是

let mid-point list mean [xcor] turtles mean [ycor] turtles
但当世界结束时,这返回的结果并不完全是我想要的。也就是说,如果在一个25 x 25的世界中,两个海龟分别处于[0-25]和[0 23],我想返回[0 24](或者可能是[0 24.5])。但是平均值方法返回[01]。有人对如何做到这一点有好的建议吗?一种方法是找到与相关海龟之间距离总和最小的区域,但我更愿意找到确切的点


这有意义吗?有什么建议吗?

我首先误读了这个问题,认为这是一个在两只海龟之间找到中点的问题,所以我建议:

to setup
  clear-all
  resize-world -25 25 -25 25
  create-turtles 2
  ask turtle 0 [ setxy 0 -25 ]
  ask turtle 1 [ setxy 0 23 ]
  show midpoint turtle 0 turtle 1
end

to-report midpoint [ t1 t2 ]
  let result (list)
  ask t1 [
    hatch 1 [
      face t2
      forward distance t2 / 2
      set result list xcor ycor
      die
    ]
  ]
  report result
end
如果启用了world wrapping,运行安装程序将打印
[0 24.5]

但亚瑟指出,他真正想要的是找到一整套海龟的中点(即a)。经过一番思考,我意识到我可以应用一种非常类似的方法:

  • 为原始集合中的每只海龟创建一个临时海龟(我称它们为
  • 让第一只海龟成为“
    搜索者”
    “海龟,它会四处移动直到找到质心
  • 让导引头移动一半到其他第一个点,然后移动三分之一到第二个点,然后移动四分之一到第三个点,以此类推,直到没有更多的点为止
除了直觉,我没有数学证明这是有效的,但是当关闭“世界换行”(world wrapping)时,它确实会给出与“平均坐标”(mean coordinates)方法相同的结果,因此我假设它也适用于打开“换行”(wrapping)。它也适用于
[0 24.5]
情况。不过,如果我弄错了,我很乐意得到纠正

这是:

to setup
  clear-all
  ask n-of (2 + random 10) patches [ sprout 1 ]

  ; Show centroid with the "seeker" method
  show centroid turtles

  ; Show centroid calculated with mean coordinates for comparison.
  ; If wrapping is on, it will probably be different from
  ; `centroid turtles`. If wrapping is off, it should be the
  ; same, with very small floating point variations:  
  show list mean [xcor] of turtles mean [ycor] of turtles  

end

to-report centroid [ set-of-turtles ]
  let points (list)
  ask set-of-turtles [
    hatch 1 [ set points lput self points ]
  ]
  report seek-centroid first points but-first points 2
end

to-report seek-centroid [ seeker points n ]
  if-else not empty? points [
    let target first points
    ask seeker [
      face target
      forward distance target / n
    ]
    ask target [ die ]
    report seek-centroid seeker but-first points (n + 1)
  ]
  [
    let result [ list xcor ycor ] of seeker
    ask seeker [ die ]
    report result
  ]
end

注意:在调用
报告搜索质心…
之前添加
询问第一个点[pen down]

想想以单位间隔点的1D情况。你们可以把它想象成一个圆上的点,你们需要一些点的平均值的概念。这属于[Directive statistics]()领域,是一件非常重要的事情。一种方法可能是将圆视为位于平面上,取这些值的平均值,计算其角度,在圆上给出一个点,然后在圆上给出一个点

维基百科提到“计算一系列角度(在[0°、360°)的平均值的一种简单方法是计算每个角度的余弦和正弦的平均值,并通过计算反切线获得角度。”我认为有一篇文章给出了你所想的平均值的概念

你可以分别对待x和y。计算

let X-sin-mean mean [sin (xcor * 2 * pi /25)]
let X-cos-mean mean [cos (xcor * 2 * pi /25)]
let Y-sin-mean mean [sin (ycor * 2 * pi /25)]
let Y-cos-mean mean [cos (ycor * 2 * pi /25)]
let X-angle-mean [atan2 X-sin-mean X-cos-mean]
let Y-angle-mean [atan2 Y-sin-mean Y-cos-mean]
let X-mean (X-angle-mean * 25 / ( 2 * pi))
let Y-mean (Y-angle-mean * 25 / ( 2 * pi))

我的netlogo语法可能有点错误。我希望你能理解要点。

要获得包含中心点的补丁,你可以这样做

min-one-of patches [ sum [ distance myself ] of turtles ]

这个问题有几个答案,讨论了和。不幸的是,它不是平凡的。算法都是迭代的(例如梯度下降的变化),解空间有许多局部最优解

A让我想到了另一个基于的解决方案。基本上,你可以取x坐标和y坐标的圆平均值。下面是代码:

;; lower and upper should be equivalent on the circle, but upper > lower in the reals
;; For circles, lower = 0 and upper = 360.
;; For clocks, lower = 0 and upper = 12 (or 24)
;; For x-coordinates, lower = min-pxcor - .5 and upper = max-pxcor + .5
to-report circular-mean [ lower upper vals ]
  let width upper - lower
  let angles map [ 360 * (? - lower) / width ] vals
  let mean-x mean map [ cos ? ] angles
  let mean-y mean map [ sin ? ] angles

  ; not doing turtle headings here, so we flip atan's arguments
  report width * (atan mean-y mean-x) / 360 + lower
end

to-report mean-xcor [ xs ]
  report (circular-mean (min-pxcor - .5) (max-pxcor + .5) xs)
end

to-report mean-ycor [ ys ]
  report (circular-mean (min-pycor - .5) (max-pycor + .5) ys)
end

这实际上是将二维视为圆形。如果你将一个维度视为一个圆,这会找到该圆上与所有其他点的平方距离最小的点,这里的距离是点之间的欧几里得距离,而不是圆周围的距离你可以使用MOD命令<代码>让中点列表意味着[XCOR MOD 25 ]海龟意味着[ YCOR MOD 25 ]海龟< /代码> HM。这可能是困难的,因为我怀疑存在一个独特的“正确”答案。考虑一束点均匀分布在环面上——“中心”。到处都是。我很抱歉,也许我的例子不好,听起来好像我只想要两只乌龟。我真的对任何(合理)数量的乌龟组成的一套乌龟很感兴趣。你的问题很好。我是误读的人。但是考虑到更简单的“两只乌龟”案例一是最终导致我得出一般解决方案的原因(在我编辑的答案中给出),所以我想一切都很好。(当然,假设我的一般解决方案是正确的…)这很有效,非常感谢。我刚刚在NetLogo模型库中的k-means群集模型中实现了这一点。如果实现了,我们将为此感谢您。再次感谢!太好了!如果它进入库中,我会很高兴!说到k-means,您知道吗?(但是,它不支持这样的世界包装。不过,在模型的“信息”选项卡中可能值得一提。)我不确定我的数学是否足够强大,能够在没有实际代码实现的情况下理解这一点。但是,Nicolas的示例使用了我认为良好的“海龟行为”来找到正确的位置,所以我将继续。非常感谢你,不过!感谢你的这一点,Bryan。这肯定是最不冗长的版本,尽管它“只”得到patch而不是实际点。我想如果补丁数足够高,它会接近实际点。值得注意的是,Bryan的方法和我的方法并不总是给出相同的答案(无论是否打开包装).我不知道这是为什么。他的方法更简单,更直观,但是,我很想用它。特别是因为对于k-均值来说,仅仅获得质心补丁已经足够好了。但是可能会慢一些,因为它是O(| P |*| T |)而不是O(| T |).Woops,刚刚注意到Salix已经发布了一个基于相同方法的答案。不过,我将保留此内容,因为它是完全运行的代码。