创建最小数量的集合以涵盖所有数据

时间:2011-07-18 14:36:27

标签: java algorithm set

我有一个问题是创建最小数量的集来覆盖整个数据集。

问题有一个数据域和一些排他性限制。排他性约束规定哪些数据不应该在同一组中。

目标是找到最小数量的集合。集合的数量不必尽可能平衡(但是很高兴)。

示例1:

Domain = {1, 2, 3, 4, 5, 6}
Exclusivity = 1!=2, 3!=4, 4!=5, 5!=6,

Answer is two sets: {1, 3, 5}, {2, 4, 6}

示例2:

Domain = {1, 2, 3, 4, 5, 6}
Exclusivity = 1!=2, 2!=3, 3!=4, 4!=5

anwser is two sets: {1, 3, 5, 6}, {2, 4}

示例3:

Domain = {1, 2, 3, 4, 5}
Exclusivity = 1!=2, 2!=3, 3!=4, 4!=5, 5!=1

answer is three sets : {1, 3}, {2, 4}, {5}

示例4:

Domain = {1, 2, 3, 4, 5}
Exclusivity = 1!=2!=3!=4, 4!=5,

answer is four sets : {1, 5}, {2}, {3}, {4}

!=这里是传递性的。

有谁知道这样的算法可以有效地解决这个问题。我记不起我从学校学到的任何解决这个问题的算法,但这已经超过10年了。

非常感谢帮助。

JT

3 个答案:

答案 0 :(得分:7)

忽略余额,这是graph coloring

域< =>图的顶点

set< =>具有特定颜色的所有顶点

排他性约束< =>图的边缘。

不幸的是,图形着色是NP难的,并且可证明的近似比率不好。有很多很多启发式方法。

答案 1 :(得分:1)

从我的角度来看,我认为你可以创建一个加权图。对于相互排除的节点,将顶点的权重设置为Int.MAX,其他节点的权重设置为0

然后,您可以尝试针对彼此没有路由的节点减少此图。 (我确信这个问题存在一些算法)。

HTH

答案 2 :(得分:1)

首先,将此问题描述为覆盖问题有点误导。它实际上是一个对分区有约束的集合分区问题。

解决方案1 ​​

将其制定并解析为整数线性程序(ILP)。谷歌透露了Java ILP。如果您有兴趣,我可以发布更多关于如何将您的问题表述为ILP的信息。

解决方案2

让数据集中的每个元素(Domain集)代表无向图中的节点。从完整的图形开始(即所有节点彼此连接)并根据您的排他性约束丢弃边缘(即如果您使用邻接矩阵A来表示图形,1!=2暗示{ {1}}和A(1,2) = 0)。

然后找到等同于minimum clique partitionminimum graph coloring

但是你可以list all maximal cliques从那里开始工作。