r - 在 R 中使用 NSGA-II 进行约束优化
问题描述
我使用在 R 中运行的 NSGA-II 进行了一些优化,以构建权重总和为 1 的金融投资组合。我的问题在于我无法有效地设置约束。我曾经通过在目标函数中使用惩罚来实现约束,但这不起作用,因为我最终无法分析获得的目标。虽然我获得了不错的结果(参数/权重),但目标完全受到惩罚的影响。
作为示例,我为您提供了简单的均值方差优化问题,但碰巧我优化了多达 4 个目标,以类似的方式说明。
library(nsga2r)
fitness_meanvar <- function(x){ #max mean, min var
weight_stock <- x
f1 <- numeric()
for (i in 1:6) {
f1[i] <- weight_stock[i]*factors_mean[i]
}
mean_return <- sum(f1)-1e12*(round(sum(weight_stock),10)-1)^2
f2 <- numeric()
for (i in 1:6) {
f3 <- numeric()
for (j in 1:6) {
f3[j] <- weight_stock[i]*weight_stock[j]*factors_cov[i,j]
}
f2[i] <- sum(f3)
}
risk <- sum(f2)+1e12*(round(sum(weight_stock),10)-1)^2
return(c(-mean_return, risk))
}
meanvar_optim <- nsga2R(fn = fitness_meanvar, varNo = n_asset, objDim = 2, generations = genn,
mprob = mutp, popSize = popn, cprob = crossp,
lowerBounds = rep(0, n_asset), upperBounds = rep(1, n_asset))
如果不明显,1:6
是指资产/参数的数量,factors_mean
是包含六个变量的平均收益的 6 维向量,是变量factors_cov
的 6x6 协方差矩阵。
有关更多详细信息,这是我学习此技术的链接:https ://rpubs.com/Argaadya/moea
我想做的是消除1e12*(round(sum(weight_stock),10)-1)^2
目标中的惩罚±但仍然保持权重总和等于1。我尝试在适应度函数中添加一行 sum(weight_stock)=1 但是在运行优化函数时nsga2r
,我得到: Error in sum(x) <- 1 : couldn't find the function "sum<-"
.
有人知道这个(包)吗?