2013-08-07 92 views
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.在这种情况下,我想选择VAR1ITER_2 & ITER_4。对于VAR2ITER_3 & ITER_4

我想开发一个代码,以便代码可以告诉我为每个VAR选择哪些列值。

任何人都可以提出一些方法吗?一个不需要编写代码,但是我可以使用的逻辑。

谢谢。

+0

应该发生什么,如果所需的款项是不可能的?对于VAR1,16是不可行的。如果多个ITER具有相同的值(例如VAR7的ITER_1和ITER_3),应该采用哪一个ITER? –

+0

当我试图弄清楚问题的逻辑时,我会用铅笔和纸坐下来,尝试一些示例,并观察通过示例进行操作时所遵循的步骤。这些步骤通常会导致解决问题所必需的逻辑思想。也许这种方法适用于你。 – GreatBigBore

+0

@亚历克斯:感谢您的评论。如果多个Iter具有相同的值,则代码将突出显示所有这些值。例如。如果有2个VAR1组合,它们有1个共同的iter(比如ITER_3),那么它会突出显示3个iter。但这种可能性可以忽略不计。另外,如果我们可以放置一个范围,则直接总和是可能的。但是这些有点柔化。如果我解决了这个简单的问题,那么我们可以在以后增加更多并发症。 – Beta

回答

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) 
+0

确定编辑答案。 – Fernando

+0

谢谢费尔南多!我会尝试你的答案。 – Beta

+0

您可以接受帮助关闭主题的答案。 – Fernando

0

你应该看看递归算法

你可以找到一个很好的例子here

+0

谢谢塞尔吉奥!我在看你的建议。 – Beta