列出组合

时间:2017-03-14 08:44:48

标签: python r

我有四个变量,我想以特定的方式分配权重。如果我确定了每个重量的间隔,我应该用哪个程序列出所有可能的解决方案?基本上我会有两个约束 - 权重之和应该是100,权重应该来自预定义的间隔。

我想解决的确切示例是:

25<= weight1<=31
21<= weight2<=26
17<= weight3<=24
25<= weight4<=31
weight1+weight2+weight3+weight4=100

提前致谢!任何评论或建议都非常受欢迎

2 个答案:

答案 0 :(得分:2)

您可以使用expand.grid,即

d1 <- expand.grid(25:31, 21:26, 17:24, 25:31)
d2 <- d1[rowSums(d1)==100,]

head(d2, 5)
#     Var1 Var2 Var3 Var4
#84     31   26   18   25
#119    31   25   19   25
#125    30   26   19   25
#154    31   24   20   25
#160    30   25   20   25

答案 1 :(得分:2)

您可以相对轻松地执行此操作(针对此特定问题),使用R中的expand.grid()来强制执行所有组合。请注意,如果权重的间隔变得更大,这个解决方案将不适合,因为组合太多了。

#  Make all the combinations of weights
all <- expand.grid( 25:31, 21:26, 17:24 , 25:31 )
#  Which add up to 100?
idx <- rowSums( all ) == 100

#  Subset the original matrix to only return those rows which add to 100
head( all[ idx , ] )
#    Var1 Var2 Var3 Var4
#84    31   26   18   25
#119   31   25   19   25
#125   30   26   19   25
#154   31   24   20   25
#160   30   25   20   25
#166   29   26   20   25