4

Rのセットカバー問題の近似を解決または実装しようとしています。このようなデータフレームが与えられます。

  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

setsn (宇宙) のすべての一意の要素をカバーする少数のセット (列 ) を計算したいと思います。この例では、s1 {1, 2, 3} と s4 {4, 5} の 2 つのセットがあります。ウィキペディアとインターネットでそれについて読んだことがありますが、貪欲なアルゴリズムを適用して近似値を見つけることができることを知っています。このような問題を解決するための 2 つのパッケージについて言及しているこのリンクも確認しましたが、開始方法さえわかりません。私の実際の例では、40,000 を超えるセットがあり、各セットには 1,000 から 10,000 の要素があり、80,000 の unviverse または一意の要素があります。LPsolveRsymphony

開始または続行する方法についてのヘルプまたはガイドは、非常に高く評価されます。

データ

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")
4

1 に答える 1

3

このlpSolveパッケージは、線形計画問題用に CRAN で利用できます。http://math.mit.edu/~goemans/18434S06/setcover-tamara .セットアップの適切な構造を理解するためのテンプレートとしてpdf?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最小限のカバーです。「列係数」は「セット」の選択を決定します。

于 2016-08-27T19:31:54.930 に答える