Java教程

KL算法

本文主要是介绍KL算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Kernighan-Lin算法通过迭代改进进行划分,1970年提出,用于求解所有节点都有相同权重的二分图。该算法可以扩展到多元(k-way)且元胞可以是任意大小。

算法简介

KL算法用于电路所表征的图上,其中节点代表元胞,边代表元胞之间的链接。形式上,让图G(V,E)有|V| = 2n个节点,所有节点有相同的权重,所有边有一条非负权重。KL算法将V划分称为两个不相交的子集A和B,割数最小,且|A|==|B|==n。

KL算法基于互换一对节点的位置,其中所有节点都属于不同划分。如果两个节点在割数减少量最高时,互换这两个节点。为了防止直接反转和撤销操作带来的无限循环,KL算法在节点交换后将其锁定。知道被锁定的节点编程自由节点前,这些被锁定的节点是不能够被交换的。

KL算法经过多轮运行。每轮可以从任意初始化分开始。在特定的轮次下,当所有的节点都被锁定后,算法选取对交换中所得到的最大增益(也就是最少的花费)的一对节点进行交换。所有节点依照同样的操作移动。当所有的节点都移动后,本轮结束,所有的节点又再次成为自由节点。在随后的伦茨中,算法从上一轮所得到的两个划分开始。所有可能的对交换被重新计算。如果在给定的轮次中划分结果质量没有改进,则算法终止。

割代价

一个无权图或有统一边权重的图的割大小或割代价是所有系欸但在多个划分中的边的数量。对于有权重的边,割代价等于所有割边的权重之和。

从划分A移动一个节点到B的划分代价D(v),

D(v) = |Eb(v)| + |Ea(v)|

Eb(v)是v的被割线所切割的关联边的集合;Ea(v)则是v的没有被割线所切割的关联边的集合。代价(D>0)高的表明节点需要移动,代价低(D<0)表明节点仍保留在原来的划分中。

交换增益

交换一对节点a和b的增益是该对节点交换前后所引起的割边代价的变化。正增益表示割边代价减少了,而负增益表示割边代价增加了。交换a和b节点的增益为

c(a,b)表示a和b之间连接权重。如果a和b之间不存在一条边,则c(a,b) = 0。

最大正增益

最大正增益表示给定轮次中,进行m次交换中的最好结果。在这m次交换中,可能会找到具有最小割代价的划分。最大正增益等于第一轮m次交换的交换增益的和,结束时,最大正增益选择最大的值。

步骤

首先,将图G划分为任意两个部分A和B,然后将最大正增益设置为无穷大。在每轮中,计算每个节点的代价D(v),并将节点v设置为自由的。当所有节点都没有被锁定时,进行选择和交换,然后将这两个自由节点a和b锁定,其中a属于A,b属于B,此时交换增益为最大的。更新所有与a和b相连的自由节点的D(v)。

当所有节点都被锁定后,找到使最大正增益最大的移动序列,如果最大正增益使整的,执行移动序列。否则终止。

总结

KL算法并不能总是得到最优解,在时间中,处理几百个节点的图时,可以得到相当好的结果。KL算法的运行时间是由两个因素决定的,增益更新和交换点的选择。算法选择n对节点进行交换,n是每个划分中的节点总数。对于每个节点v,更新和比较增益的时间复杂度为O(n)。也就是说,在移动i中交换节点a和b最多(2n - 2i)个自由节点的增益被更新。因此在每轮中,n个移动的增益更新所花费的时间最多为O(n^2)。在给定的移动i中的一对节点进行比较是,执行n对比较所需时间结界是O(n^3)。则总的时间复杂度为O(n^3)。

实际的优化KL算法,可以对D(v)进行排序,得到的时间复杂度为O(n^2*logn)

 

 

 

 

 

这篇关于KL算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!