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