我正在寻找一种算法来解决以下问题。我有一组给定集合(a-h)的子集(1-n)。我想找到最小的子集合,这些子集将允许我通过组合构造所有给定的子集。此集合可以包含1-n中不存在的子集。
a b c d e f g h
1 1
2 1 1
3 1 1 1
4 1 1
5 1 1
6 1 1 1 1
7 1 1 1 1
8 1 1 1
9 1 1 1
下面是两个可能的集合,其中最小的集合包含七个子集。我用x表示了新的子集。
1 1
x 1
x 1
x 1
x 1
x 1
x 1
x 1
1 1
x 1
x 1
x 1
x 1
x 1 1
x 1
我相信这一定是个已知问题,但我对算法并不熟悉。非常感谢任何帮助,以及更好的主题标题的建议。
谢谢!
图形着色让我走了很长的路,谢谢。但是,在我的情况下,允许子集重叠。例如:
a b c d
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1
5 1 1 1 1
图形着色为我提供了这个解决方案:
x 1 1
x 1
x 1
但是这个也有效,而且更小:
1 1 1 1
4 1 1
答案 0 :(得分:6)
这个问题被称为Set Basis,它是NP-complete(Larry J. Stockmeyer:集合基础问题是NP-complete。技术报告RC-5431,IBM,1975)。它作为图形问题的表述是Bipartite Dimension。由于一般来说很难解决,看看你的数据是否有任何有用的属性可能是有用的(例如,这些集合是否小?解决方案是否小?是否可以发生所有集合?)
我想不出一个简单的ILP配方。相反,您可以尝试使用Kou&Wong的减少或Nor et al.的减少来将问题减少到Clique Cover,这是更好的研究。我已经联想起了一篇讨论algorithms for Clique Cover的论文,并用精确求解器和两个启发式算法编写了Clique cover solver。
答案 1 :(得分:1)
此问题显示在Coursera's Discrete Optimization lectures的视频中。 IIRC,它被称为设置封面问题。
IIRC,它是NP-complete或NP-hard,所以研究典型的算法(小数据集的精确算法,中/大数据集的元启发式)和典型的框架(OptaPlanner,......)答案 2 :(得分:1)
对于Set Cover
问题的这个变体,这里是一个整数规划公式,行生成。
让我们用它们的列号表示组分a,b,c,d ......。 a = 1,b = 2等。
行是'子集'。假设现有的子集是S1,...... Sm。 (这些是必须涵盖的。)
这是我们介绍新子集的步骤。
我们将'原子'子集称为a_x
。所有a
个子集只有一个组件。
a1 is the subset {1,0,0,0}
a2 is the subset {0,1,0,0}
a3 is the subset {1,0,1,0}
...
让bxy
成为包含两个组件的子集。
So `b13` is the subset with component 1 and 3 being present.
b13 = {1, 0, 1, 0}
b34 = {0, 0, 1, 1} etc.
cxyz are subsets with three components.
For example, c124 = { 1, 1, 0, 1} etc.
d subsets will have 4 components
e subsets will have 5 components
and so on.
给定一个EXISTING Set,我们只需要生成所需的NEW a,b,c ...子集。
For example, let's take the subset S1 = {1, 0, 1, 1}
Meaningful sets needed that can help create S1 are
a1, a3, a4. (Note that a2 is not needed since component b is not a component in S1}
b11, b13, b34.
c134
预处理步骤:对于EXISTING SETS中的每个Sj,使用上述过程生成新的子集。我们根据需要创建了尽可能多的ax,bxy,cxyz dxyzw ......在配制步骤之前需要该步骤。
在最坏的情况下,每个Sj需要(2 ^ num_components-1)个子集。但它们很容易产生。
现在针对以下问题制定:
a b c d
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1
5 1 1 1 1
每个ROW都有一个约束。每一组都必须“涵盖”
对于上面的问题,这里是公式
Objective Minimize sum of all Subsets.
Min sum (a_x) + sum (b_xy) + sum (c_xyz) + sum (d_xyzw)
Subject to:
a1 + a2 + a3 + b11 + b12 + b13 + c123 >= 1 \\ Set 1 has to be formed
a1 + a2 + a3 + b11 + b12 + b13 + c123 >= 1 \\ Set 2 has to be formed
a1 + a2 + a3 + b11 + b12 + b13 + c123 >= 1 \\ Set 3 has to be formed
a4 + a5 + b34 >= 1 \\ Set 4 has to be formed
a1 + a2 + a3 + a4 + b11 + b12 + ..+ b34 + c123 + ...+ d1234 >= 1 \\ Set 5 has to be formed
a's, b's, c's, d's Binary
上限:通过利用最多需要j个子集(现有子集数)的事实,您甚至可以添加切割。目标函数必须是j或更低。
希望有所帮助。