寻找更好的约束在早期的封面停止

时间:2014-04-10 21:17:24

标签: algorithm backtracking

我试图以解决顶点覆盖的方式解决集合覆盖问题

输入:我们有一个基集X和X子集的集合C,因此C中的每个元素都是X的子集

输出:C中设置的最小集合F的大小,其中F的所有元素的并集导致X

我知道如何解决这个问题,但我正在寻找一种启发式方法,以便更早地停止在树中。例如,现在我从C中删除每个元素并进行递归调用,并以这种方式检查停止点:if(bestsofar< = F.length + 1)stop

但是我知道会有更好的启发式方法,因为例如在顶点覆盖中我可以像这样检查:如果K + 1>最好停止;其中k是覆盖边缘的结果中添加顶点的数量,但更好的方法是如果K +数字Edges / maxdeg> =最好停止哪个更好。

我想为套装做同样的事情。

有没有人有任何想法?

1 个答案:

答案 0 :(得分:1)

从理论的角度来看,你的顶点覆盖启发式方法正在为顶点覆盖的宽松linear program构建一个可行的解决方案。套装也可以这样做。如果由于某种原因您不想使用单纯形法找到最佳的双解,那么可以使用各种近似值。您可以使用K加上项目数除以一组中的最大项目数,从而推广您的启发式顶点覆盖。您还可以使用贪心算法查找打包,我的意思是以下内容。对于顶点覆盖,这将是一组没有共同端点的边(即匹配)。每个封面包含包装中每个边缘的至少一个端点。对于集合封面,这将是一个项目集合,这样任何集合都不包含集合中的多个项目。