作为一个玩具,它工作得很好,但很明显,当它放大时,它就会陷入泥潭。我怎样才能做到这个系统,而不要求海龟问其他海龟呢?因此,代码是。
to go
ask turtles
[
ask other turtles [
set heading towards myself
let D distance myself
let C .1 / D - 1 / (D ^ 2)
if C > 1 [set C 1]
fd C
]
]
tick结束
我应该知道怎么做,但大脑不起作用。如果我先得到答案的话,我会跟你们竞争,然后贴出我自己的答案。
发布于 2016-02-01 21:38:29
你在想这个吗?
turtles-own [m]
to setup
ca
crt 1000 [
setxy random-xcor random-ycor
set shape "dot"
set color white
set m random-float 5
set size 2 * (m / pi) ^ .5
]
end
to go
ask turtles
[
set heading weighted-mean-heading other turtles
let mv sum [m / (distance myself ^ 2) / [m] of myself ] of other turtles
if mv > .1 [set mv 1]
if mv < -.1 [ set mv -1]
bk mv
]
ask turtles
[
ask other turtles in-radius (size / 4) [ask myself [set m m + [m] of myself] die ]
set size 2 * (m / pi) ^ .5
]
end
to-report weighted-mean-heading [turts]
let mean-x sum [sin towards myself * m / (distance myself ^ 2)] of turts / sum [m / distance myself ^ 2] of turts / m
let mean-y sum [cos towards myself * m / (distance myself ^ 2)] of turts / sum [m / distance myself ^ 2] of turts / m
report atan mean-x mean-y
end发布于 2016-01-13 00:55:30
你实际上是在做一个N体模拟。主要的区别是你的系统中没有速度。不幸的是,没有简单的方法来模拟这个系统,而不要求每一只海龟去问其他海龟。然而,有许多更复杂的算法。
巴恩斯将空间划分为一棵嵌入区域的树,并计算每个区域的质量中心。然后,当一只海龟决定去哪里时,它看的是区域,而不是个别的海龟。如果您熟悉O-表示法,它将在O(n log(n))中运行。应该可以修改Barnes-Hut来处理您的公式。
我不相信粒子网格方法可以在您的模型中使用,但是,老实说,我不完全理解它们是如何工作的。
我注意到方程中的分母(.1 / D - 1 / (D ^ 2),即.1 / (D - 1 * (D ^ 2))在D中是立方的,这意味着它会很快下降。所以你可以限制海龟的半径:ask other turtles in-radius 5 ...。in-radius运行的时间与半径内的补丁数成正比(加上半径中的海龟数量),所以如果这个数目明显小于海龟总数,这可能会导致一个不错的加速比。
https://stackoverflow.com/questions/34749916
复制相似问题