首页 > 解决方案 > 在 R 中设置非线性优化

问题描述

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

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

标签: roptimizationnonlinear-optimization

解决方案


只需将 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


推荐阅读