Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取总计为274的所有组合,最大值为R中的4_R_Sum_Max_Combinations - Fatal编程技术网

获取总计为274的所有组合,最大值为R中的4

获取总计为274的所有组合,最大值为R中的4,r,sum,max,combinations,R,Sum,Max,Combinations,我想得到280个元素的每一个组合,总和为274,但每个值必须是一个介于0和4之间的整数 有一个函数几乎可以做到这一点,那就是restrictedparts(我在这里找到:)……但仍然必须只获取值高达4的元素。通常,这些类型的问题可以由分区包处理,但是,我无法使用该包找到解决方案。我还没有完全排除这个软件包,因为在过去的几年里,我不断地发现了非常好的惊喜。我离题了 首先,总和为274的正整数的最大数目是274(例如,sum(rep(1274)))。因此,任何包含超过274个元素(例如n)的解决方案

我想得到280个元素的每一个组合,总和为274,但每个值必须是一个介于0和4之间的整数


有一个函数几乎可以做到这一点,那就是restrictedparts(我在这里找到:)……但仍然必须只获取值高达4的元素。

通常,这些类型的问题可以由
分区
包处理,但是,我无法使用该包找到解决方案。我还没有完全排除这个软件包,因为在过去的几年里,我不断地发现了非常好的惊喜。我离题了

首先,总和为274的正整数的最大数目是274(例如,
sum(rep(1274))
)。因此,任何包含超过274个元素(例如n)的解决方案都是相同的,除了每个组合有一个额外的
n-274
0

举个例子来说明这一点,假设我们正在寻找10个元素的每一个组合,它们的总和为8,其中每个元素都是0到2之间的整数。唯一的解决办法是:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    0    0    0    0    0    0    2    2    2     2
[2,]    0    0    0    0    0    1    1    2    2     2
[3,]    0    0    0    0    1    1    1    1    2     2
[4,]    0    0    0    1    1    1    1    1    1     2
[5,]    0    0    1    1    1    1    1    1    1     1
正如您所看到的,最后一行具有最大数量的正元素(即8个)

这是一个重要的观察结果,因为我们可以通过将元素的数量限制到所需的总和来大大减少要测试的组合的数量

n个元素的选择k由二项式系数给出,其中顶部数为n+k-1,底部数为k:

因此,以我们为例,我们可以将可能的支票数量减少2000多万张:

choose(280 + 5 - 1, 280)
[1] 265368251

choose(274 + 5 - 1, 274)
[1] 243531475

265368251 - 243531475
[1] 21836776
虽然我们缩小了可能性的空间,但我们仍然面临着艰巨的任务。生成所有组合并测试其总和不太可能在合理的时间内产生任何解决方案

使用更新版本的RcppAlgos更新了答案 在版本
2.3.5
中,实现了一种非常有效的广义划分算法。它适用于有/无重复的标准组合以及多集:

## Using version 2.4.1
system.time(comb274 <- RcppAlgos::comboGeneral(0:4, m = 274, TRUE, 
                                               constraintFun = "sum",
                                               comparisonFun = "==",
                                               limitConstraints = 274))
 user  system elapsed 
0.420   0.196   0.608

dim(comb274)
[1] 150811    274
我们看到,与旧版本相比,效率提高了约10倍

v2.3.3
更合理的解决方案是排除许多组合,而无需检查它们的总和。通过按字典顺序生成组合,一旦某个特定组合超出约束,我们可以跳过许多组合,知道它们也将超出约束。这正是来自
RcppAlgos
(我是作者)的
comboGeneral
所做的

就在这里!确认每行总计274,我们有:

all(rowSums(comb274) == 274)
[1] TRUE

如果您确实需要280个元素,您可以运行上面的代码,将参数
m
设置为280,以牺牲效率为代价,或者简单地
cbind
将150811行6列的零矩阵设置为
comb274

那么您到目前为止做了什么?c(rep(4,times=68),2,rep(0,times=211))是有效的结果吗?它没有1或3,但满足其他约束条件,并且您没有指定使用0:4中所有整数的要求。@42-我认为这将作为OP ask用于每个组合。
library(RcppAlgos) ## v2.3.2

comb274 <- comboGeneral(0:4, m = 274, TRUE, 
                        constraintFun = "sum",
                        comparisonFun = "==",
                        limitConstraints = 274)
Error: vector memory exhausted (limit reached?)
## Again, this was for v2.3.2
system.time(comb274 <- comboGeneral(0:4, m = 274, TRUE, 
                                    constraintFun = "sum",
                                    comparisonFun = "==",
                                    limitConstraints = 274,
                                    upper = 1e6))
 user  system elapsed 
3.624   0.079   3.705

dim(comb274)
[1] 150811    274
all(rowSums(comb274) == 274)
[1] TRUE