Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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
C# 如何有效地计算力(胡克定律)?_C#_Algorithm_Graph_Physics_Nodes - Fatal编程技术网

C# 如何有效地计算力(胡克定律)?

C# 如何有效地计算力(胡克定律)?,c#,algorithm,graph,physics,nodes,C#,Algorithm,Graph,Physics,Nodes,我正在尝试优化一个。到目前为止,我已经使用天真的O(n2)方法实现了它。它只能处理大约1000个节点,这对于我的需求来说太少了 熟悉该算法的人都知道它有两个主要组成部分:库仑定律形式的节点间斥力和胡克定律形式的沿边弹簧状吸引力,这两个组成部分都涉及节点间的成对计算 Barnes-Hut算法很好地适用于前者,后者将使排斥分量达到O(n logn)。但是,我还没有为spring组件找到类似的东西。我曾考虑过以下几点: 根据位置将节点划分为重叠的容器,并仅在同一容器中的节点之间执行成对计算。但是,这

我正在尝试优化一个。到目前为止,我已经使用天真的O(n2)方法实现了它。它只能处理大约1000个节点,这对于我的需求来说太少了

熟悉该算法的人都知道它有两个主要组成部分:库仑定律形式的节点间斥力和胡克定律形式的沿边弹簧状吸引力,这两个组成部分都涉及节点间的成对计算

Barnes-Hut算法很好地适用于前者,后者将使排斥分量达到O(n logn)。但是,我还没有为spring组件找到类似的东西。我曾考虑过以下几点:

  • 根据位置将节点划分为重叠的容器,并仅在同一容器中的节点之间执行成对计算。但是,这可能并不适用于所有情况,特别是因为节点的初始配置是随机的,并且连接的节点可能位于任何位置。我可以改变生成节点的方式,但除非它们都在同一个容器中,否则仍然会产生不正确的结果

  • 分别存储边,并对其进行迭代以计算弹簧力。现在看来这是我最有希望的方法


  • 有没有更好的方法我没有考虑过?如果有什么关系的话,我正在使用C#,如果在并行循环中使用C#会很好。

    我觉得您给出的第二个选项应该在边数方面具有线性复杂性。只需迭代它们,并不断更新相应2个节点上的合力


    编辑:对不起,我之前认为每个节点都是通过弹簧连接到其他节点的。

    如果我理解正确,排斥分量是O(n logn),而吸引分量是稀疏的:最后,对于每个节点,平均k,我实现了我在第二个案例中描述的,效果很好。我维护并迭代了每个节点的一组邻居,这使得整个加速例程可以很容易地并行化(以及Barnes Hut)。总体时间复杂度为O(max(n logn,k)),其中k是边的总数。我的C#实现以可接受的性能水平处理大约100000个节点和150000个边缘

    这是一个有用的属性,但我不知道如何应用于我的问题。每个边都是一个不同的弹簧,因此不能将两条边建模为一条。