R:GA优化中的data.table抛出错误

问题描述 投票:0回答:1

我正在尝试与 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 没有任何效果。有什么建议吗?

r data.table genetic-algorithm doparallel
1个回答
0
投票

我添加了和你一样的问题,同时在我的优化函数中广泛使用

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
© www.soinside.com 2019 - 2024. All rights reserved.