我试图以解决顶点覆盖的方式解决集合覆盖问题
输入:我们有一个基集X和X子集的集合C,因此C中的每个元素都是X的子集
输出:C中设置的最小集合F的大小,其中F的所有元素的并集导致X
我知道如何解决这个问题,但我正在寻找一种启发式方法,以便更早地停止在树中。例如,现在我从C中删除每个元素并进行递归调用,并以这种方式检查停止点:if(bestsofar< = F.length + 1)stop
但是我知道会有更好的启发式方法,因为例如在顶点覆盖中我可以像这样检查:如果K + 1>最好停止;其中k是覆盖边缘的结果中添加顶点的数量,但更好的方法是如果K +数字Edges / maxdeg> =最好停止哪个更好。
我想为套装做同样的事情。
有没有人有任何想法?
答案 0 :(得分:1)
从理论的角度来看,你的顶点覆盖启发式方法正在为顶点覆盖的宽松linear program构建一个可行的解决方案。套装也可以这样做。如果由于某种原因您不想使用单纯形法找到最佳的双解,那么可以使用各种近似值。您可以使用K加上项目数除以一组中的最大项目数,从而推广您的启发式顶点覆盖。您还可以使用贪心算法查找打包,我的意思是以下内容。对于顶点覆盖,这将是一组没有共同端点的边(即匹配)。每个封面包含包装中每个边缘的至少一个端点。对于集合封面,这将是一个项目集合,这样任何集合都不包含集合中的多个项目。