我有以下问题: 有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 },j
,j+1
,j-1
或j+2
)。
我不认为我可以非常快速地解决这些问题。所以我提出了以下启发式方法:
我不认为有一种有效的算法来准确计算大小(虽然我很乐意被证明是错误的)。但是,如果任何人都可以看到一个可以提供更严格约束的启发式(并且计算效率更高),那就太棒了。
编辑:对于我的特定用例,我只对上限感兴趣。我需要能够肯定地说,大小不超过一个特定的数字,否则启发式对我来说是无用的。
答案 0 :(得分:0)
可以利用的组和集之间是否存在任何关系?
如果没有,那么一个简单的贪婪算法如何以空集开始,然后为每个组添加具有最多元素的集合,而不是当前解决方案:
答案显然取决于几个问题:
要缓解这些问题,您可以跟踪多个解决方案 T 。例如,在每个步骤中保留前2或3个解决方案。然后在退出时保留最大的解决方案。