我们设置 S 1 , S 2 ,..., S 名词子> 的。这些集合不必是不相交的。我们的任务是为每个集合选择一个代表成员,以便所选元素的总数尽可能小。一个元素可以存在于多个集合中,并且可以表示它所包含的所有集合。是否有算法可以有效地解决这个问题?
答案 0 :(得分:8)
重述后更容易回答这个问题:让原始集 S 1 , S 2 ,..., S n 是宇宙的元素,让原始集成员自己设置: T 1 , T 2 ,..., T m (其中 T i 包含元素{ S j },它们是包含相应成员的原始集合。
现在我们必须涵盖宇宙 S 1 , S 2 ,..., S n 具有集合 T 1 , T 2 ,. .., T m 。这正是Set cover problem。这是一个众所周知的NP难问题,因此没有算法可以有效地解决它(除非P = NP,正如理论家通常所说)。从维基百科页面可以看出,有一种贪婪的近似算法;它是有效的,但近似比率不是很好。
答案 1 :(得分:2)
不是为了窃取叶夫根尼的荣耀,但这里有一种相当简单的方式,可能更严格地表明海报问题的一般情况是NP难的。
考虑minimum vertex cover( V 中从顶点 V 中找到最小集合 X 的simple graph问题, E )其中E中的每个边都与 X 中的至少一个顶点相邻。
边可以用无序的双元素集{ v a , v b }来表示其中 v a 和 v b 是 V 中的不同元素。注意,表示为{ v a , v b }的边 e 是当且仅当 v c 是{ v 的元素时,与 v c 相邻a , v b }。
因此,最小顶点覆盖问题与找到 V 的最小尺寸子集 X 相同,其中每个边集{ v a <由 E 中的边定义的/ sub> , v b }包含 X中的元素
如果有一个算法可以有效地解决原始陈述的问题,那么就有一个算法可以有效地解决上述问题,因此也可以有效地解决最小顶点覆盖问题。
答案 2 :(得分:2)
我假设“有效”,你的意思是多项式时间。
Evgeny Kluev是正确的,问题是NP难。它的决定版本被称为hitting set problem,并且在引入该概念后很快就被证明是我们现在所称的NP-complete。虽然Evgeny的减少是从击中集问题到集合覆盖问题,但不难看出明显的反向减少。给定一组C = {C 1 ,C 2 ,... C m },其联合为U = {u < sub> 1 ,u 2 ,...,u n },我们想找到一个最小基数子集C',其并集也等于U.在初始问题中将S i 定义为C中的{C j | u i 是C j }的元素。 S = {S 1 ,S 2 ,...,S n }的最小命中集等于我们想要的C'
答案 3 :(得分:1)
要考虑的几种算法是模拟退火和遗传算法,如果你可以使用接近最优的解决方案(它们可能会为你提供最佳解决方案,但不一定)。模拟退火可以用于生产电子CAD自动放置(因为我是Wintek自动放置计划开发团队的一员)。