需要帮助加速粒子系统(或如何让龟不要问其他龟。)

时间:2016-01-12 17:17:54

标签: optimization netlogo particle-system particles

作为一个玩具,它运作良好,但显然,当它向上扩展时,它会陷入困境。 如果不让乌龟问其他海龟,我怎么能做这个系统呢? 因此代码就是。

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

我应该知道如何做到这一点,但大脑无法正常工作。如果我先拿到它,我会全力以赴地回答并发布我自己的。

2 个答案:

答案 0 :(得分:1)

你基本上做了N-body simulation。主要区别在于您的系统中没有速度。不幸的是,没有简单的方法来模拟这个系统而不要求每只乌龟都要问其他乌龟。然而,有许多更复杂的算法。

Barnes-Hut将空间划分为嵌入区域的树,并计算每个区域的质心。然后,当乌龟确定要去哪里时,它会查看区域而不是单个乌龟。如果您熟悉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的运行时间与半径中的斑块数量(加上半径中的龟数)成正比,因此,如果该数量明显小于海龟的总数,则可以获得适当的加速。

答案 1 :(得分:0)

你想到这个吗?

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