Fiduccia-Mattheyses algorithm概述

Fiduccia-Mattheyses algorithm

1.简介

以下是维基百科的原文简介:
FM algorithm is a linear time heuristic for improving network partitions. New features to  K-L heuristic :
  • Aims at reducing net-cut costs; the concept of cutsize is extended to hypergraphs.
  • Only a single vertex is moved across the cut in a single move.
  • Vertices are weighted.
  • Can handle "unbalanced" partitions; a balance factor is introduced.
  • A special data structure is used to select vertices to be moved across the cut to improve running time.
  • Time complexity O(P), where P is the total # of terminals
FM算法是一种改进网络分区的线性时间启发式算法,旨在减少不同分区之间的连接数,也就是分区之间的沟通成本,这种概念可以拓展到超图模型,
这个算法的主要目的是解决超图的双分区问题。

2.例子

以下通过一个例子来说明FM算法的基本原理:
在以下电路上执行FM算法
对电路进行超图建模:


1.初始化分区信息

其中右边的是超图表示,n是超边的集合,Set(n)={n1,n2,n3,n4......},n1包含了三个节点,{a,b,c},如此类推。。
首先随机的将一个图进行分割,元件{a,c,d,g}在左边,元件{b,e,f,h}在右边

2.计算gain值和初始化

对于元件c,c包含在超边n1={a,c,e},n3={c,f,e},n2={b,c,d}中,其中在超边n3中,只有元件c在左边的集合中,其他的元件都在右边的集合中,因此FS(c)+1。
并没有超边中所有的元组都在左边,因此TE(c)=0。
FS(i),每当有超边包含了元件i,而且有且仅有i在元件i所属的分区(例如元组c在左边),FS(i)+1,FS(i)初始值为0。
TE(i),当有超边中所有元组都在元件i所属的分区(例如元组c在左边),TE(i)+1,TE(0)初始值为0
eg: FS(c) = 1,TE(c) = 0 ==》gain(c) = FS(c)+TE(c) = 1
计算出所有元件的gain值:

3.第一次移动

由上面第二步计算出所有元件的gain值,其中元件g和元件e的值都是2是最大的,而且对于g和e都是没有移动约束的。ps:移动约束的意思是尽量的使得两边的元件数量维持一致,不能有太大的偏差,左边的数量和右边的数量要尽量维持相等。这里根据字母的顺序,首先移动元件e。
将e从右边移动到左边之后,将重新计算与e相关的元件的gain值。与e相关的元件集合{a,c,g,f},重新计算gain(a) = FS(a)-TE(a) = 0-1 = -1,以此类推gain(c) = -1,gain(g) = 1-1 = 0,gain(f) = 2-0 = 2

4.第二次移动

虽然经过了第一次的移动gain(f)的值是最大的,但是f有区域的移动约束(要是移动了f,便导致了左边的元件数量远远大于右边的元件数量,所以f不能移动),选择d元件进行移动,随后计算被影响的元件{b,c,f},gain(b) = 0-0 = 0,gain(c) = 1-1 = 0,gain(f) = 1-1 = 0
ps:已经移动过的元组就不用重新计算其gain值了,这样的做法使得算法收敛而且复杂性是线性的!

5.第三次移动

经过了两次的数据移动,g,c,h,f,b的gain值都是0,按照字母的顺利,选择b进行移动,老规矩!计算受影响的元件集合{c},gain(c) = 0-1 = -1

6.第四次移动

g,h,f都是gain值的最大值,根据地域约束条件,选择g移动,计算受影响的元件{f,h},gain(f) = 1-2 = -1,gain(h) = 0-1 = -1

7.第五次移动

按照字母顺序,选取a移动,计算受影响的元件集合{c},gain(c) = 0-0 = 0

8第六次移动

根据地域约束,选择f元件进行移动,计算受影响的元件集合{h,c},gain(h) = 0-0 = 0 gain(c) = 0-1 = -1 

9.第七次移动

我们移动h,没有受影响的元件集合。

10.第八次移动

移动c

11.中间数据


i代表的是每一步,cell就是每一步移动的元件cell,g(i)是每一步中的增益gain值,∑g(i)就是将每一步的增益值加起来,cutsize是两个分区之间的连接数,通俗点来说就是中间断开了多少条线。cutsize越少分区的质量越高。在这次的分割中得到了三个最优解分别是第二步,第三步,第四步,cutsize都是3,是最少的!


12.FM代码
关于编译:FM代码是C++代码,编译的时候使用C++11来编译,方法可以自行google,本人亲测在codeblock中可以运行
在codeblock中配置c++11,参考博客: http://blog.csdn.net/peterchan88/article/details/68955165
















  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值