R语言GA遗传算法并行优化时调用data.table出现报错求助
问题解决方案
根因说明
你遇到的是PSOCK类型集群(R默认makeCluster生成的就是PSOCK集群)中常见的方法查找优先级问题:
- 你提前通过
clusterEvalQ在节点加载data.table,只是把包加载到了节点的公共环境中 - GA包传递给工作节点的fitness函数是从主节点序列化过去的,自带主节点的执行环境属性,执行时优先从自带环境查找方法,没有正确匹配到data.table重载的
[.data.table、:=等方法,就会回退到base包的data.frame处理逻辑,哪怕对象本身是data.table类,也会触发类型检查报错。
解决方法
方案1:在fitness函数内部加载data.table(最稳妥,推荐)
直接把data.table加载语句放到fitness函数内部,每次函数在节点执行时都会主动绑定正确的方法,所有语法糖都可以正常使用,修改后的完整代码如下:
library(GA) library(data.table) library(doParallel) sampler <- function(x){ # 函数内部主动加载data.table,确保节点上方法正确绑定 library(data.table) y <- data.table(x) y$x <- y$x+1 y[,x:=x+1] # :=语法可正常运行 # 聚合操作也可以正常使用原生data.table语法 y[, p := x + 2] newdt <- y[, sum(x), .(p)] return(-(y$x)^2) } cl <- makeCluster(4) registerDoParallel(cl) 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)
方案2:显式调用data.table方法(无需反复加载包)
如果不想每次执行函数都加载包,可以把所有语法糖替换为显式的data.table方法调用,避免方法查找失败:
sampler <- function(x){ y <- data.table(x) set(y, j = "x", value = y$x + 1) set(y, j = "x", value = y$x + 1) # 替代:=语法 set(y, j = "p", value = y$x + 2) # 显式调用data.table的[方法完成聚合 newdt <- data.table::`[.data.table`(y, j = sum(x), by = .(p)) return(-(y$x)^2) }
内容的提问来源于stack exchange,提问作者Puki Luki
相关产品推荐
相关产品推荐

