r - 如何在 R 中使用 GenSA 函数进行数学约束

标签 r optimization simulated-annealing

我目前正在尝试使用模拟退火包 GenSA 以最小化以下功能:

efficientFunction <- function(v) {
  t(v)  %*% Cov_Mat   %*%  v
 }

其中Cov_Mat是从4个 Assets 得到的协方差矩阵,v是4维的权重向量。

我正在尝试以这种方式解决 Markowitz Assets 分配方法,我想知道如何引入数学约束,例如所有系数的总和必须等于 1:

sum(v) = 1

此外,由于我打算依赖 GenSA 函数,所以我想在约束条件下使用类似这样的东西:

v <- c(0.25, 0.25, 0.25, 0.25)
dimension <- 4
lower <- rep(0, dimension)
upper <- rep(1, dimension)

out <- GenSA(v, lower = lower, upper = upper, fn = efficientFunction)

我在本文中找到:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.97.6091&rep=rep1&type=pdf 如何在模拟退火算法中处理此类约束,但我不知道如何在 R 中实现它。

如果有任何建议,我将不胜感激。这是我第一次使用 SO,如果我提出问题的方式有误,请随时告诉我。

最佳答案

一种可能的方法是使用所谓的拉格朗日乘数(参见 http://en.wikipedia.org/wiki/Lagrange_multiplier)。例如,设置

efficientFunction <- function(v) {
  lambda <- 100
  t(v)  %*% Cov_Mat   %*%  v + lambda * abs( sum(v) - 1 )
}

,这样为了最小化目标函数 efficientFunction,结果参数也最小化了惩罚项 lambda * abs( sum(v) - 1 )。拉格朗日乘数 lambda 设置为任意但足够高的水平。

关于r - 如何在 R 中使用 GenSA 函数进行数学约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23808693/

相关文章:

r - 如果索引列名是连接列名的前缀,Data.table join with index 会产生意外的结果

mysql - 优化和扩展 mysql 结构 + 大型邮件组的查询

algorithm - 在 C# 中为 0-1 背包编写模拟退火算法

Python 3 : Optimizing summation over scipy arrays

C++:访问特定八位字节的最快方法

java - 用于布局布线的模拟退火

python - 模拟退火 - 直觉

r - 修复 ggplot 中构面的顺序

r - 如何向现有类添加新插槽?

r - 如何使用饼图来使用facet_wrap?