需要加速粒子系统的帮助(或如何要求海龟不要求其他海龟。)
Need help on speeding up a particle system (or how to ask turtles not to ask other turtles.)
作为玩具,它运作良好,但显然,当它按比例放大时,它就会陷入困境。
我如何在不要求海龟询问其他海龟的情况下执行此系统?
代码是这样的。
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
结束
我应该知道怎么做,但是脑子不灵了。如果我先得到答案,我会和大家争先恐后 post 我自己的答案。
您实际上是在做 N-body simulation。主要区别在于您的系统中没有速度。不幸的是,没有简单的方法可以在不要求每只乌龟询问其他所有乌龟的情况下模拟这个系统。然而,还有许多更复杂的算法。
Barnes-Hut 将 space 划分为嵌入区域树,并计算每个区域的质心。然后,当海龟决定去哪里时,它会查看区域而不是单个海龟。如果您熟悉 O-notation,它会在 O(n log(n))
中运行。应该可以修改 Barnes-Hut 以使用您的方程式。
我不相信 particle mesh methods 可以用在你的模型中,但是老实说,我不完全理解它们是如何工作的。
我注意到你方程式中的分母(.1 / D - 1 / (D ^ 2)
即 .1 / (D - 1 * (D ^ 2)
)在 D
中是立方的,这意味着它会很快下降。所以你可以通过半径限制海龟:ask other turtles in-radius 5 ...
。 in-radius
运行的时间与半径内的小块数量成正比(加上半径内的海龟数量),因此如果该数量明显小于海龟总数,则可以实现不错的加速。
你在想这个吗?
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
作为玩具,它运作良好,但显然,当它按比例放大时,它就会陷入困境。 我如何在不要求海龟询问其他海龟的情况下执行此系统? 代码是这样的。
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
结束
我应该知道怎么做,但是脑子不灵了。如果我先得到答案,我会和大家争先恐后 post 我自己的答案。
您实际上是在做 N-body simulation。主要区别在于您的系统中没有速度。不幸的是,没有简单的方法可以在不要求每只乌龟询问其他所有乌龟的情况下模拟这个系统。然而,还有许多更复杂的算法。
Barnes-Hut 将 space 划分为嵌入区域树,并计算每个区域的质心。然后,当海龟决定去哪里时,它会查看区域而不是单个海龟。如果您熟悉 O-notation,它会在 O(n log(n))
中运行。应该可以修改 Barnes-Hut 以使用您的方程式。
我不相信 particle mesh methods 可以用在你的模型中,但是老实说,我不完全理解它们是如何工作的。
我注意到你方程式中的分母(.1 / D - 1 / (D ^ 2)
即 .1 / (D - 1 * (D ^ 2)
)在 D
中是立方的,这意味着它会很快下降。所以你可以通过半径限制海龟:ask other turtles in-radius 5 ...
。 in-radius
运行的时间与半径内的小块数量成正比(加上半径内的海龟数量),因此如果该数量明显小于海龟总数,则可以实现不错的加速。
你在想这个吗?
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