Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java n体模拟预期性能barnes-hut_Java_Algorithm_Simulation_Physics - Fatal编程技术网

Java n体模拟预期性能barnes-hut

Java n体模拟预期性能barnes-hut,java,algorithm,simulation,physics,Java,Algorithm,Simulation,Physics,起初我用蛮力做了一个2D n体模拟,但随后我实现了一个Barnes-Hut近似算法。然而,这并没有给我想要的效果 例: 巴恩斯小屋->2000具尸体;帧时间平均32毫秒和5000毫秒;164毫秒 蛮力->2000具尸体;帧时间平均31毫秒和5000毫秒;195毫秒 这些值是在禁用渲染的情况下显示的 我是否正确地假设我没有正确地实现算法,因此没有获得性能的实质性提高 θ当前设置为s/d

起初我用蛮力做了一个2D n体模拟,但随后我实现了一个Barnes-Hut近似算法。然而,这并没有给我想要的效果

例:

巴恩斯小屋->2000具尸体;帧时间平均32毫秒和5000毫秒;164毫秒

蛮力->2000具尸体;帧时间平均31毫秒和5000毫秒;195毫秒

这些值是在禁用渲染的情况下显示的

我是否正确地假设我没有正确地实现算法,因此没有获得性能的实质性提高

θ当前设置为s/d<0.5。将此值更改为例如1确实会提高性能,但很明显,这不是首选的原因

单螺纹

我的代码大致如下:

while(!close)
    {
        long newTime = System.currentTimeMillis();
        long frameTime = newTime-currentTime;
        System.out.println(frameTime);
        currentTime = newTime;

        update the bodies
    }
在更新实体的函数中:

first insert all bodies into the quadtree with all its subnodes
for all bodies
    {
        compute the physics using Barnes-Hut which yields a net force per planet (doPhysics(body))
        calculate instantaneous acceleration from net force
        update the instantaneous velocity
    }
barneshut函数:

doPhysics(body)
{
    if(node is external (contains 1 body) and that body is not itself)
    {
        calculate the force between those two bodies

    }else if(node is internal and s/d < 0.5)
    {
        create a pseudobody at the COM with the nodes total mass
        calculate the force between the body and pseudobody

    }else (if is it internal but s/d >= 0.5)
    {
        (this is where recursion comes in)
        doPhysics on same body but on the NorthEast subnode
        doPhysics on same body but on the NorthWest subnode
        doPhysics on same body but on the SouthEast subnode
        doPhysics on same body but on the SouthWest subnode
    }
}

您的代码仍然不完整(在s上读取),对不完整代码进行深入调试不是本网站的目的。然而,这就是我将如何进行下一步的工作,找出什么是错误的:

  • 只对您担心的函数计时(我们称之为barnes_hutt_update());而不是整个更新循环。将其与等效的非B-H代码进行比较,而不是与没有B-H的整个更新循环进行比较。这将导致一个更有意义的比较
  • 您似乎在算法中硬编码了s/d 0.5。把它作为一个参数,当它设置得更高时,你应该能够注意到加速;如果设置为0,则性能与简单的非B-H实现非常相似。B-H中的加速来自于计算较少的节点(因为距离较远的节点集中在一起);您知道要跳过多少个节点吗?没有跳过的节点,没有加速。另一方面,跳过节点会在计算中引入一些小错误-您对这些错误进行了量化了吗
  • 在线查看B-H的其他实现。D3在内部使用它,并且可读性很强。现有多个四叉树实现。如果你已经建立了自己的,它们可能是次优的(甚至是马车)。除非你想在实践中学习,否则最好使用一个经过测试的库,而不是滚动你自己的库
  • 减速可能是由于使用了四叉树,而不是力加本身。与B-H力近似本身相比,了解构建和更新四叉树需要多长时间是很有用的,因为在本例中,四叉树是纯开销的。B-H需要四叉树,但天真的非B-H实现不需要。对于少量节点,naive将更快(但随着添加越来越多的节点,速度会变得非常慢)。当您添加越来越多的实体时,性能如何扩展
  • 您是否正在创建和丢弃大量对象?您可以通过使用
没有显示代码,我们无法真正判断它是否正确实现是的,但我也在询问性能变化。也许有人有经验,可以告诉我,与蛮力相比,模拟的运行效果会好多少?很可能瓶颈不是模拟,而是渲染。如果没有关于您正在做什么的更多详细信息,就无法对您的算法的实现进行评论。我按照您的要求添加了我的代码。@PeterLikesCode newer以前从未使用过此算法,但从快速查看它的速度取决于数据集。如果您没有将大多数实体分组,那么由于额外的开销,代码实际上可能比暴力更慢。所以我能看到的最糟糕的情况是有均匀分布的物体。。。由于我们不知道你的身体位置(截图就好了),我们只能猜测你要么做了一些小的权衡,要么做了一些无效的事情,甚至做了太多的聚类
calculateforce(body, otherbody)
{
    if(body is not at exactly the same position (avoid division by 0))
    {
        calculate force using newtons law of gravitation in vector form

        add the force to the bodies' net force in this frame
    }
}