套装的变化

时间:2010-11-23 12:23:23

标签: algorithm complexity-theory

设置封面优化问题是:给定一个Universe US的子集U(即S \ subsetof 2 ^ U),找到最小子集{{ 1 {} C,使其元素的联合为S。已知是NP难的。

我感兴趣的变体是,给定相同的内容(UU),找到S的最小子集C,使{{1} }是一个封面,对于S中的某些(未指定的)元素Cu中包含U的所有集合都在S

我正在应用的问题是:给定一组我看到的症状(u),我有可能导致这些问题的原因(C - {{1}的每个元素对应于潜在多种症状的“原因”)。我想知道可以导致我看到的所有症状的原因最少,而且我还希望删除所有这些“原因”的结果也会导致至少一个症状得到解决。

有没有人对这是否比原始问题更容易有任何好的想法?

编辑包含解决方案(纳入评论)

至少和封面一样难。

U可以通过S解决,SSetCover(U,S)以外的元素,SetCoverNew(U + {w}, S + {{w}})表示集合联盟。

给定SetCoverNew实例的任何解决方案都必须包含集w(否则它不是U的集合封面。)

声称+的解决方案是{w}。首先,U + {w}必须是SetCover(U,S)的封面,否则X = SetCoverNew(...) \ {{w}}不能成为X的封面。其次,U必须是X + {{w}}的最小封面,否则U + {w}是基数低于X的封面。

2 个答案:

答案 0 :(得分:3)

这也是NP-Hard,因为我们可以使用这个来解决原始的封面问题 假设我们提供了一种解决这个新问题的算法(称为SetCoverNew)。

这是一个解决SetCover的算法。

SetCover(U, S)
  1. build new universe U1 = {U + w} (w is not in `U`, and `+` means `union`).
  2. build the new set S1 = S + {w}.
  3. result = SetCoverNew(U1, S1, w)
  4. return result - {w}.

修改 抱歉,我没有看到unspecified u让我考虑一下:)

答案 1 :(得分:0)

前段时间,我根据节点的各种报告,研究了解决电信网络出现问题的问题。要求是分配一些可能导致大量警报(警报风暴)的根本原因。有许多(非常昂贵的)产品,采取了各种各样的方法。

我认为这个问题在理论上是难以处理的,唯一切实可行的方法就是安排收集数据,以便找出问题从哪里开始变得微不足道的问题(例如,确保每个节点报告它是如何思考的它正在做什么,是否它通过它所依赖的节点正在做他们的工作)。鉴于此,我认为您应该能够将大多数警报分配给根本原因,只需减去您希望由仪器告诉您显然存在的根本原因产生的警报。

我不知道您的问题域是什么,但我建议您花一些时间来查看收集正确的数据是否会使诊断更容易。