Netlogo 在一个包裹的世界里,海龟之间的中点
我试图在一个x轴和y轴都缠绕的世界中,找到一组海龟之间的中点。显而易见的解决办法是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]。有人对如何做到这一点有好的建议吗?一种方法是找到与相关海龟之间距离总和最小的区域
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)。经过一番思考,我意识到我可以应用一种非常类似的方法:
- 为原始集合中的每只海龟创建一个临时海龟(我称它们为
)李>点
- 让第一只海龟成为“
“海龟,它会四处移动直到找到质心搜索者”
- 让导引头移动一半到其他第一个点,然后移动三分之一到第二个点,然后移动四分之一到第三个点,以此类推,直到没有更多的点为止
[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已经发布了一个基于相同方法的答案。不过,我将保留此内容,因为它是完全运行的代码。