在 NLOPTR 的 ISRES 算法中制定不等式约束
Formulating inequality constraints in NLOPTR's ISRES algorithm
我在将 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)
我收到一条消息说 "Error in match(hin): argument "table" 丢失,没有默认值"
我想我在不等式约束下做得不对。你能告诉我如何解决这个问题吗?非常感谢!
这不是真正的答案。但我目前无法发表评论。
我认为问题是不是你的约束而是函数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
和 table
因为它执行 x %in% table
(检查 [=14= 中的 ?match
] 文档以获取更多信息)。但是,isres
没有向函数提供 table。
目前知道您有 3 个选项来解决您的问题:
- (一)直接用
nloptr
算法"NLOPT_GN_ISRES"
。
- (II) 包的维护者告诉我这个bug可能是众所周知的。因此,如果您使用 github 上的开发包而不是 CRAN 版本,您可能没问题。 请注意,该软件包未在我的计算机上编译
- (三)等bug修复。这应该很快,因为他们现在知道这个问题了。
我在将 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)
我收到一条消息说 "Error in match(hin): argument "table" 丢失,没有默认值"
我想我在不等式约束下做得不对。你能告诉我如何解决这个问题吗?非常感谢!
这不是真正的答案。但我目前无法发表评论。
我认为问题是不是你的约束而是函数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
和 table
因为它执行 x %in% table
(检查 [=14= 中的 ?match
] 文档以获取更多信息)。但是,isres
没有向函数提供 table。
目前知道您有 3 个选项来解决您的问题:
- (一)直接用
nloptr
算法"NLOPT_GN_ISRES"
。 - (II) 包的维护者告诉我这个bug可能是众所周知的。因此,如果您使用 github 上的开发包而不是 CRAN 版本,您可能没问题。 请注意,该软件包未在我的计算机上编译
- (三)等bug修复。这应该很快,因为他们现在知道这个问题了。