我正在尝试与 GA 包和 data.table 并行运行 GA。 简而言之,我正在优化高维(100k 变量)非线性目标函数。目前,我正在研究一个可以并行运行的简单遗传算法。不幸的是,当我与 data.table 并行运行 R 的包 GA 时,我收到一个奇怪的错误,这表明 data.table 没有正确实例化。
这里是 MWE,以及由此产生的错误。
library(GA)
library(data.table)
sampler <- function(x){
y <- data.table(x)
y$x <- y$x+1 # works
y[,x:=x+1] # does not work
return(-(y$x)^2)
}
library(doParallel)
cl <- makeCluster(4) # set the number of processor cores
registerDoParallel(cl)
clusterEvalQ(cl, library("data.table"))
GA2 = ga(type = "real-valued",
fitness = sampler,
lower = 0, upper = 10000,
suggestions = 1.5,
popSize = 100, maxiter = 10, monitor = TRUE,
seed = 12345, parallel = cl)
stopCluster(cl)
{ 中的错误:任务 1 失败 - “检查 is.data.table(DT) == TRUE。 否则, := 和
(...) 被定义为在 j 中使用,仅一次并且在 特定的方式。请参阅帮助(“:=”)。“:=
当 ga 非并行运行时,代码运行良好(删除并行 = cl)。我检查了库 data.table 是否已加载到节点中,看起来是这样(clusterEvalQ)。我也尝试将 libpath 添加到节点;并不能改变结果... 任何建议都会有所帮助! 谢谢!
编辑:
按照@jangorecki的建议,我将代码修改为:
set(y, j="x", value=x+1)
set(y, j="p", value=x+2)
现在工作正常,但是如果我尝试以 data.table 方式聚合:
newdt <- setDT(y)[,sum(x),.(p)]
即使我设置了setDT(y),它也不会再工作了。看起来好像 setDT 没有任何效果。有什么建议吗?
我添加了和你一样的问题,同时在我的优化函数中广泛使用
data.table
。根据不同的评论(以及我在 .datatable.aware
选项上看到的其他评论),我通过插入 .datatable.aware <- TRUE
作为第一个函数指令来修改您的优化函数。
这给出了以下代码:
sampler <- function(x){
.datatable.aware <- TRUE
y <- data.table(x)
# y$x <- y$x+1 # commented to use only next instruction
y[,x:=x+1] # does not work
return(-(y$x)^2)
}
它似乎有效,因为我得到了通常的
GA
输出:
GA | iter = 1 | Mean = -36126320.13 | Best = -12.25
GA | iter = 2 | Mean = -19570443.70 | Best = -12.25
GA | iter = 3 | Mean = -13964119.27 | Best = -12.25
GA | iter = 4 | Mean = -12195910.78 | Best = -12.25
GA | iter = 5 | Mean = -9433198.65 | Best = -12.25
GA | iter = 6 | Mean = -11314493.47 | Best = -12.25
GA | iter = 7 | Mean = -6428250.29 | Best = -12.25
GA | iter = 8 | Mean = -6098880.28 | Best = -12.25
GA | iter = 9 | Mean = -6411148.45 | Best = -12.25
GA | iter = 10 | Mean = -5533581.03 | Best = -12.25