首页 > 解决方案 > 为什么函数 `GenSA` 不遵守组件的下限?

问题描述

从 CRAN 的包中引用函数的官方文档GenSAGenSA

用法

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

论据

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

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

情况似乎并非如此:

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)

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

标签: rparameterssimulated-annealing

解决方案


罪魁祸首:

upper=c(Inf, Inf, 0.4)

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

不知道为什么。


推荐阅读