目录
图布局算法定义
图布局算法(Graph Layout Algorithm) 是一类专门用于将抽象的图(Graph)结构转化为可视化空间排列的算法。其核心目标是通过数学建模和计算,将图中的节点(Node)和边(Edge)转化为二维或三维坐标系中的几何图形,使复杂的拓扑关系能够以直观、可理解的视觉形式呈现。
常见的图布局算法包含以下两类:
(1)力导引布局算法
(2)降维布局算法
一、力导引布局算法(Force-Directed Graph Layout)
在任意一个力导引布局算法中,所使用的模型和求解方法都是不同的。有些算法没有具体的命名,但是它一定都包含了独一无二的模型或求解方法。
1.1 弹簧-电荷力模型
1.1.1 模型设计
Eades
在1984
年发表了一篇论文A heuristic for graph drawing
,认为一个“漂亮”的图布局,应该满足以下两个条件:
- 布局中的所有连边长度应该相同
- 布局应该尽可能对称
然后他提出一个想法,认为可以通过模拟物理现象实现图布局,即当一个系统中所有的节点处于受力平衡的时候,可以得到一个“漂亮”的图布局。模型定义如下:
- 弹簧引力:把节点之间的连边当成弹簧,弹簧力会令连边的长度尽可能接近“理想长度”,想象一下真实世界的弹簧。
- 电荷斥力:任意两个节点之间存在一个斥力,令所有节点之间不堆叠,想象以下两个磁铁。
在弹簧-电荷里模型下,能够保证:
- 有边连接的节点会互相靠近(理想距离)
- 节点间不能离得太近
1.1.2 模型求解
在这篇论文里,对模型的求解方法也很简单,将所有节点放在随机的位置上,然后迭代数次,每次都计算节点的受力,每次将节点朝其受力的反方向移动与受力大小成正比的距离,直到这个物理系统中所有节点都相对稳定。(相当于想办法令整个系统中所有的节点都处于受力平衡的情况)
1.2 引力-斥力模型
弹簧-电荷力模型就是力导引布局算法的基础模型,大家所接触到的传统的力导引布局算法都基于此。后续会有一些人去优化这些模型,比如优化连边之间的引力,优化算法的求解。后续我将这种模型统一称作“引力-斥力模型”,因为会有其他人实验除了弹簧力之外的其他力。
力导引(Force-Directed)指的是依赖于模拟“引力-斥力”等物理系统的一大类布局方法,我们经常会听到一个“FR布局算法”,这里的FR不是指Force-Directed而是指Fruchterman and Reingold。这是两个人名,他们两个人设计了一个布局算法,为了公平起见,以两个人命名,叫做FR,FR布局算法也是一种力导引布局算法。
这两个人非常厉害,受到Eades弹簧模型的启发,写出了一个自动的布局算法,也就是我们俗称的FR。和这个布局算法使用弹簧引力和库伦斥力,引力和斥力都有自己的计算公式,具体可以参考文献[1]。
- 引力:有连边的两个节点受弹簧的引力。
- 斥力:每个节点为一个粒子,任意两个粒子之间受库伦斥力。
1.3 应力模型
2012-Spring Embedders and Force Directed Graph Drawing Algorithms,想要深入了解弹簧模型可以参考这篇论文。Spring Embedder这两个词的意思就是将弹簧力嵌入到布局算法中。虽然灵感来源是弹簧力(胡克定律),但是在实际计算力的时候并没有严格遵守胡克定律,而是自定义的一个力的作用。引力和斥力都利用同样一个公式来计算,因为最初是由弹簧产生的灵感,所以后来被称作Eades弹簧模型。