我正在尝试使用genoud
中的R
遗传优化器来优化函数,library(rgenoud)
是R
的一部分。我限制了在genoud
中设置并行处理的经验。
cluster
内置makeClusters
选项localhost
,其名称已知。我想在单个多核机器上设置并行处理。我理解本地机器的名称是genout <- genoud(sin, 1, cluster=c('localhost','localhost','localhost'))
,并且重复该名称将在机器上使用多个核心。
这种方法似乎适用于简单的函数,例如:
fun1 <- function(x) {sin(x)}
fun2 <- function(x) {
x <- fun1(x)
ret <- x + cos(x)
return(ret)
}
genout <- genoud(fun2, 1, cluster=c('localhost','localhost','localhost'))
然而,当我优化更复杂的功能结构时,某些机器或环境找不到所有功能。这是一个例子:
Error in checkForRemoteErrors(val) :
3 nodes produced errors; first error: could not find function "fun1"
这会产生错误
fun1
一种解决方案似乎是将fun2
嵌入fun2
。但是,如果fun1
运行了很多次(在其他情况下比愚蠢的例子),这似乎效率低下。解决此问题的唯一方法是在fun2
嵌入fun2
吗?
修改:即使在嵌入时,当需要通过genoud
将对象传递给y=1
fun2 <- function(x,z) {
fun1 <- function(x) {sin(x)}
x <- fun1(x)
ret <- x + cos(x)*z
return(ret)
}
genout <- genoud(fun2, 1, cluster=c('localhost','localhost','localhost'), z=y)
>Error in checkForRemoteErrors(val) :
3 nodes produced errors; first error: object 'y' not found
时,还有更多问题,请参阅:
clear: both
答案 0 :(得分:1)
我认为问题是genoud
函数没有正确评估并向工作人员发送其他参数。在这种情况下,参数z
将被发送给工作人员而不进行评估,因此工作人员必须对其进行评估,但由于变量y
未发送给工作人员,因此它们会失败。 / p>
解决方法是使用clusterExport
将必要的变量导出到工作人员,这需要您显式创建要使用的genoud
的集群对象:
library(rgenoud)
library(parallel)
cl <- makePSOCKcluster(3)
fun1 <- function(x) {sin(x)}
fun2 <- function(x, z) {
x <- fun1(x)
x + cos(x) * z
}
y <- 1
clusterExport(cl, c('fun1', 'y'))
genout <- genoud(fun2, 1, cluster=cl, z=y)
这也会导出fun1
,这是必要的,因为genoud
并不知道fun2
依赖它。