Kernighan-Lin

Kernighan-Lin算法

算法伪代码

输入 待划分的大图G=(V,E)

输出 划分后子图A、B


1、将图G平均划分为A、B两个初始子图

do

​ 计算A、B子图中各个节点的D_values值

​ for i in range(|V|/2)

​ 从A和B两个子图中,分别找出a、b,使得gain=D_values[a] + D_values[b] - (2 * c_ab)最大

​ 将a、b移除,不参与后面过程;将a、b、gain存入gains[]

​ 更新A、B子图各个节点的D值

​ end for

​ 计算g_max以及使得g_max最大的k值

​ if g_max > 0 then

​ 交换A、B子图顶点

until 没有可以交换的顶点对之后算法结束,此时g_max小于0


数据使用空手道俱乐部社交关系图,共有34个节点和78条边
空手道俱乐部社交关系图

Kernighan-Lin算法是一种图划分算法,用于将一个图分割成两个部分,使得两个部分内的边权重之和达到最小。该算法通过迭代的方式不断优化节点的划分,最终得到一个具有最小切割代价的划分结果。 Kernighan-Lin算法的主要思想是贪心策略。首先,随机选择一种初始划分,将图中的节点分为两部分。然后,计算两个部分的切割代价,即两个部分之间所有边的权重之和。接下来,对于每个节点,计算将其移动到另一个部分所能带来的切割代价的变化量。选择能够得到最大变化量的节点移动,并更新两个部分的切割代价。 为了避免遍历所有节点的组合,节省计算时间,Kernighan-Lin算法使用了一种基于顶点移动的启发式策略。首先,将节点按照某种顺序排列。然后,通过逐个移动两个部分的节点,计算切割代价的变化量。每次移动选取能够使切割代价变化量达到最大的节点,直到切割代价无法进一步改善为止。 Kernighan-Lin算法的步骤如下: 1. 初始化划分:将节点随机分成两个部分。 2. 计算切割代价:计算两个部分之间边的权重之和。 3. 按照某种顺序排列节点。 4. 选择最大变化量的节点移动:逐个移动两个部分的节点,计算切割代价的变化量,并选择最大变化量的节点移动。 5. 更新划分和切割代价:更新节点的划分情况,并更新两个部分的切割代价。 6. 重复步骤4和步骤5,直到切割代价无法进一步改善。 Kernighan-Lin算法的时间复杂度为O(n^3),其中n为图中节点的数量。实际应用中,也有一些优化的改进算法,如Fiduccia-Mattheyses算法和Spectral Bi-Partitioning算法,用于提高计算效率和切割质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值