【问题标题】:Why does the function `GenSA` not honor lower bounds for components?为什么函数 `GenSA` 不遵守组件的下限?
【发布时间】:2019-05-21 12:11:46
【问题描述】:

引用the official documentation of the GenSA function from the GenSA package from CRAN:

用法

GenSA(par, fn, lower, upper, control=list(), ...)

参数

  • par 向量。组件的初始值 优化。默认为NULL,在这种情况下,默认值为 自动生成。
  • fn要最小化的函数,首先 argument 最小化的参数向量 地方。它应该返回一个标量结果。
  • lower 长度为par 的向量。 组件的下限。
  • upper 长度为par 的向量。上 组件的界限。

很好。因此,如果我理解正确,传递给fn 的参数永远不应低于或高于我在lowerhigher 中指定的范围。

好像不是这样的:

library(GenSA)

GenSA(c(1.0/90, 1.0, 0.02), function(args){
  arg1 = args[1]; arg2 = args[2]; arg3 = args[3]
  print(args)
  if(arg2 <= 0) stop("WTF")
  0
}, lower=c(0, 1.0, 0), upper=c(Inf, Inf, 0.4))

运行这段代码的结果是不可原谅的:

[1] 0.01111111 1.00000000 0.02000000
[1] 0.0000000 0.0000000 0.2891973
Error in fn(par, ...) : WTF
Calls: GenSA -> <Anonymous> -> fn
Execution halted

为什么GenSA 调用我的函数时第二个组件等于0.0?我以为我说的很清楚:lower=c(0, 1.0, 0)

我是不是误会了什么?我的错误是什么?如何强制它正常工作?

【问题讨论】:

    标签: r parameters simulated-annealing


    【解决方案1】:

    罪魁祸首:

    upper=c(Inf, Inf, 0.4)
    

    删除Infs 并将其设置为upper=c(100, 100, 0.4),下界似乎终于得到尊重。

    不知道为什么。

    【讨论】:

      猜你喜欢
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      相关资源
      最近更新 更多