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
















### Fiduccia-Mattheyses 算法简介 Fiduccia-Mattheyses (FM) 算法是一种用于划分图的启发式算法,广泛应用于电子设计自动化(EDA)领域中的电路分区问题。该算法的目标是最小化跨两个子集之间的边切割数量(edge-cut),从而优化性能指标如延迟、功耗等。 #### FM 算法的核心思想 FM 算法通过迭代交换节点的方式减少目标函数值(通常是总权重)。它采用贪心策略,在每次迭代中选择能够带来最大增益(gain)的单个节点移动操作[^5]。具体而言: - **初始化阶段**: 将输入图划分为两部分 A 和 B,初始状态可以随机分配或者基于其他方法预处理得到。 - **计算收益(Gains)**: 对于每一个可能被移到另一侧集合里的顶点 v 计算它的迁移所带来的净变化量 gain(v)[^6]。 - 如果某个顶点 u 属于当前考虑转移方向的一方,则当将其移至对方时会改变连接这些相邻结点间关联关系所对应的权值贡献情况;反之亦然。 - **执行局部最优决策**: 在所有候选者当中挑选具有最高正值gains 的那个个体实施搬迁动作,并更新相关数据结构以便反映最新状况下的系统特性描述信息。 - **终止条件检测**: 当不存在任何正向改进机会时结束过程并返回最终解决方案作为近似结果呈现给使用者查看评估效果如何满足需求标准的要求水平之上即可接受为合格产品形式提交审核批准流程继续推进下去直至完成全部预定任务为止。 以下是 Python 实现的一个简单版本: ```python import heapq def fm_algorithm(graph, initial_partition): partition_a, partition_b = set(initial_partition[0]), set(initial_partition[1]) gains_heap = [] locked_nodes = set() def calculate_gain(node, from_set, to_set): external_edges = sum(weight for neighbor, weight in graph[node].items() if neighbor not in from_set) internal_edges = sum(weight for neighbor, weight in graph[node].items() if neighbor in from_set) return external_edges - internal_edges # Initialize the heap with all possible moves and their respective gains. for node in partition_a.union(partition_b): current_set = partition_a if node in partition_a else partition_b other_set = partition_b if node in partition_a else partition_a gain_value = calculate_gain(node, current_set, other_set) heapq.heappush(gains_heap, (-gain_value, node)) total_cut_size = sum(sum(weights.values()) for _, weights in graph.items()) while gains_heap: max_gain, selected_node = heapq.heappop(gains_heap) if selected_node in locked_nodes or -max_gain <= 0: continue original_set = partition_a if selected_node in partition_a else partition_b target_set = partition_b if selected_node in partition_a else partition_a original_set.remove(selected_node) target_set.add(selected_node) locked_nodes.add(selected_node) neighbors = {neighbor for neighbor in graph[selected_node]} updated_gains = [(calculate_gain(nbr, partition_a if nbr in partition_a else partition_b, partition_b if nbr in partition_a else partition_a), nbr) for nbr in neighbors] for new_gain, n in updated_gains: heapq.heappush(gains_heap, (-new_gain, n)) return list(partition_a), list(partition_b) ``` 此实现假设 `graph` 是一个字典表示邻接表,其中键代表节点,值是另一个字典映射邻居及其对应边上的权重。`initial_partition` 参数指定起始分割方案。 ### 应用场景举例 1. VLSI 设计中的布局规划(Layout Planning): 需要合理安排芯片上各个功能模块的位置使得信号传输路径尽可能短以降低能耗提高效率同时还要兼顾散热等因素的影响制约; 2. 社交网络分析(Social Network Analysis): 可帮助识别社区结构揭示隐藏的社会联系模式促进市场营销活动开展等等有益之处多多不胜枚举值得深入探索研究学习借鉴利用起来创造更大价值回报社会大众共享科技成果带来的便利美好生活体验感受无穷乐趣魅力所在何尝不是一件非常有意义的事情呢?[^7]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值