我正在尝试编写一种算法来计算输入图(无向且无自环)的边缘团覆盖数(覆盖所有边缘的最小团数)。我的想法是
- 使用Bron-Kerbosch算法计算所有最大团,以及
- 尝试其中任何 1,2,3,... 是否会覆盖所有边缘,直到我找到最小数量
那行得通吗?有人知道更好的方法吗?有标准算法吗?令我惊讶的是,我找不到任何这样的算法。我知道这个问题是 NP 难的,所以我不希望有一个快速的解决方案。
我正在尝试编写一种算法来计算输入图(无向且无自环)的边缘团覆盖数(覆盖所有边缘的最小团数)。我的想法是
那行得通吗?有人知道更好的方法吗?有标准算法吗?令我惊讶的是,我找不到任何这样的算法。我知道这个问题是 NP 难的,所以我不希望有一个快速的解决方案。
我会像你现在一样收集最大派系(或者可能使用其他算法,如CaptainTrunky建议的那样),然后使用branch 和 bound。这不能保证加速,但通常会在“简单”实例上产生很大的加速。
尤其是:
这是一个提高修剪水平的下限的想法:
如果子图 G' 包含大小为 s 的独立集,那么您将需要至少 s 个团来覆盖 G'(因为没有团可以覆盖独立集中的两个或多个顶点)。计算最大可能的 IS 是 NP 困难的,因此在这里不切实际,但是您可以通过使用顶点覆盖的 2 近似来获得一个便宜的界限:只需继续选择一条边并丢弃两个顶点,直到没有边为止;如果你扔掉了 k 个边,那么剩下的就是一个在 k 范围内的 IS。
到目前为止,您可以将此 IS 的大小添加到解决方案中的集团总数中;如果它比当前的 UB 大,你可以中止这个子问题,因为我们知道进一步充实它不能产生比我们已经看到的更好的解决方案。
2 年前我正在研究类似的问题,但我从未见过任何标准的现有方法。我做了以下事情:
第二部分的一些细节。为每条边定义一组布尔变量,如果它的value == True,那么它被覆盖,否则,它不是。添加允许您仅针对每个团覆盖边缘集的约束。最后,添加每个clique对应的变量,如果== True,则已经使用,否则,则不是。最后,要求覆盖所有边缘并且使用的派系数量最少。