【问题标题】:Any good implementation of greedy set cover for large datasets? [closed]大型数据集的贪心集覆盖有什么好的实现吗? [关闭]
【发布时间】:2011-10-29 00:01:14
【问题描述】:

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

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)也是可以接受的。

【问题讨论】:

    标签: python algorithm numpy scipy linear-programming


    【解决方案1】:

    有一个众所周知的用于集合覆盖的贪心逼近算法,它也很容易用您选择的任何语言实现。算法本身在此处描述:

    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,2) 和 (3,4) 将给我 3 的成本,而选择 (1,2,3, 4) 会给我 4. 我希望有成本意识的贪婪集封面会考虑到这一点,但扩展很简单:“在每个阶段选择具有最大交叉点成本最低的那个“?
    • 是的,抱歉,我错过了维基百科页面实际上没有涵盖加权版本的事实,我认为它会有,因为它是一种标准。无论如何,添加了一个指向讲义的链接,该链接也解释了加权版本(加权 = 带成本)。您基本上将要添加的新集合的成本与其覆盖的元素数量相除,并始终选择效率最高的集合(每个覆盖元素的成本最低)。它仍然是可证明的良好近似算法。
    • 非常感谢。我完成了它的实现并将其发布在这里:stackoverflow.com/questions/7942312/… 以获取有关如何使其更快实现的建议。我还为答案添加了更多链接。再次感谢您的帮助:)
    • 我的集合最多有几十个项目,有没有针对加权集合覆盖问题的精确算法?
    • @StavrosKorokithakis 是的,分支和绑定。
    【解决方案2】:

    我的 C++ 中贪婪集覆盖的线性时间/空间实现可在 github 上找到。

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

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

    我仍在研究一些技巧来提高性能

    1. 使用MinHash 删除被更大集合覆盖的子集
    2. 删除所有仅包含一个元素且没有其他集合的集合

    【讨论】:

    • 在加权集覆盖中删除被更大集覆盖的子集不是有效操作吗?即较小的子集可以最小化成本。我是出于好奇而问的,并不是说是这样。
    • @AdamHughes 对延迟回复感到抱歉。应该可以删除被更大集合完全覆盖的加权集合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2018-11-12
    • 2011-01-12
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    相关资源
    最近更新 更多