力导向算法研究

一、背景

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.

时间: 2024-11-09 05:16:39

力导向算法研究的相关文章

基本算法研究1-冒泡排序算法测试

基本算法研究1-冒泡排序算法测试 1.经典冒泡排序法基本原理 先看一个动态图,感觉比较形象: 冒泡排序(Bubble Sort)是一种简单的排序算法.默认是从小到大排序,即把最大的数据排在最后,相当于每次把最大数据像气泡一样浮到水面一样.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换. 基本步骤: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个.        2.对每一对相邻元素作同样的工作,从开始第一对

HTML5游戏开发-扫雷及其算法研究

吕蒙曰:士隔三月[1],当刮目相看.所以,在下在这三月中发奋图强,花了约莫8节信息课的时间研究扫雷.呜呼,由于在下才能尚且不足,所以也就只能勉强打过中级难度的吧.不过,一边玩的同时,我还一边对扫雷这个游戏的制做方法构思了一下.所以说,本文中的算法完全是凭借自己对扫雷游戏规则的总结而自行研发出来的,倘若和MS的扫雷玩法有些出入,还望各位看官见谅. [1]出自<孙权劝学>,原文为"士别三日",由于在下这三个月来都不曾发表博客,所以引申到"士隔三月",各位看官

Supervised Descent Method Face Alignment 代码下载 和 算法研究 之一

1 主要内容: Supervised Descent Method and its Applications to Face Alignment算法研究. 2代码彩蛋:我问了好久,xxiong好心人发给我的,希望能对你们学习有帮助: 低调下载: http://humansensing.cs.cmu.edu/xxiong/mexintraface1.3.1%28release%29.zip. 注意杜绝一切商业用途,如果需要商业用途,请联系作者本人!! 3本文分为几个部分: (1)解决什么问题 (2

通用高校排课算法研究----3.基于时间片优先级排课算法

通用高校排课算法研究----3.基于时间片优先级排课算法 3   基于时间片优先级排课算法描述与分析 排课问题实质上是时间.教师.班级.教室.课程这五维关系的冲突问题,要合理的解决这个问题首先要了解排课中的一些基本原则以及排课的一些基本要求. 3.1排课中的基本原则 在课程的编排中应遵循一定的规则, 只有按照基本规则来进行课程的编排才能够减少冲突的发生, 这些基本规则主要有以下几条: 1) 同一班级的学生在同一时间(某些特定的选修课时间除外) 不能安排两门课程 2) 同一教师在同一时间不能安排两

程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大系列集锦

程序员面试.算法研究.编程艺术.红黑树.数据挖掘5大系列集锦

基础典型算法研究:合并有序数组

做leetcode第二题的时候,发现合并有序数组是一个很有意思的问题,于是,总结如下,部分内容来源于网络各位大神. 第一种方法: 合并调用sort. 即是将两个数组合并在一个数组里面,然后对合并后的数组调用sort函数即可. class Solution: def getArray(self, A, B) : for item in B : A.append(item) A.sort() 第二种方法: 极值插入法. #include <stdio.h> void insert(int *arr

NLTK学习笔记(四):自然语言处理的一些算法研究

自然语言处理中算法设计有两大部分:分而治之 和 转化 思想.一个是将大问题简化为小问题,另一个是将问题抽象化,向向已知转化.前者的例子:归并排序:后者的例子:判断相邻元素是否相同(与排序). 这次总结的自然语言中常用的一些基本算法,算是入个门了. 递归 使用递归速度上会受影响,但是便于理解算法深层嵌套对象.而一些函数式编程语言会将尾递归优化为迭代. 如果要计算n个词有多少种组合方式?按照阶乘定义:n! = n*(n-1)*...*1 def func(wordlist): length = le

图像连通域标记算法研究

把之前一篇记录过的日志贴过来 图像连通域标记算法研究 ConnectedComponent Labeling 最近在研究一篇复杂下背景文字检测的论文. “Detecting Text in Natural Scenes with Stroke Width Transform ” CPVR 2010的文章,它主要探讨利用文字内部笔画宽度一致作为主要线索来检测文字的一个新奇的算法,当然,我不是想讨论文字检测,论文算法实施的过程中有一步涉及到图像连通域标记算法,在这里我遇到了一些问题,查阅了一些相关文

提高D3js力导向图加载速度(转)

过去一段时间曾两次使用了 D3 力导向图来描绘族群关系. http://bl.ocks.org/mbostock/1062288 第一次用的时候不求甚解,交差了事.当时点也不多,很顺利完成了任务.这一次确不同,每个图里要渲染的有成千上万个点,每次渲染都死慢死慢,一大堆点动来动去,动半天才稳定下来,这一晃几分钟过去了. 阅读了一下官方文档 ,发现问题出来 tick 上. force.start() 后,有一个计时器不停地触发 tick 直到所有节点最终受力平衡稳定下来. 可以理解为,有个计时器不停