• 力导向算法的研究与改进


    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
  • 相关阅读:
    Git 合并流程
    Layui父页面向子页面传参
    jsp页面包含的几中方式
    Eclipse项目启动不了
    jquery 用于操作动态元素的delegate/on方法
    JS[获取两个日期中所有的月份]
    Map的四种遍历方法
    MySQL中, 如何查询某一天, 某一月, 某一年的数据.
    myEclies项目导入Eclipse中常见问题
    MyEclipse背景与字体大小和xml文件中字体大小调整
  • 原文地址:https://www.cnblogs.com/zhongzihao/p/10422433.html
Copyright © 2020-2023  润新知