zoukankan      html  css  js  c++  java
  • 力导向算法研究

     

    一、背景

    1963年, Tutte提出的质心法被公认为是第一个事实上的力导向算法。1984年, Eades提出了一种电荷弹簧模型, 以带电环代替图的顶点,  弹簧代替图的边,  尝试用物理方法画图, 从而开拓了力导向算法的新思路。该算法首先为图中各顶点赋予随机的初始位置, 然后系统在电荷之间的斥力和弹簧的弹力作用下, 不停地运动,  直至达到稳定平衡的状态。

     

    其中力导向算法是属于信息可视化范畴内的一种经典算法。而可视化发展的三个方向: 科学可视化、信息可视化和可视分析。其中图的布局策略往往决定了整个图的展示效果。布局策略有很多种,诸如力导向布局、树布局、群组布局、光谱布局(Spectral Layout)。信息可视化的目标是图画迅速且清晰地传达其背后信息的能力,平面图以及美学、算法效率等则构成评价算法优良的尺度。

     

    Purchase总结了目前业内公认的一般美学原则:

    (1) 最小化边交叉(Edge Crossing), 即任意两条边交叉于一点的情况应尽量少发生;

    (2) 最小化边弯曲(Edge Bend), 即应尽量避免产生弯曲的边;

    (3) 最大化对称性;

    (4) 最大化角辨识度(Angle Resolution)

    (5) 群组到角原则

    二、概念

    基于力导向的算法是弹簧理论算法中的一种典型算法。我们可以将整个网络图想象成虚拟的物理系统,系统中的每个节点都可以看成是具有一定能量的放电粒子,粒子与粒子之间存在着库仑斥力和胡克引力。在粒子间的斥力和引力的不断作用下,粒子们从开始的随机无序状态不断发生位移,逐渐趋于平衡有序稳定的终态。同时整个物理系统的能量也在不断消耗,经过数次迭代后,粒子之间几乎不再发生相对位移,整个系统达到一种稳定平衡的状态,即能量趋于零。此刻,最终的这幅理想的社交网络图也基本绘制完成。

    这种方法的缺点是不收敛,总是有节点在两个不同位置上来回振动,虽然不会收敛,但是来回振动时的配置通常也最终可达到某种稳定的状态,因此实际的执行都以指定执行的次数来决定停止的条件。另外一个问题就是网状图的节点数太多时,也无法求得令人满意的结果。当开始配置不好的情况下,通常是力导向算法的配置结果也不是很好,所以使用力导向算法通常会配合一个初始配置的算法,以达成较满意的网状配置。 

    力导向算法的想法很简单,且容易使用和修改以满足需求。我们可更改网状图的初始位置以加快收敛,也可根据不同的要求加入不同种类的力,另外,算法过程中虽然没有特别针对网状图的对称性进行配置,但是当网状图中存在对称关系时也能获得较好的结果。力导向算法的缺陷是在初始配置不佳的时候所得到的网状图也不会很好,所以可根据网状数据的特性是否选择该算法。

    三、原理

    清单 1. 力导向核心算法实现伪代码

     Set up initial node positions randomly //建立初始随机节点位置

     Loop for k //迭代次数

        For each node u  //遍历点

            For each node v

                net-force += Coulomb_repulsion( u, v ) //库仑斥力

            End For

        End For

        For each edge e compute //遍历边

            net-force += Hooke_attraction( u1, u2 ) //u1, u2 is start and end node of edge e  胡克吸引力

        End For

    Update x and y values with each net-force // every node has its own net-force//更新节点位置

     End Loop

    伪代码的整体思想归纳如下:

    1、随机分布初始节点位置;

    2、计算每次迭代局部区域内两两节点间的斥力所产生的单位位移(一般为正值);

    3、计算每次迭代每条边的引力对两端节点所产生的单位位移(一般为负值);

    4、步骤 2、3 中的斥力和引力系数直接影响到最终态的理想效果,它与节点间的距离、节点在系统所在区域的平均单位区域均有关,需要开发人员在实践中不断调整;

    5、累加经过步骤 2、3 计算得到的所有节点的单位位移;

    6、迭代 n 次,直至达到理想效果。

    该算法的平均时间复杂度是由两部分组成——每次迭代计算每两点间的斥力变化 O(n2) 和每条边给端点带来的引力变化 O(e),共进行 k 次迭代计算,即 O (k * (n2+e) )。其中 n 为节点个数,e 为边数。

    四、应用

    文档布局、 UML 用例图和类图、电路图布局等实际问题。

    五、参考资料

    1.http://www.ibm.com/developerworks/cn/web/0909_fudl_flashsocial/#resources

    2.https://en.wikipedia.org/w/index.php?title=Force-directed_graph_drawing&cm_mc_uid=68120896344914678551303&cm_mc_sid_50200000=1467964360

    3.曾新红, 蔡庆河, 黄华军,等. 基于力导向模型的非一致节点群组布局可视化算法研究[J]. 现代图书情报技术, 2014(9):33-43.

    4.徐本柱, 程光春, 李忠泽,等. 基于力导向算法的线束连接图自动布局研究[J]. 图学学报, 2010, 31(6):171-177.

  • 相关阅读:
    js:语言精髓笔记1--标识符与基本类型
    ember.js:使用笔记4 数组数据的分组显示
    ember.js:使用笔记3 活用{{bind-attr}}
    ember.js:使用笔记2-数据删除与存储
    ember.js:使用笔记1-数组数据统一显示
    工具:使用jekyll生成静态网站
    css:删除:×的效果
    js写随机一个颜色
    回调函数的使用
    jquery获取select标签的选中元素
  • 原文地址:https://www.cnblogs.com/zhongzihao/p/5657127.html
Copyright © 2011-2022 走看看