【发布时间】:2018-01-05 08:14:59
【问题描述】:
背景 - 我想尝试彻底搜索一组所有可能的 250 行组合,一次取 10 行。为了迭代得到这个,我使用下面的代码
`
## Function definition
gen.next.cbn <- function(cbn, n){
## Generates the combination that follows the one provided as input
cbn.bin <- rep(0, n)
cbn.bin[cbn] <- 1
if (tail(cbn.bin, 1) == 0){
ind <- tail(which(cbn.bin == 1), 1)
cbn.bin[c(ind, ind+1)] <- c(0, 1)
}else{
ind <- 1 + tail(which(diff(cbn.bin) == -1), 1)
nb <- sum(cbn.bin[-c(1:ind)] == 1)
cbn.bin[c(ind-1, (n-nb+1):n)] <- 0
cbn.bin[ind:(ind+nb)] <- 1
}
cbn <- which(cbn.bin == 1)
}
## Example parameters
n <- 40
k <- 10
## Iteration example
for (i in 1:choose(n, k)){
if (i == 1){
cbn <- 1:k
}else{
cbn <- gen.next.cbn(cbn, n)
}
print(cbn)
}
`
当我超过 40 行时,我收到错误“无法分配大小为 n GB 的向量”。
理想的解决方案: a)如果可以转储组合并且可以在循环中的每次运行后迭代地刷新内存(我可以在其中检查进一步的条件) b) 如果可以将组合转储到 csv 文件中,这样就不会造成内存占用。
感谢您的支持。
【问题讨论】:
-
250 行中有 10 行有 219005316087032475 组合。即使你每秒可以进行一百万次组合,也需要 6900 多年才能运行。你确定这是你想要做的吗?
-
如果你真的想这样做,你需要大规模并行化它。您也不应该使用 R,而是使用编译语言。您可以访问一个非常大的集群吗?
-
谢谢弗洛里安,你是对的。如果我能逃脱 200 行中的 5 行,我什至可以生存。这将复杂性降低到 1e12,我相信可以在不到一周的时间内破解。
-
您应该查看
iterpc。这正是它的目的。
标签: r dataset combinations combn