当使用GA包运行遗传算法时,我收到了一个缺失值,其中需要TRUE / FALSE"错误。在下面的代码中,like
是适应度函数,X
是长度为6的数字向量。
library(GA)
y<-c(46,38,49,55)
W<-matrix(c(0,1,0,0,1,0,0,0,0,0,0,1,0,0,1,0),ncol=4)
ei<-eigen(W)$values
data<- matrix(c(14691,14150,14607,15140,5337,5386,5207,5178),ncol=2)
like=function(x)
{
co<-c(x[2],x[3])
e<-x[4]*W%*%y-data%*%co-x[1]
L<-30*log(2)-15*log(2*pi)+log(prod(1-x[4]*Re(ei)))-15*log(x[5])+sum(log(pnorm(-x[6]*e/sqrt(x[5]))))
-0.5/x[5]*t(e)%*%e
return(L)
}
GA <- ga(type = "real-valued",
fitness = like,
min=c(-100,0,-50,-10,0.001,0),
max=c(100,100,0,10,100,10),
popSize = 100, maxiter = 200,
optim = TRUE)
结果和错误如下:
GA | iter = 1
Mean = -Inf | Best = -2.870387
Error in if (fmin > (sfactor * fave - fmax)/(sfactor - 1)) { :
missing value where TRUE/FALSE needed
答案 0 :(得分:1)
这是一个神秘的错误,但问题的一个很好的提示是在迭代1摘要信息中:
平均值= -Inf |最好= -2.870387
你的函数的平均目标值是负无穷大,这意味着一些迭代正在返回客观值负无穷大。一些调试代码可识别出这个问题的样本数据:
x <- c(-3.2, 5.7, -26.9, -6.1, 37, 9)
like(x)
# [1] -Inf
由于您正在最大化,您可以将返回的函数值限制在合理的下限,例如将return(L)
替换为return(pmax(L, -1e6))
。然后你会得到明智的结果:
GA | iter = 200
平均值= 102.2197 |最好= 106.0328 |最终本地搜索= 106.0328