最大覆盖变体的启发式
Posted
技术标签:
【中文标题】最大覆盖变体的启发式【英文标题】:Heuristic for Maximum Coverage variant 【发布时间】:2015-07-25 01:22:53 【问题描述】:我有以下问题: 有N组。每个组都是集合的集合。 目标是从 N 个组中的每个组中准确选择一个集合,以使作为所有选择的并集的集合的大小最大化。 每组中的集合数不一定相同,但有界是由某个数 M 限制的。
例如,
1. 6, 7, 8, 10
2. 6,7, 8,9
3. 10, 1,2, 99
实际答案为6
,因为您可以从1 中选择6,7,8
,从2 中选择8,9
,从3 中选择1,2
,从而使联合1,2,6,7,8,9
的大小为6
。
在我的特定领域中,问题结构始终遵循以下规则:
N 从 1 到 2000 不等。集合中的数字从 1 到 50。单个集合的最大大小为 5,并且给定集合中任何两个数字之间的绝对差不能超过 2(集合可以包含j
、j+1
、j-1
、j+2
或 j-2
)。
我认为我不能足够快地完美解决这些问题。所以我想出了以下启发式方法:
-
大小的上限是每个组中每个集合的并集大小(上例中为 8)
大小的上限是每个组中最大集合的大小之和。 (上面的例子会给出 7)
大小上限为 min(heuristic1, heuristic2)
我认为没有一种有效的算法可以准确计算尺寸(尽管我很想被证明是错误的)。但是,如果有人能看到一个可以给出更严格界限(并且计算效率高)的启发式算法,那就太棒了。
编辑:对于我的特定用例,我只对上限感兴趣。我需要能够肯定地说大小不超过一个特定的数字,否则启发式对我来说毫无用处。
【问题讨论】:
【参考方案1】:可以利用的组和集合之间是否存在任何关系?
如果不是,那么使用一个简单的贪心算法怎么样,从空集开始,然后为每个组添加当前解决方案中没有的元素最多的集合:
-
令 T = ∅, N = 1
选择集Sk ∈ S1, ..., SM 在组 N 这样Sk = maxi(|Si sub> \ T|)
令 T = T ∪ Sk
如果最后一个组退出,否则 N = N + 1 并转到步骤 2。
答案显然取决于几个问题:
初始组 处理组的顺序 当 max 不唯一时选择 Sk要缓解这些问题,您可以跟踪多个解决方案T。例如,在每一步都保留前 2 或 3 个解决方案。然后在退出时保持最大的解决方案。
【讨论】:
谢谢。是的,这是个好主意。但是(我很抱歉,但我完全忘记在最初的问题发布中提到这一点)我实际上只是在寻找上限,这似乎是一个下限。以上是关于最大覆盖变体的启发式的主要内容,如果未能解决你的问题,请参考以下文章