给定一组集合,从每个集合中找出包含至少一个元素的最小集合


15

给定一组套,我想找到一套,使得每一套在包含至少一个元素。我还希望在满足此标准的同时包含尽可能少的元素,尽管可能存在不止一个具有此属性的最小(解决方案不一定是唯一的)。小号S S M M M中号小号小号中号中号中号

作为一个具体的例子,假设一套是一组的国旗,并为每个标志在,元素是在该国的国旗使用的颜色。美国将具有而摩洛哥将具有。那么将是一组颜色,其属性是每个国旗至少使用一种颜色。(奥林匹克颜色蓝色,黑色,红色,绿色,黄色和白色是这种的示例,至少在1920年是这样。) S S S = { r e d小号小号小号S = { r e d g r e e n } M M M小号={[RËdwH一世ŤËbüË}小号={[RËdG[RËËñ}中号中号中号

这个问题有通用名称吗?是否有公认的“最佳”算法来查找集合?(我对解决方案本身更感兴趣,而不是对计算复杂度进行优化。)中号


2
您可能正在寻找机顶盒问题吗?
Juho 2012年

@Juho不完全是。在我的例子,集合覆盖问题是找到一组标志,使得这些标志的联合包含所有所有标志使用的颜色。相比之下,我正在寻找一种只会吐出颜色列表而不是标志列表的东西,并且我不需要集合来包含所有可能的颜色。不过,我将在Wikipedia上讨论这个领域,我认为您已经使我步入正轨。谢谢!中号
bdesham 2012年

Answers:


13

问题是众所周知的NP完全问题Hitting Set。它与Set-Cover密切相关。NP完整性证明可以在Garey和Johnson的经典著作中找到。

如果要对其进行近似,则可能需要先将实例转换为Set-Cover,然后对Set-Cover应用近似算法。但是,除非Lund和Yannakakis表示P = NP,否则不能用多项式时间内的常数因子来近似设置覆盖。

如果您对精确的解决方案感兴趣,并且您的输入效果很好,我建议您使用固定参数tractable。在此,运行时间不仅用输入长度ñ表示,而且用附加参数ķ。如果运行时间O(FķñØ1,我们所说的算法FPT-算法。在此,Fķ是增加的函数。因此,如果ķ为常数,我们有一个多重时间算法。在第一章Flum和Grohe所著的《 FPT》一解释了命中集(更精确地说是p卡击中集)的FPT算法。该算法易于实现,并使用有界搜索树的方法。仍然需要大量空间来解释,基本上,您可以将必要的(?)暴力搜索分解成小块(当ķ小时)。


谢谢。您可以在某处提供参考以了解实际实现吗?即,我将如何将我的问题转换为覆盖问题,然后如何解决?
bdesham 2012年

1
bdesham,将每个元素视为它所属的一组集合。在element-as-sets输入上运行set cover。另外,请阅读此处链接的Wiki页面。
Sasho Nikolov

您对近似解决方案感兴趣,还是想要确切的解决方案?
A.Schulz

我想要一个确切的解决方案。我正在使用的数据集足够小,我认为这应该不是问题。
bdesham 2012年

1
@Keyser:你是对的。但是,通常的做法是将决策问题与相应的优化问题相关联,因为它们与NP完全问题密切相关。
A.Schulz

2

一个可能有用的想法:如果中所有集合的交集都不为空,则可以选择交集中的任何元素s并设置M = { s }。如果交集为空,则找到在集合中出现次数最多的元素(颜色)c,并用单例{ c }替换所有出现在集合中的元素。继续执行此操作,直到每个元素的出现计数等于1,然后将M设置为其余集合的并集。例如,如果S是某个集合A的幂集,则M = A小号s中号={s}C{C}1中号小号一种中号=一种。我可能是错的。


2

看一看雷·雷特(Ray Reiter)的“从第一原理开始的诊断理论”,其中他给出了一种计算命中集的算法,以及这个附加的注解“ A更正...”

该算法通常称为“命中集树”算法,它不难找到实现。您提到您对运行时不太感兴趣,但是优化(如提前终止分支等)对实现非常关键,也很有趣:)


2
您可以总结一下算法以使答案更独立吗?链接可以并且将断开。
Juho 2012年

0

实际上,解决Set Cover / Hitting Set实例的一种更好的方法(肯定是最简单的方法之一)是混合整数编程。这涉及将整数编程公式传达给您选择的求解器

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.