网络布局算法之【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是两个点之间的权重。
弹簧模型
能量模型
力引导布局的伪代码
设置节点的初始速度为(0,0) 设置节点的初始位置为任意但不重叠的位置 开始循环 总动能:=0 //所有粒子的总动能为0 对于每个节点i 净力f:=(0,0) 对于出该节点外的每个节点j 净力f:=净力f + j节点对应i节点的库伦斥力 下一个节点j+1 对于该节点上的每个弹簧s 净力f:= 净力f+弹簧对该节点的胡克弹力 下一个弹簧s+1 //如果没有阻尼衰减的话,整个系统将一直运动下去 该节点速度:=(该节点速度 + 步长 * 净力) * 阻尼 该节点位置:= 该节点位置 + 步长 * 该节点速度 总动能:=总动能 + 该节点质量 * (该节点速度)^2 下一个节点i+1
力引导布局易于理解、容易实现,可以用于大多数网络数据集,而且实现的效果具有较好的对称性和局部聚合性,因此比较美观。
然而,力引导布局只能达到局部优化,而不能达到全局优化,并且初始位置对最后优化结果的影响较大。
一般来说整个算法的时间复杂度在
- 网络布局算法之【FR算法(Fruchterman-Reingold)】
- FR算法
- 网络流之Dinic算法
- 网络流之SAP算法
- 网络流之Dinic算法
- 网络流之EK 算法
- 算法导论之排序网络
- 网络流之Edmonds_Karp 算法
- 网络流之dinic算法
- 网络流之dinic算法
- 网络流之sap算法
- 网络编程之nagle算法和TCP_NODELAY
- 网络编程之nagle算法和TCP_NODELAY
- 网络编程之nagle算法和TCP_NODELAY
- 网络流之最大流sap算法
- 网络编程之nagle算法和TCP_NODELAY
- 分类算法之贝叶斯网络(Bayesian networks)
- 分类算法之贝叶斯网络(Bayesian networks)
- controller 间共享数据
- Leetcode Algorithm No.241 Different Ways to Add Parentheses - 学高手写代码
- 排序之快速排序
- 安卓判断是否首次进入app,通过判断跳转欢迎引导界面和主界面
- FtpClient 获取ftp文件列表
- 网络布局算法之【FR算法(Fruchterman-Reingold)】
- mysql reset password
- Linux之V4L2基础编程
- Struts2从一个action转到另一个action的两种方法
- AdaultBird--我的黑马程序员之路!Chapter10---java反射!
- LeetCode:Happy Number
- SetEvent与PulseEvent的区别
- 常量指针、指针常量、C++类型转换
- Python-列表和元祖