Algorithm 边团覆盖算法

Algorithm 边团覆盖算法,algorithm,graph-theory,intersection,clique,clique-problem,Algorithm,Graph Theory,Intersection,Clique,Clique Problem,我试图编写一个算法,计算输入图(无向和无自循环)的边团覆盖数(覆盖所有边的最小团数)。我的想法是 使用Bron-Kerbosch算法计算所有最大派系,以及 如果有任何1,2,3,。。。其中一个会覆盖所有边缘,直到我找到 最小数 这是否有效,是否有人知道更好的方法;有标准算法吗?令我惊讶的是,我找不到任何这样的算法。我知道这个问题是NP难的,所以我不希望有一个快速的解决方案 两年前我就在研究类似的问题,但我从未见过任何标准的解决方法。我做了以下工作: 计算所有最大团。 比以前好多了吗 在我的情况下

我试图编写一个算法,计算输入图(无向和无自循环)的边团覆盖数(覆盖所有边的最小团数)。我的想法是

  • 使用Bron-Kerbosch算法计算所有最大派系,以及
  • 如果有任何1,2,3,。。。其中一个会覆盖所有边缘,直到我找到 最小数

  • 这是否有效,是否有人知道更好的方法;有标准算法吗?令我惊讶的是,我找不到任何这样的算法。我知道这个问题是NP难的,所以我不希望有一个快速的解决方案

    两年前我就在研究类似的问题,但我从未见过任何标准的解决方法。我做了以下工作:

  • 计算所有最大团。 比以前好多了吗 在我的情况下是Bron Kerbosch
  • 建立约束满足问题,以确定覆盖图所需的最小团数。你可以使用,工具来做到这一点。选哪一个?这取决于你的技能、时间资源、环境和许多其他参数。如果我们谈论的是概念验证,我会坚持使用Minizing

  • 第二部分的一些细节。定义一组关于每条边的布尔变量,如果它的值==True,则它被覆盖,否则它不被覆盖。添加约束,使您可以仅覆盖每个组的边集。最后,添加对应于每个集团的变量,如果它是==True,那么它已经被使用了,否则就没有了。最后,要求覆盖所有边缘,并且使用的派系数量最少

    我会像你现在这样收集最大的派系(或者使用不同的算法,如所建议的),但随后使用。这不能保证加速,但通常会在“简单”实例上产生较大的加速

    特别是:

    • 与其尝试以增加子集大小的顺序尝试最大团的所有子集,不如选择一条边uv并在其上进行分支。这意味着:
      • 对于包含uv的每个最大团C:
        • 创建一个包含当前解决方案中所有派系的暂定新部分解决方案
        • 将C添加到此部分解决方案中
        • 创建一个新的子问题,其中包含当前子问题的图形,但C中的所有顶点都折叠为一个顶点
        • 递归来解决这个较小的子问题
    • 跟踪到目前为止最好的完整解决方案。这是您的上限(UB)。您不需要继续处理已达到此上限但仍存在边的任何子问题;更好的解决方案已经存在
    • 最好选择一个被尽可能少的派系所覆盖的边缘进行分支。在选择尝试这些派系的顺序时,先尝试你认为最好的(可能是最大的)一个
    下面是一个用于提高修剪级别的下限的想法:

    如果子图G'包含大小为s的,则至少需要s个团来覆盖G'(因为没有团可以覆盖独立集中的两个或多个顶点)。计算可能的最大值是NP困难的,因此在这里是不切实际的,但是使用顶点覆盖的2-近似可以得到一个便宜的界限:只需继续选择一条边并抛出两个顶点,直到没有边为止;如果你扔掉了k条边,那么剩下的是一条在k以内的最优边

    到目前为止,您可以将其大小添加到解决方案中的派系总数中;如果它比当前的UB大,您可以中止这个子问题,因为我们知道进一步充实它并不能产生比我们已经看到的更好的解决方案