从 R 中的 ga-class 中提取 bestSol 得到 NULL

Extracting bestSol from ga-class in R is getting NULL

我正在使用 R 中的 GA 包通过遗传算法优化投资组合权重。我制作了一个自定义监控函数 mon,它应该更新根据每次迭代的当前最佳解决方案权重计算的年均值图 return。这是我参考 https://rdrr.io/cran/GA/src/R/ga.R.

上的源代码后所做的
options(scipen=999)
options(stringsAsFactors=F)
library(GA)

#Constraint parameters: 
set.seed(123)
n=3
returns=matrix(c(rep(0.001,5*365),rep(0.0008,5*365),rep(0.0005,5*365)),
               ncol=n,nrow=5*365,byrow=F)
pop=30
elit=.1*pop
#a is cost scalar.
a=50
maxiter=500
#box constraints
max_x=0.05
min_x=0

#Making monitor function 
mon = function(obj){
  
  iter=obj@iter
  print(mode(obj@bestSol[[iter]]))
  
  plot(x=iter,y=(1+mean(returns%*%obj@bestSol[[iter]]))^365-1,
         xlab="Gen",ylab="Mean Return",xlim=c(0,maxiter),ylim=c(0,1),
         main=paste("Iteration =",iter),type="b",log="x")
  Sys.sleep(0.2)  
    
}

#Fitness function
fit = function(x) { 
 
  target=sum(returns%*%x)
  cost=a*((sum(x)-1)^2+sum(max(0,x-max_x)^2)+sum(max(0,min_x-x)^2))
  return (-target+cost)
  
}


#Set 1% of initial population as 1/N baseline solution
sug=matrix(rep(1/n,n*ceiling(0.01*pop)),nrow=ceiling(0.01*pop),ncol=n,byrow=T)

ga_res_Best = ga(type="real-valued",function(x){-fit(x)},lower=rep(min_x,n),
               upper = rep(max_x,n),maxiter=maxiter,run=100,parallel=T,
               monitor=mon,popSize = pop,elitism = elit,suggestions = sug,
               keepBest=T,optim = F)

一切正常,直到我尝试添加自定义监视器功能。我在 运行 ga_res_Best:

之后收到此错误
 Error in returns %*% obj@bestSol[[iter]] : 
  requires numeric/complex matrix/vector arguments

自从我将 print(mode(obj@bestSol[[iter]])) 添加到监控函数后,我发现我得到 NULL 作为 obj@bestSol[[iter]] 的输出,而我期望它是 return权重的数字向量,与上面的源代码 link 中使用的语法相同。

编辑:我添加了适应度函数 fitreturns 数据以使其可重现。

我在回答我自己的问题。来自 CRAN 的 GA 未完全更新以反映此问题。 GA需要直接从GitHub下载。以下是相关命令:

install.packages(c("devtools","pkgbuild"))
library(pkgbuild)

devtools::install_github("luca-scr/GA",build_vignettes=T)