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

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) 。为了避免达到动态平衡后反复震荡,也可以在迭代后期将步长调到一个比较小的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值