赞
踩
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=1n∑j=1n12k(d(i,j)−s(i,j))2
能量模型
E=Es+∑i=1n∑j=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)。为了避免达到动态平衡后反复震荡,也可以在迭代后期将步长调到一个比较小的值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。