【问题标题】:Setting up non-linear optimization in R在 R 中设置非线性优化
【发布时间】:2020-06-14 23:20:26
【问题描述】:

我有一个函数可以根据输入计算模型的“值”。

ModelValue <- function(x, y, z) {
#long, most likely non-linear stuff
return(Value)}

x 是一个介于 0-1 之间的数字,并且根据我正在测试的模型固定。即,x 恰好是 0.56。

y 和 z 是我想要优化以最大化价值的 4 个阈值组。

y=c(pa, pb, pc, pd) and z=c(ta, tb, tc, td), subject to:
all are => 0.001,
all are =<0.997,
pa + pb + pc + pd == 1; and
ta + tb + tc + td == 1

我尝试过查看 optimx 和 spg; (这是我所能得到的)但无论我做什么,我似乎都无法创建一个优化函数,只要我尝试提及 pa、pb、pc 等,我就不会感到害怕。我没有不明白如何告诉模型要优化哪些变量...

OptimizeModel <- function(x) {
p0=1 #initial guess
fn = ModelValue(x, y, z)

lo <- c(0.001, 0.001, 0.001, 0.001,
          0.001, 0.001, 0.001, 0.001) # lower limits for parameters
hi <- c(0.997, 0.997, 0.997, 0.997,
          0.997, 0.997, 0.997, 0.997)  # upper limits for parameters

y<- c(pa, pb, pc, pd)
z<- c(ta, tb, tc, td)
pa + pb + pc + pd = 1
ta + tb + tc + td = 1
# pa > 0.001
# pb > 0.001 
# pc > 0.001 
# pd > 0.001 
# ta > 0.001 
# tb > 0.001 
# tc > 0.001 
# td > 0.001 

ans1 <- spg(par=p0,
            fn=fn,
            lower=lo,
            upper=hi,
            control=list(maximize=TRUE, trace=FALSE))

return (ans1)  
}

当我尝试时:

OptimizeModel(0.56)
#Error in OptimizeModel(0.56) : object 'pa' not found

【问题讨论】:

    标签: r optimization nonlinear-optimization


    【解决方案1】:

    只需将 pa,pb,pc 传递给 spg 并在函数评估中使用它们。 spg 的文档显示了这样做的示例:

    valley.f <- function(x, cons) {
    ...}
    

    这里x 是决策变量,cons 是额外数据(常量)。

    对 spg 的调用如下所示:

    ans.spg2 <- spg(par=p0, fn=valley.f, cons=k, method=2)  
    

    您看到cons=k 已指定。此参数不适用于spg 本身,而是传递给函数评估(和梯度评估)函数。你需要对 pa,pb,pc 做同样的事情。

    见:https://www.rdocumentation.org/packages/BB/versions/2019.10-1/topics/spg

    【讨论】:

    • 不幸的是,我花了几个小时试图按照示例进行操作,但仍然不明白如何将其应用于我的情况。
    • 那是可悲的。这并不复杂,例子也很好。
    • 感谢您的反馈。
    猜你喜欢
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多