边缘集团覆盖算法

时间:2018-03-06 17:55:43

标签: algorithm graph-theory intersection clique clique-problem

我正在尝试编写一个算法来计算输入图形的边缘集团覆盖数(覆盖所有边缘的最小数量)(无向并且没有自循环)。我的想法是

  1. 使用 Bron-Kerbosch 算法计算所有最大派系,
  2. 如果有任何1,2,3,......的话会覆盖所有边缘,直到我找到它为止 最低人数
  3. 这会有用吗,有没有人知道更好的方法;有标准算法吗?令我惊讶的是,我找不到任何这样的算法。我知道问题是NP难的,所以我不指望快速解决方案。

2 个答案:

答案 0 :(得分:2)

我会像现在一样收集最大团队(或者使用不同的算法,如CaptainTrunky所建议的那样),但随后使用branch and bound。这不能保证加速,但通常会在“简单”实例上产生大的加速。

特别是:

  • 不是在增加子集大小顺序中尝试所有最大派系子集,而是选择边缘uv并在其上进行分支。这意味着:
    • 对于每个包含uv的最大集团C:
      • 制作一个包含当前解决方案中所有派系的暂定新的部分解决方案
      • 将C添加到此部分解决方案
      • 创建一个包含当前子问题图的新子问题,但C中的所有顶点都折叠成一个顶点
      • 努力解决这个较小的子问题。
  • 到目前为止,跟踪最佳的完整解决方案。这是你的上限(UB)。您不需要继续处理已经达到此上限但仍有边缘的任何子问题;已经存在一个更好的解决方案!
  • 最好选择一个分支的边缘,尽可能少的派系。当选择以什么顺序来尝试这些派系时,请先尝试一下您认为最好的(可能是最大的一个)。

这是一个提高修剪水平的下限的想法:

如果子图G'包含大小为independent set的大小,则至少需要s个小团来覆盖G'(因为没有clique可以覆盖独立集合中的两个或更多个顶点)。计算最大可能的IS是NP难的,因此在这里是不切实际的,但你可以通过使用顶点覆盖的2近似得到一个便宜的界限:只需保持选择一个边并丢弃两个顶点,直到没有留下边缘;如果你抛出了k个边缘,那么剩下的是一个在最佳k范围内的IS。

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

答案 1 :(得分:1)

2年前,我正在处理类似问题,而且我从未见过任何标准现有方法。我做了以下事情:

  1. 计算所有最大派系。 MACE比...更好 在我的案例中,Bron-Kerbosch。
  2. 建立约束满足度问题,以确定覆盖图表所需的最小数量的团队。您可以使用SATMinizincMIP工具来执行此操作。哪一个选?这取决于你的技能,时间资源,环境和许多其他参数。如果我们谈论的是概念验证,我会坚持使用Minizinc。
  3. 第二部分的一些细节。为每条边定义一组布尔变量,如果它 value == True ,则覆盖它,否则,它不是。添加约束,允许您仅针对每个集团覆盖边集。最后,添加与每个集团相对应的变量,如果它= =真,那么它已经被使用,否则,它不是。最后,要求所有边缘都被覆盖并且许多使用过的派系是最小的