【发布时间】: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,其中他们提到了解决此类问题的两个包,LPsolve 和Rsymphony,但我什至不知道如何开始。在我的现实生活示例中,我有 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