【问题标题】:R solnp (package Rsolnp) fails to respect upper boundsR solnp(包 Rsolnp)未能遵守上限
【发布时间】:2019-01-15 21:53:43
【问题描述】:

使用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 的手册指出控制control = list(rho = ) 中的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)

【问题讨论】:

    标签: r optimization


    【解决方案1】:

    all.equal 将在测试时使用容差 平等。大致而言,xyabs(x - y) &lt; tolerance 时相等。所以你可以只测试parm &lt;= 1 + tolerance,用tolerance一个小数字,比如1e-6

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2023-03-05
      • 2021-01-08
      相关资源
      最近更新 更多