在NLOPTR的ISRES算法

时间:2016-07-19 05:43:06

标签: r mathematical-optimization nonlinear-optimization nlopt

我将NLOPTR的ISRES算法应用于具有不等式约束的非线性问题时陷入困境。我这样制定了它:

library(nloptr)
fn <- function(x) {
(x[1]-10)^2 + 5*(x[2]-12)^2 + x[3]^4 + 3*(x[4]-11)^2 + 10*x[5]^6 + 7*x[6]^2 + x[7]^4 - 4*x[6]*x[7] - 10*x[6] - 8*x[7]
}

hin <- function(x) {
h <- numeric(4)
h[1] <- 127 - 2*x[1]^2 - 3*x[2]^4 - x[3] - 4*x[4]^2 - 5*x[5]
h[2] <- 282 - 7*x[1] - 3*x[2] - 10*x[3]^2 - x[4] + x[5]
h[3] <- 196 - 23*x[1] - x[2]^2 - 6*x[6]^2 + 8*x[7]
h[4] <- -4*x[1]^2 - x[2]^2 + 3*x[1]*x[2] -2*x[3]^2 - 5*x[6] +11*x[7]
return(h)
}

x0 <- c(1, 2, 0, 4, 0, 1, 1)

isres(x0 = x0, fn = fn, hin = hin)

我收到一条消息,上面写着“匹配错误(hin):缺少参数”表“,没有默认值”

我想我不会对不平等约束做些正确的事情。你能告诉我怎么解决这个问题吗?非常感谢!

1 个答案:

答案 0 :(得分:2)

这不是一个真正的答案。但我目前无法发表评论。

我认为问题是你的约束,而是函数isres。如果您查看函数的代码(只需在控制台中输入isres),开头看起来像这样:

function (x0, fn, lower, upper, hin = NULL, heq = NULL, maxeval = 10000, 
          pop.size = 20 * (length(x0) + 1), xtol_rel = 1e-06, nl.info = FALSE, 
          ...) 
{
  opts <- list()
  opts$maxeval <- maxeval
  opts$xtol_rel <- xtol_rel
  opts$population <- pop.size
  opts$algorithm <- "NLOPT_GN_ISRES"
  fun <- match.fun(fn)
  fn <- function(x) fun(x, ...)
  if (!is.null(hin)) {
    .hin <- match(hin)
    hin <- function(x) (-1) * .hin(x)
  } 
...

现在,请注意第.hin <- match(hin)行。匹配函数是基础R,并且在执行x时应该采用两个参数,即:tablex %in% table(在{{1}中检查?match有关更多信息的文档)。但是,R没有为函数提供表。

据了解,您有3个选项可以解决您的问题:

  • (I)直接使用isres算法nloptr
  • (II)包裹的mantainer告诉我,这个bug可能已经知道了。因此,如果您使用github上的开发包而不是CRAN版本,则可能很好。 请注意,该程序包未在我的计算机上编译
  • (III)等到bug修复完毕。这应该很快,因为他们现在知道这个问题。