从 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 中使用的语法相同。
编辑:我添加了适应度函数 fit
和 returns
数据以使其可重现。
我在回答我自己的问题。来自 CRAN 的 GA
未完全更新以反映此问题。 GA
需要直接从GitHub下载。以下是相关命令:
install.packages(c("devtools","pkgbuild"))
library(pkgbuild)
devtools::install_github("luca-scr/GA",build_vignettes=T)
我正在使用 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 中使用的语法相同。
编辑:我添加了适应度函数 fit
和 returns
数据以使其可重现。
我在回答我自己的问题。来自 CRAN 的 GA
未完全更新以反映此问题。 GA
需要直接从GitHub下载。以下是相关命令:
install.packages(c("devtools","pkgbuild"))
library(pkgbuild)
devtools::install_github("luca-scr/GA",build_vignettes=T)