2016-12-23 6 views
2

GA 패키지를 사용하여 유전자 알고리즘을 실행할 때 "TRUE/FALSE needed"오류가 발생합니다. 아래에있는 내 코드에서 6GA 패키지의 TRUE/FALSE가 필요하지 않은 "누락 된 값"오류가 발생했습니다.

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) 

결과 및 오류는 다음과 같습니다 like 피트니스위한 기능이며 X 길이의 숫자 벡터이다 :

GA | iter = 1 
Mean =  -Inf | Best = -2.870387 
Error in if (fmin > (sfactor * fave - fmax)/(sfactor - 1)) { : 
    missing value where TRUE/FALSE needed 

답변

1

이, 난해한 오류가 있지만, 문제의 좋은 힌트는 반복 1 요약 정보입니다.

Mean = -Inf | 최상 = -2.870387

함수의 평균 목표 값은 음의 무한대입니다. 즉, 일부 반복은 목표 값 음의 무한대를 반환합니다.

당신이 극대화되기 때문에
x <- c(-3.2, 5.7, -26.9, -6.1, 37, 9) 
like(x) 
# [1] -Inf 

, 당신은 단지 return(pmax(L, -1e6))return(L)를 대체하여 예를 들어, 재치있는 하한에 반환 된 함수 값을 모자 수 : 코드를 디버깅의 비트가이 문제를주는 샘플 데이터를 식별합니다. 그렇다면 합리적인 결과를 얻을 수 있습니다.

GA | iter = 200

평균 = 102.2197 | 최고 = 106.0328 | 최종 지역 검색 = 106.0328

+0

함수의 정의에서 sqrt (x [5])를 새로운 x [5]로 변경하면 작동합니다. 음의 무한대는 log (0)으로 인해 발생합니다. 당신의 도움. – ShuangXin