网络布局算法之【FR算法(Fruchterman-Reingold)】

来源:互联网 发布:北京弘力乐器淘宝店 编辑:程序博客网 时间:2024/06/06 12:48

FR算法(Fruchterman-Reingold) 属于 力引导布局算法类别。

力引导布局(Force-directed Layout)

力引导布局最早由Peter Eades在1984年的“启发式画图算法”一文中提出,目的是减少布局中边的交叉,尽量保持边的长度一致。此方法借用弹簧模型模拟布局过程:用弹簧模拟两个点之间的关系,受到弹力的作用后,过近的点会被弹开而过远的点被拉近;通过不断的迭代,整个布局达到动态平衡,趋于稳定。其后,“力引导”的概念被提出,演化成力引导布局算法FR(Fruchterman-Reingold算法)——丰富两点之间的物理模型,加入点之间的静电力,通过计算系统的总能量并使得能量最小化,从而达到布局的目的。这种改进的能量模型,可看成弹簧模型的一般化。

无论是弹簧模型还是能量模型,其算法的本质是要接一个能量优化问题,区别在于优化函数的组成不同。优化对象包括引力和斥力部分,不同算法对引力和斥力的表达方式不同。

对于图中,节点i和j,用d(i,j)表示两个点的欧式距离,s(i,j)表示弹簧的自然长度,k是弹力系数,r表示两个点之间的静电力常数,w是两个点之间的权重。

弹簧模型

Es=i=1nj=1n12k(d(i,j)s(i,j))2

能量模型
E=Es+i=1nj=1nrwiwjd(i,j)2

力引导布局的伪代码

    设置节点的初始速度为(0,0)    设置节点的初始位置为任意但不重叠的位置    开始循环    总动能:=0   //所有粒子的总动能为0    对于每个节点i       净力f:=(0,0)    对于出该节点外的每个节点j       净力f:=净力f + j节点对应i节点的库伦斥力    下一个节点j+1    对于该节点上的每个弹簧s       净力f:= 净力f+弹簧对该节点的胡克弹力    下一个弹簧s+1    //如果没有阻尼衰减的话,整个系统将一直运动下去    该节点速度:=(该节点速度 + 步长 * 净力) * 阻尼    该节点位置:= 该节点位置 + 步长 * 该节点速度    总动能:=总动能 + 该节点质量 * (该节点速度)^2    下一个节点i+1

这里写图片描述
这里写图片描述

力引导布局易于理解、容易实现,可以用于大多数网络数据集,而且实现的效果具有较好的对称性和局部聚合性,因此比较美观。

然而,力引导布局只能达到局部优化,而不能达到全局优化,并且初始位置对最后优化结果的影响较大。

一般来说整个算法的时间复杂度在O(n3),迭代次数与步长有关,一般认为是O(n),每次迭代都要两两计算点之间的力和能量,复杂度是O(n3)。为了避免达到动态平衡后反复震荡,也可以在迭代后期将步长调到一个比较小的值。

0 0
原创粉丝点击