首页 > 解决方案 > 在 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<-".

有人知道这个(包)吗?

标签: roptimizationconstraintsgenetic-algorithmportfolio

解决方案


推荐阅读