一种快速求解最大团问题的算法

一种快速求解最大团问题的算法

原作者:Patric R. J. Ostergard

我们可以用G=(V,E)表示一个无向图,其中V代表图中节点的集合,而E代表图中边的集合。如果两个节点被一条边连接起来,那我们就成这两个节点是连通(毗邻)的。

团是指任意两节点连通的图。

极大团maximal是指所有节点都不属于更大团的节点集合,最大团maximum是指图中最大的团。

一种快速求解最大团问题的算法_第1张图片

与节点v连通的集合用N(v)来表示,图中总结点数是n。

max是一个全局变量,指出了当算法结束时最大团的大小。

 

如果没有第9行的代码,该算法将会遍历图中所有单独存在的团。当集合U的变得足够小时(即使所有剩下的节点都可以用来补充成为一个团,并且该团的大小不会超过我们目前找到的最大团),该修剪算法就会原路返回,但是该算法形成的团的大小始终不会超过已经在集合中出现过的最大团的大小。

 

甚至,如果我们详细的寻找一个给定大小的团,我们还可以通过修改算法来用修建的得到的信息来从头开始寻找。

我们可以在第一行加上当剩余节点数非常小时算法就会自动停止的条件来加速算法的运行,并且在某些具体情况下执行相应的运算。

 

尽管该算法很简洁,但其是目前我们所能找到的解决简单图最大团问题最好的算法。

 

提升该算法的很多尝试都基于计算更高优先级的集合,几乎没有任何异议,这样的集合由节点上色算法vertex-colorings得到。

 

在节点上色算法vertex-colorings中,毗邻的节点必须被分配上不同的颜色。如果一个图或者是他的生成子图可以被涂上s颜色,那么这个图或者是生成子图就不能拥有一个大小大于s+1的团。

 

基于计算上界的算法的补充,vertex-coloring算法的代价是:即使颜色可以在思考上减少了生成树中节点的数量,但是在实现上却十分消耗时间。

 

2.2:新型算法

我们现在来思考一种新的算法。先设Si = {vi+v(i+1)+….+vn}。老式算法寻找最大团的图是由Si=S(i-1)+{vi}构成的(其中S1={v1}),而在新算法中,这种顺序被完全颠倒过来了。我们首先考虑 包含vn的Sn中的最大团(这样得到的最大团是{vn}),然后是Sn-1(如上所说,Sn-1=Sn+{vn-1}) 。这个过程如果是以和算法一中相同的裁剪方式实现的话,我们就得到了一个相对更慢的算法。尽管如此,这个方法使得产生一个新型的裁剪算法成为了可能。

 

C[i],(boolean)found,max这些都是全局变量。

 一种快速求解最大团问题的算法_第2张图片

函数c(i)给出了Si中最大的团。很显然,任何1<=i<=n-1,我们都有c(i)=c(i+1)或者c(i+1)+1。而且,我们还有c(i)=c(i+1)+1当且仅当在Si中有一个大小为c(i+1)+1的并且包含了节点vi的团。所以,从c(n)=1开始,我们寻找所有这样的团。如果一个团被发现,c(i)=c(i+1)+1,否则,c(i)=c(i+1)。C(1)已经给出了这个最大团的大小。

 

根据函数c(i)的旧值来进行对算法进行新的裁剪(如14行所示)。也就是说,如果我们要寻找一个大小大于s的团,此时如果任意第j+1个节点vi都有j+c(i)<=s的话我们就停止继续搜索最大团。

 

下面就简单阐述了在偶然情况下新的裁剪策略在搜寻过程中产生极大影响的例子。

 一种快速求解最大团问题的算法_第3张图片

样例:考虑上图,其中V={v1,v2,…,v2n}并且在节点vi和vj之间存在边的必要条件是|i-j|>1。由于vi和vi+1不可能由某条边连通,所以根据组合变量的显示,最大团的大小存在且为n。根据新的算法,我们可以得到c(i) = n+ 1 − ⌈i=2⌉。而且,这些值可以在线性时间内计算出来。即,当i为奇数时,在添加vi后,在有效集中的最小节点下标应该为i+2,所以在c(i+2)=c(i+1)-1的情况下我们并不能找到一个大小为c(i+1)+1的团(这部分所花费的时间总是固定的)。当i是偶数时,我们发现一个大小为c(i+1)+1并且并不必须通过回溯求得的团,而且是在线性时间内。老式算法也是在线性时间内发现最大团,不过他要继续花费指数级的时间才能找到可能的大小为n+1的团。

 

作为另一个例子,在Table 1的设定中,我们采用了第二种算法来解决Fig.1中的最大团问题。Prune裁剪指的是根据c(i)中的值进行缩减算法的计算量是可行的。这个数字在团被寻找到时代表了在集合U中节点总数。(在第一阶段我们仅仅只有在Si中的节点)这些在第一阶段中的25行中被选择的节点以及在其他阶段中的13行的节点是被重点强调的。

目前的算法可以在极少修改的情况下,被用来发现全部最大团。

一种快速求解最大团问题的算法_第4张图片

2.3寻找一个给定大小的团:

在例5中,我们描述了通过缩小最大团范围来实现加速搜寻的方法。目前看来在这一步中我们不再可能找到任何相似的方法来改良这一步的算法了;所以我们就把注意力重心转移到通过加快证明不存在结果的证明来加快算法的速度。那就是,通过证明不可能产生所需要求的s大小的的团,我们可以以如下方法继续进行。

 

在这之前,我们先要计算d(i)的值,即是在最大团{v1,v2,…,vn}中的节点数目。(如果这里已经确定了的i=n,那么我们已经解决了整个问题)d(i)的值是通过1<=i<=n/2来计算的。然后,在主算法中,我们检查所有i<=n/2中c(i+1)+d(i)的值。如果存在i,使得c(i+1)+d(i)

 

2.4给所有节点排序

为了使2.2中的算法得到良好的表现,一个合适给节点的启发性排序应该被选择使用。一方面可以思考出很多种方式来实现这个目的,而且这些排序很可能有多种不同的影响对于不同种类的图。

用在第一节的代码(section2.1)第五行的启发标注是通过节点的度(也就是与该节点相关联的边的个数)来进行排序的,所以v1拥有最小的度,接着就可以得到v2,v3…..另一方面重复从被未使用过的节点中引出的子图中取出度数最小的节点。

 

由于之前的算法表现的都要比老式在查找时使用vertex-colorings的算法表现的要好,所以看上去vertex-colorings在某些获取初始化排序的方面是可行的。使用颜色排序可以在合理的时间内完成查找,节点被排序所以从属于同一种颜色的类就形成了一个集合。为了得到这样的颜色排序(同时也是最大团问题的上界),我们使用根据Biggs得出的贪心算法:

同一颜色的类在同一时间内只能得到一种。当确定了一种新的颜色类时,由未上色的节点导出的图就首先被构建了。然后,只要图中存在一个节点则其都可以被添加到现有的颜色类中,由此一来拥有最大度的节点就被添加了。这些节点按照他们被添加到颜色中的顺序被填上了vn,vn-1……的标签。

 

3.实验结果

一种快速求解最大团问题的算法_第5张图片

一种快速求解最大团问题的算法_第6张图片

大概就是这样了,具体细节我想你不会在意的

 

4.总结:

所以我们已经提出了一种用来在抽象图中计算最大团的算法了。这种算法在老算法的基础上扩展了可计算图的类型,包括了稀疏图,随即图以及以确定条件连接的图。由于我们还未攻破NP难问题,所以我们期望在面对不同类型的样例时还能有表现更加优异新的算法出现。任何人都可以讨论哪种样例是最重要的样例。该算法对于研究者的已经解决了数万个最大团问题的纠错代码来说也非常重要。

这个算法可以看出相当易于编程。在我们的试验中,我们仅仅是添加了并且编写了10行的程序。(所以,由于著作权方面的原因,在这里我们并不能透露相关的C语言代码)。一种更加宽泛的解决最大团比重的算法,可以链接到这个URL查看URL:http:==www.tcs.hut. =∼pat=wclique.html。至于这个算法中是否还存在能够对整个算法进行更高提升的特殊节点排序方法仍然值得我们探索。

 

Acknowledgements

作者希望感谢Harri Haanpa以及所有为该算法提供了建设性意见的人们。


(这是博客作者第一次尝试翻译学术论文,我也感受到了自己对于该论文的理解还不够深刻,并且在翻译的时候很多表达还不是很清晰,所以希望大家在发现问题的同时能够为作者提出,不胜感激。)

你可能感兴趣的:(翻译,算法)