使用solnp()
进行的优化不遵守参数UB = 1
指定的上限。这可能是一个浮点问题,但是我不知道如果我的客观乐趣涉及不平等检查,我该如何解决。
问题:我有一个复杂的目标函数,就其性质而言,它包含一个错误检查。我用solbp优化。我无法删除错误检查parm > bound
。我该怎么做才能使优化运行?
编辑:下面的示例已简化以展示该错误。我无法删除不平等检查,该检查将始终是目标函数的一部分(此处为minimizeit()
)。但是,我可以为函数的错误检查添加公差。
工作示例
library(Rsolnp)
set.seed(123)
x <- 2 * 1:10 + runif(10) / 10 # criterion
# Objective function
minimizeit <- function(parm, x) {
if (parm > 1) { # checks if the parameter is <= 1
stop("Argument parm is ", parm)
}
return(mean( (parm * 1:10 - x)^2 ))
}
# Run the optimization
solnp(0.5, minimizeit, LB = 0, UB = 1, x = x)
# the UB=1 means an upper bound of 1 on the parameter space
错误消息:
# Error in fun(pars, ...) : Argument parm is 1.00000004472127
# Clearly larger than 1 ...
Rsolnp的手册指出,控件rho
中的control = list(rho = )
参数控制边界的尊重程度。但是设置rho = 10
仍然会导致相同的错误。
使用all.equal()
解决数字问题的常用方法不适用于不等式。
会话信息
sessionInfo()
# R version 3.5.0 (2018-04-23)
# Platform: x86_64-w64-mingw32/x64 (64-bit)
# Running under: Windows 10 x64 (build 16299)
答案 0 :(得分:0)
all.equal
在测试以下内容时会使用公差
平等。如果x
,则y
和abs(x - y) < tolerance
大致相等。因此,您可以只测试parm <= 1 + tolerance
,并使用tolerance
这样的小数字,例如1e-6
。