1.基础力导向算法
1.1算法模型
FR算法模型建立在粒子物理理论的基础上,将无向图的节点模拟成原子,通过模拟原子间的力场来计算节点间的相对位置。该模型假设任意两个节点间存在斥力,相互连接的两个节点间存在引力。通过模拟节点间的相互作用力,计算得到节点的速度和偏移量,经过不断的迭代计算,最终达到一种动态平衡的状态。
1.2算法思路
(1)计算任意两点间的相互斥力。
(2)计算有边连接的节点间的相互引力。
(3)根据节点所受的合力计算速度,将速度转化为节点位置偏移量,此时注意通过最大偏移量限制移动距离,防止偏移过大无法收敛。
(4)根据偏移量计算每一个节点的位置。
(5)经过多次迭代,最终达到动态平衡,节点位置近似不变。
1.3伪代码
2.改进1:引入模拟退火算法优化结束条件
2.1引入模拟退火算法的原因
在基础力导向算法中,由于迭代次数是外部指定的参数。在不同拓扑结构的无向图而言,达到收敛的迭次次数不同。如果迭代次数过大,相应的计算耗时也会这增加,存在一些多余的迭代过程。如果迭代次数过小,此时算法还没有收敛,会导致节点分布不均衡,效果不理想。因此,需要引入一种机制来控制算法迭代终止的条件。
2.2模拟退火算法
模拟退火算法来源于固体退火原理,即高温状态的固体渐渐冷却,固体内部粒子动能逐渐变小,最终在常温状态下达到平衡,此时动能最小。在模拟退火算法有一个温度的概念,“温度”从一个初值逐渐减小为0,与此同时限制节点的最大偏移量也逐渐减小,最终达到在恰当时机控制算法终止的目的。
2.3伪代码
3.改进2:引入Barneshut算法优化计算性能
3.1引入Barneshut算法的原因
对于采用了模拟退火算法的力导向算法,已知其时间复杂度为O(k * (n*n+m)),在节点和边数量级比较大时,存在较大的性能瓶颈,会导致画面布局时间等待过长问题。因此,需要对该算法进行性能优化。
3.2Barneshut算法
Barneshut算法主要思想是根据节点位置距离建立一颗树,将邻近多个的节点看成一个超级节点,从而减少了斥力计算环节中需要计算任意两点间的斥力的复杂度,这部分的时间复杂度由O(n*n)降为了O(n*logn),最终引入Barneshut算法后使得力导向算法的时间复杂度降为O(k*(n*logn+m))。
Barneshut算法是很巧妙的方法,将邻近区域的节点分组合并,广泛用于n-body仿真。它递归地将节点集合存储在四叉树结构中。顶点代表整个区域,它的质量为所有节点质量之和,它的位置为所有子节点的质心位置。这个算法之所以快是因为我们不需要去计算每一个组body里面的节点。
Barneshut算法步骤:
(1)创建根节点body,不断地按节点位置将所有节点划分到body的四个象限,由此建立树结构。
(2)遍历计算每一个节点与树结构之间的斥力,若当前节点的位置与树结构body节点的质心位置足够远(s/d<0.5),则将所有的作用力施加于根节点上;若不足够远,则递归地计算当前节点与body节点的子节点的斥力。
图1 建立Barneshut树结构
参考资料:
COS 126 Programming Assignment BarnesHut Galaxy Simulator