用于查找最小组件集合的算法

时间:2014-01-07 20:43:09

标签: algorithm combinations graph-theory mathematical-optimization discrete-mathematics

我正在寻找一种算法来解决以下问题。我有一组给定集合(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

3 个答案:

答案 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或更低。

希望有所帮助。