最大覆盖变量的启发式算法

时间:2015-07-25 01:22:53

标签: algorithm set heuristics

我有以下问题: 有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(一个集合可以包含{{1 },jj+1j-1j+2)。

我不认为我可以非常快速地解决这些问题。所以我提出了以下启发式方法:

  1. 大小的上限取决于每组中每组的并集大小(上例中为8)
  2. 大小的上限取决于每组中最大集合的大小之和。 (上面的例子会给出7)
  3. 大小由min(heuristic1,heuristic2)
  4. 限制

    我不认为有一种有效的算法来准确计算大小(虽然我很乐意被证明是错误的)。但是,如果任何人都可以看到一个可以提供更严格约束的启发式(并且计算效率更高),那就太棒了。

    编辑:对于我的特定用例,我只对上限感兴趣。我需要能够肯定地说,大小不超过一个特定的数字,否则启发式对我来说是无用的。

1 个答案:

答案 0 :(得分:0)

可以利用的组和集之间是否存在任何关系?

如果没有,那么一个简单的贪婪算法如何以空集开始,然后为每个组添加具有最多元素的集合,而不是当前解决方案:

  1. T = {∅},N = 1
  2. 选择集 S k ∈{ S 1 ,..., S N 中的em> M },使 S k = max (| S i \ T |)
  3. T = T S k
  4. 如果最后一组退出,则N = N + 1,然后转到步骤2.
  5. 答案显然取决于几个问题:

    • 初始组
    • 处理组的顺序
    • max 不唯一时选择 S k

    要缓解这些问题,您可以跟踪多个解决方案 T 。例如,在每个步骤中保留前2或3个解决方案。然后在退出时保留最大的解决方案。