力导向算法的研究与改进

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
相关文章
相关标签/搜索