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

原作者:Patric R. J. Ostergard

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

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

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

与节点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这些都是全局变量。

函数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的话我们就停止继续搜索最大团。

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

样例:考虑上图,其中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行的节点是被重点强调的。

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

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)<s,那么我们就可以确定这里并不存在任何大小为s的团存在于这个图中从而停止查找。

2.4给所有节点排序

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

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

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

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

3.实验结果

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

4.总结:

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

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

Acknowledgements

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

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

一种快速求解最大团问题的算法相关推荐

  1. Google Earth Engine(GEE)—— 一种快速提取河流及中心线的算法

    本次用到的数据是JRC Global Surface Water Mapping Layers, v1.0使用1984年3月16日至2015年10月10日期间获取的Landsat 5.7和8的3,06 ...

  2. 游戏编程精粹学习 - 一种快速的圆柱棱台相交测试算法

    在Unity中挂载Renderer的对象可以使用OnBecameVisible/OnBecameInvisible来接收剔除事件. 但是非Renderer对象则要自己处理相交检测. 文中的方法测试结果 ...

  3. GeoAO:一种快速的环境光遮蔽方案

    [博物纳新]专栏是UWA旨在为开发者推荐新颖.易用.有趣的开源项目,帮助大家在项目研发之余发现世界上的热门项目.前沿技术或者令人惊叹的视觉效果,并探索将其应用到自己项目的可行性.很多时候,我们并不知道 ...

  4. python猜数字游戏简单-python猜数字游戏快速求解解决方案

    python猜数字游戏快速求解解决方案.使用方法: 1. 保存代码为guessall.py 2. 执行python guessall.py > result.txt 3. 打开result.tx ...

  5. 一种快速的公交专用车道检测方法

    一种快速的公交专用车道检测方法 关键词:公交车,车道线检测,摄像头 时间:2012-09-19 15:56:48      来源:中电网 目前,国内外学者已经提出了很多车道线检测算法,主要分为两类:一 ...

  6. 弹性碰撞后速度方向_找准模型,快速求解碰撞类问题

    找准模型,快速求解碰撞类问题 正式开讲之前,扯一会儿废话!很多小伙伴可能根本不会看下去,想想动量守恒,有什么好看的呢?人需要自信,但也不能太自信,有时候,明明大家知识点掌握的都一样,却有人能考高分,而 ...

  7. python数字组合算法_python猜数字游戏快速求解解决方案

    python猜数字游戏快速求解解决方案.使用方法: 1. 保存代码为guessall.py 2. 执行python guessall.py > result.txt 3. 打开result.tx ...

  8. c语言编程非线性方程求解,c语言计算机编程三种方法求解非线性方程.doc

    c语言计算机编程三种方法求解非线性方程.doc 本 科 专 业 学 年 论 文题 目非线性方程求解比较姓 名 何 娟 专 业 计算机科学技术系 班 级 08 级本科(2)班 指 导 老 师 刘 晓 娜 ...

  9. Bron-Kerbosh算法求解极大团

    Bron-Kerbosh算法求解极大团 参考资料:https://www.jianshu.com/p/437bd6936dad 这篇文章讲得很好,本文的代码也是参照这篇文章,用python实现. 什么 ...

  10. 最小二乘模糊度去相关调整:一种快速GPS整数模糊度估计方法

    最小二乘模糊度去相关调整:一种快速GPS整数模糊度估计方法 摘要: GPS双差载波相位测量由于周期数未知而存在模糊性.当整数双差模糊度的可靠估计能够以有效的方式确定时,基于短观测时间跨度数据的高精度相 ...

最新文章

  1. 一个apk多个ICON执行入口
  2. leetcode算法题--反转链表★
  3. Knockout中ko.utils中处理数组的方法集合
  4. 日志模块logging用法
  5. 学习:java原理—反射机制
  6. python代码混淆
  7. 第2章 业务:数据驱动运营
  8. IT“茫一代”转型记:创业维艰 苦乐皆有
  9. lol8月21号服务器维护,8月21日lol维护公告最新 8.21lol维护到几点
  10. (iOS开发) 录屏功能的实现~包括暂停和继续功能
  11. windows下如何用python控制打印机打印_巧用win32print来控制windows系统打印机并推送打印任务...
  12. matlab电解电容在哪,基于MATLAB的电容器直流局部放电检测.pdf
  13. QT设置窗口折叠效果QPropertyAnimation
  14. 小龙虾壳做环保包装袋,用计算机视觉来远程监考……这些公司好好玩!
  15. java计算机毕业设计汽车维修服务系统源代码+数据库+系统+lw文档
  16. python实现流媒体,python +OpenCV实现rtmp视频流媒体的播放
  17. showModalDialog用法
  18. Microsoft SQL Server 2012版下载与安装步骤
  19. Impala事故处理手册
  20. C++ pthread cond_wait 和 cond_broadcast的使用

热门文章

  1. python识图找图_初探利用Python进行图文识别(OCR)
  2. 1.计算机网络的发展,计算机网络的发展史「简述」
  3. 三毛3--亲爱的婆婆大人
  4. 常微分方程——一阶微分方程的初等解法
  5. 5G在智慧农业中的实践和探索
  6. 后缀数组(Suffix Array )
  7. 揭秘终南山隐士:在山中修炼完后还回到红尘中
  8. C语言推箱子完整代码
  9. 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明)(热身赛) C-Statues
  10. java为什么打不开jar文件_win7系统双击打不开jar文件的解决方法