使用R中的nloptr不会更改初始值

Rya*_*ice 3 optimization r nonlinear-optimization

我几个月来一直在努力解决R中的优化问题.lpSolve由于幻想体育数据的例子,我终于想出了线性问题.然而,我的原始和(仍)当前问题是nloptr在R中使用等式约束尝试非线性优化.

我要做的是尽量减少两股票投资组合的差异,其中两只股票的回报几乎完全负相关(对于那些熟悉学术金融的人来说,最终目标是证明/反驳是否或没有套利机会).我希望最小化方差,取决于两个权重的总和正好等于1,同时在0和1之间.下面是我正在使用的确切代码,它应该很容易重现:

sd1 <- 0.01
sd2 <- 0.025
corr.lo <- -0.999

# Objective function
eval.f <- function(w) {
  return(
    (w[1]*sd1)^2 +
      (w[2]*sd2)^2 +
      (2*w[1]*w[2]*sd1*sd2*corr.lo)
  )
}

# Constraint function
eval.g <- function(w) {
  return(w[1] + w[2] - 1)
}

w0 <- c(0.5, 0.5)

opts <- list('algorithm' = 'NLOPT_GN_ISRES', 'xtol_rel' = 1.0e-8)

res <- nloptr(
  x0 = w0,
  eval_f = eval.f,
  lb = c(0,0),
  ub = c(1,1),
  eval_g_eq = eval.g,
  opts = opts
)
Run Code Online (Sandbox Code Playgroud)

优化运行没有错误,并生成以下内容:

> res

Call:
nloptr(x0 = w0, eval_f = eval.f, lb = c(0, 0), ub = c(1, 1),     eval_g_eq = eval.g, opts = opts)


Minimization using NLopt version 2.4.0 

NLopt solver status: 5 ( NLOPT_MAXEVAL_REACHED: Optimization stopped because maxeval (above) was reached. )

Number of Iterations....: 100 
Termination conditions:  xtol_rel: 1e-08 
Number of inequality constraints:  0 
Number of equality constraints:    1 
Current value of objective function:  0.000125508655202602 
Current value of controls: 0.5 0.5
Run Code Online (Sandbox Code Playgroud)

我正在使用上面的算法,因为那是在没有告诉我需要渐变(我不熟悉)的情况下运行的算法.问题是,w0DO 的初始值不会从50%变化.任何人都可以重现这个并提供建议,或者试着指出我正确的方向吗?

提前致谢!

Rya*_*ice 6

我找到了答案我自己的问题.我想,优化运行时间不够长.通过maxeval = 1000000opts列表中指定,我得到了满足约束条件的答案.