我尝试使用R中的函数donlp2来解决非线性优化问题。我的目标是找出以下函数的最大值:
442.8658*(x1+1)^(0.008752747)*(y1+1)^(0.555782)+(x2+1)^(0.008752747)*(y2+1)^(0.555782)
没有非线性约束。线性约束如下:
x1+x2<=20000;
y1+y2<=20000;
x1<=4662.41;
x2<=149339;
y1<=14013.94;
y2<=1342738;
x1>=0;
x2>=0;
y1>=0;
y2>=0;
以下是我的代码:
p <- c(rep(0,4))
par.l <- c(rep(0,4))
par.u <- c(4662.41, 149339, 14013.94, 1342738)
fn <- function(par){
x1 <- par[1]; y1<-par[3]
x2 <- par[2]; y2<-par[4]
y <- 1 / (442.8658*(x1+1)^(0.008752747)*(y1+1)^(0.555782)
+ (x2+1)^(0.008752747)*(y2+1)^(0.555782))
}
A <- matrix(c(rep(c(1,0),2), rep(c(0,1),2)), nrow=2)
lin.l <- c(-Inf, 20000)
lin.u <- c(-Inf, 20000)
ret <- donlp2(p, fn, par.u=par.u, par.l=par.l, A=A, lin.l=lin.l, lin.u=lin.u)
我搜索并发现一些相关帖子说donlp2只能找到函数的最小值,这就是我在目标函数中得到倒数的原因。
代码运行正常,但我对结果有顾虑,因为我可以很容易地找到可以给我更大结果的其他值,即目标函数的最小化是不正确的。
我还发现当我改变初始值或x1,x2,y1,y2的下限时,结果会发生显着变化。例如,如果我设置p = c(rep(0,4)),par.l&lt; -c(rep(1,4))而不是p = c(rep(0,4)),par.l&lt; -c(rep(0,4)),结果将从
改变$par
[1] 2.410409e+00 5.442753e-03 1.000000e+04 1.000000e+04
到
$par
[1] 2331.748 74670.025 3180.113 16819.887
有什么想法吗?感谢您的建议和帮助!