【问题标题】:Set cover approximation in R在 R 中设置覆盖近似值
【发布时间】:2016-08-27 18:09:32
【问题描述】:

我正在尝试解决或实现 R 中 set cover problem 的近似值。给定这样的数据框。

  sets n
1   s1 1
2   s1 2
3   s1 3
4   s2 2
5   s2 4
6   s3 3
7   s3 4
8   s4 4
9   s4 5

n 列中元素的唯一数量是:

unique(d$n)
[1] 1 2 3 4 5

我想计算覆盖 n(宇宙)中所有唯一元素的较小数量的集合(列 sets)。在此示例中,有两个集合:s1 {1, 2, 3} 和 s4 {4, 5}。我在维基百科和互联网上读过它,我知道可以应用贪心算法来找到近似值。我也检查了这个link,其中他们提到了解决此类问题的两个包,LPsolveRsymphony,但我什至不知道如何开始。在我的现实生活示例中,我有 40,000 多个集合,每个集合包含 1,000 到 10,000 个元素以及 80,000 个非生物或独特元素。

非常感谢任何有关如何开始或继续的帮助或指导。

数据

d <- structure(list(sets = structure(c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 
4L, 4L), .Label = c("s1", "s2", "s3", "s4"), class = "factor"), 
    n = c(1, 2, 3, 2, 4, 3, 4, 4, 5)), .Names = c("sets", "n"
), row.names = c(NA, -9L), class = "data.frame")

【问题讨论】:

  • 这个问题是已知的 NP 完全问题,并且出现在大数据问题中,例如计算生物学。使用贪心算法构造覆盖如下,并有“在每一步选择具有最多未覆盖元素的集合”的解释: 1)选择原始集合中元素数最大的集合。 2) 从剩余的其他子集中删除该集合及其所有元素。 3)递归。
  • @sayaa 我已经在维基百科和其他页面中阅读过您提到的贪心算法方法,但我不知道如何实现它。我见过一些python implementation。我找不到任何 R 示例似乎很奇怪,因为我认为这是一个常见问题。如果您碰巧知道一个示例或链接,那就太好了。谢谢

标签: r combinatorics linear-programming set-cover


【解决方案1】:

lpSolve 包可在 CRAN 上用于解决线性规划问题。使用您的链接得到了非常有名的 Hans Borchers 的响应,以及http://math.mit.edu/~goemans/18434S06/setcover-tamara.pdf 中一个稍微复杂的示例(从第 4/5 页开始)作为模板来了解设置的正确结构,然后跟随修改?lp中的第一个例子:

library( lpSolve)
?lp
# In Details: "Note that every variable is assumed to be >= 0!"
# go from your long-form rep of the sets to a wide form for a matrix representation
( items.mat<- t(table(d$sets,d$n))  )  # could have reversed order of args to skip t()
#---------
> dimnames(items.mat) = list( items=1:5, sets=paste0("s", 1:4) )
> items.mat
     sets
items s1 s2 s3 s4
    1  1  0  0  0
    2  1  1  0  0
    3  1  0  1  0
    4  0  1  1  1
    5  0  0  0  1
#---------
f.obj <-  rep(1,4)  # starting values of objective parameters by column (to be solved)
f.dir <- rep(">=",5) # the constraint "directions" by row
f.rhs <- rep(1,5)    # the inequality values by row (require all items to be present)

lp ("min", f.obj, items.mat, f.dir, f.rhs)$solution
#[1] 1 0 0 1

所以s1s4 是最小的封面。 “列系数”决定了“集合”的选择。

【讨论】:

  • 非常感谢
  • 我很想知道它是如何解决一个不那么“明显”的问题的。表现令人满意吗?
  • 你的解决方案帮助了我,因为你解决了我问的例子,所以我尝试了其他例子,然后在我更大的集合上。其次,您指出的链接和lp帮助让我对问题有了更好的理解。由于内存问题,我无法解决其中一种情况;对象大小超出了我的 RAM 限制。我尝试在具有更大 RAM 的计算机上解决更大的矩阵。可能我正在尝试一个太大的矩阵。即使可以优化此代码,我怀疑如果没有更强大的 RAM,我是否可以处理此类矩阵。谢谢!
猜你喜欢
  • 2014-11-16
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 2012-10-24
  • 2011-09-24
  • 1970-01-01
  • 2021-12-20
相关资源
最近更新 更多