我有一个问题是创建最小数量的集来覆盖整个数据集。
问题有一个数据域和一些排他性限制。排他性约束规定哪些数据不应该在同一组中。
目标是找到最小数量的集合。集合的数量不必尽可能平衡(但是很高兴)。
示例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
答案 0 :(得分:7)
忽略余额,这是graph coloring。
域< =>图的顶点
set< =>具有特定颜色的所有顶点
排他性约束< =>图的边缘。
不幸的是,图形着色是NP难的,并且可证明的近似比率不好。有很多很多启发式方法。
答案 1 :(得分:1)
从我的角度来看,我认为你可以创建一个加权图。对于相互排除的节点,将顶点的权重设置为Int.MAX
,其他节点的权重设置为0
。
然后,您可以尝试针对彼此没有路由的节点减少此图。 (我确信这个问题存在一些算法)。
HTH
答案 2 :(得分:1)
首先,将此问题描述为覆盖问题有点误导。它实际上是一个对分区有约束的集合分区问题。
将其制定并解析为整数线性程序(ILP)。谷歌透露了Java ILP。如果您有兴趣,我可以发布更多关于如何将您的问题表述为ILP的信息。
让数据集中的每个元素(Domain
集)代表无向图中的节点。从完整的图形开始(即所有节点彼此连接)并根据您的排他性约束丢弃边缘(即如果您使用邻接矩阵A
来表示图形,1!=2
暗示{ {1}}和A(1,2) = 0
)。
然后找到等同于minimum clique partition的minimum graph coloring。
但是你可以list all maximal cliques从那里开始工作。