0

次の表があるとします。

     VAR    ITER_1  ITER_2  ITER_3  ITER_4
    VAR1    6       8       5       7
    VAR2    5       1       7       8
    VAR3    3       8       8       4
    VAR4    8       7       2       5
    VAR5    8       7       9       2
    VAR6    8       7       3       6
    VAR7    4       7       4       5

特定の合計に等しい組み合わせがあるように、各行の列の組み合わせを選択したいと考えています。たとえば、この場合、ITER の各 VAR の組み合わせを 15 にしたいとします。その場合、 for VAR1, ITER_2&を選択しますITER_4VAR2ITER_3&の場合ITER_4

各 VAR に対して選択する列の値をコードが教えてくれるようなコードを開発したかったのです。

誰でもいくつかの方法を提案できますか? コードを書く必要はありませんが、使用できるロジックです。

ありがとうございました。

4

2 に答える 2

2

これは、すべての列の合計が取られる場合に機能します。

data = data.frame(x = 1:3, y = 2:4, z = 5:7)
sums = apply(data, 1, sum)
target.val = 11
which(sums == target.val)

そうでなければ、これは正確なカバーの問題のように見えます。 http://en.wikipedia.org/wiki/Exact_cover

または

遺伝的アルゴリズムのような確率的アプローチを使用できます。単純な解決策:

find.colsums = function(data, target,  N.tries = 100)
{
  nrows = nrow(data)
  max.cols = ncol(data)
  n.columns = sample(max.cols, N.tries, replace = TRUE)

  for (i in 1:N.tries){
    test.cols = sample(max.cols, n.columns[i])

    for (row in 1:nrows){
      if (sum(data[row, test.cols]) == target){
        cat("match at row:", row, "cols:", test.cols, "\n")
      }
    }
  }
}

例:

data = data.frame(x = 1:3, y = 2:4, z = 5:7)
target = 7
find.colsums(data, target)

大きなデータセットを楽しむ:

N = 1000
min.val = 1
max.val = 30
ncols = 10
target = ((min.val + max.val) * ncols/2)

data = matrix(sample(min.val:max.val, N, replace = TRUE), ncol = ncols)
find.colsums(data, target, N.tries = 1000)
于 2013-08-07T16:34:31.060 に答える
0

再帰アルゴリズムを調べる必要があります

ここで良い例を見つけることができます

于 2013-08-07T16:32:38.773 に答える