大数据集的贪婪集覆盖的任何良好实现?

时间:2011-10-29 00:01:15

标签: python algorithm numpy scipy linear-programming

这个问题来自我发布的相关问题here。 @mhum建议我的问题属于覆盖问题域。我尝试将我的问题编码为最小集合覆盖问题,目前我有一个这种形式的数据集:

Set        Cost
(1,2)        1
(1)          1
(1,2,3)      2
(1)          2
(3,4)        2
(4)          3
(1,2)        3
(3,4)        4
(1,2,3,4)    4

目标是找到一个覆盖所有数字的好套装,并试图将总成本降至最低。我的数据集很大,至少有30000套(大小从5-40个元素不等),就像这样。是否有任何好的贪婪实现来解决这个问题,还是我自己实现这个?我不是LP的专家,但任何可以解决这个问题的LP解算器(来自numpy / scipy)都是可以接受的。

2 个答案:

答案 0 :(得分:7)

有一种众所周知的用于集合封面的贪婪近似算法,它也可以用您选择的任何语言轻松实现。算法本身在这里描述:

http://en.wikipedia.org/wiki/Set_cover_problem#Greedy_algorithm

这很简单,最简单的事情就是从头开始编写。

值得注意的是,它也是集合覆盖已知的最佳多项式时间近似算法。这意味着要获得更好的最坏情况性能(更紧凑的结果集),您需要具有非多项式运行时间(=大型集的慢速算法)。

不幸的是,维基百科条目实际上并没有涵盖加权集合覆盖,这就是这里的情况。扩展很简单,并且例如描述了这里:

http://pages.cs.wisc.edu/~shuchi/courses/880-S07/scribe-notes/lecture03.pdf

一些更有用的说明:

http://www.cs.ucr.edu/~neal/non_arxiv/Young08SetCover.pdf http://www.cs.uiuc.edu/class/sp08/cs473/Lectures/lec20.pdf

答案 1 :(得分:1)

我在github上可以获得c ++中贪婪集封面的线性时间/空间实现。

https://github.com/martin-steinegger/setcover

计算40.000.000套平均值。在Amazon AWS m2.2xlarge实例上计算每组10个元素大约需要4分钟。

我仍在努力提高性能

  1. 使用MinHash
  2. 删除较大集合所涵盖的子集
  3. 删除所有仅包含一个不属于其他集合的元素的集合