【问题标题】:Nonlinear optimization: why am I getting different results when I use DEoptim?非线性优化:为什么我在使用 DEoptim 时会得到不同的结果?
【发布时间】:2019-09-23 14:09:21
【问题描述】:

例如,如果我在APMonitor Modeling Language上使用下面的代码

 Variables
   x2 >=0, <=100
   x3 >=0, <=100
 End Variables

 Equations
   x2>=0
   x3>=0

   ! best known objective = 
   minimize ((0.5-x2)/(0.5-x2+x3))/0.3
 End Equations
End Model

我明白了:

    Successful Solution
    Objective Value = 3.33333333
Name    Lower   Value   Upper
ss.x2   0.0000E+00  1.4333E+01  1.0000E+02
ss.x3   0.0000E+00  0.0000E+00  1.0000E+02
ss.slk_1    0.0000E+00  0.0000E+00  ---

但是当我尝试在 R 中使用 DEoptim 进行相同的优化时

f<- function(x){
x2 <- x[2]    #should be x[1]
x3 <- x[3]    #should be x[2]
(((0.5-x2)/(0.5-x2+x3))/0.2)  #note the minor but inconsequential difference
}

set.seed(1234)
DEoptim(f, lower = c(0,0), upper = c(100,100), DEoptim.control(NP = 100))
outDEoptim <- DEoptim(f, lower = c(0,0), upper = c(100,100),DEoptim.control(trace = TRUE, NP = 80,
itermax = 1000, F = 1.2, CR = 0.7))
plot(outDEoptim)
outDEoptim

我得到了非常不同和奇怪的结果:

$`optim`
$`optim`$`bestmem`
    par1     par2 
46.57015 46.07015 

$`optim`$bestval
[1] -Inf

$`optim`$nfeval
[1] 330

$`optim`$iter
[1] 164

显然,我缺少一些东西。提前感谢您的帮助。

【问题讨论】:

  • APmodeling 结果显然是错误的(或者可能解决了不同的问题?)目标显然没有在该组值处最小化,而 DEoptim 确实找到了一个无限可能的最小值。
  • 有一个关于优化的 CRAN 任务视图。
  • 非常有帮助。谢谢!

标签: r function optimization mathematical-optimization nonlinear-optimization


【解决方案1】:

考虑;

x2=0
x3=0
((0.5-x2)/(0.5-x2+x3))
#[1] 1
x2=0.9367799;x3= 0.4367799
((0.5-x2)/(0.5-x2+x3))
[#1] -Inf

也许您应该在允许的域空间中查看该目标的值网格。 ISTR 认为 Rosenbrock 函数有点像“香蕉”形状:https://en.wikipedia.org/wiki/Rosenbrock_function。看起来不像 Rosenbrock 函数。对于修改后的函数,DEoptim 在(5-x2+x3) == 0 时找到了一个解决方案,x2-x3==0.5 的任何时候都是如此,并且在一条直线上存在无限多个这样的所有。

x2= seq(0,0.9999,len=10)
x3= seq(0,0.9999,len=10)
round(outer(x2,x3, FUN=function(x2,x3) {(0.5-x2)/(0.5-x2+x3)} ) ,2)
#----------------------------------------
      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9] [,10]
 [1,]    1  0.82  0.69  0.60  0.53  0.47  0.43  0.39  0.36  0.33
 [2,]    1  0.78  0.64  0.54  0.47  0.41  0.37  0.33  0.30  0.28
 [3,]    1  0.71  0.56  0.45  0.38  0.33  0.29  0.26  0.24  0.22
 [4,]    1  0.60  0.43  0.33  0.27  0.23  0.20  0.18  0.16  0.14
 [5,]    1  0.33  0.20  0.14  0.11  0.09  0.08  0.07  0.06  0.05
 [6,]    1 -1.00 -0.33 -0.20 -0.14 -0.11 -0.09 -0.08 -0.07 -0.06
 [7,]    1  3.00 -3.00 -1.00 -0.60 -0.43 -0.33 -0.27 -0.23 -0.20
 [8,]    1  1.67  5.00 -4.99 -1.67 -1.00 -0.71 -0.56 -0.45 -0.38
 [9,]    1  1.40  2.33  7.01 -6.99 -2.33 -1.40 -1.00 -0.78 -0.64
[10,]    1  1.29  1.80  3.00  9.01 -8.99 -3.00 -1.80 -1.29 -1.00

我认为“最知名的目标”这个短语的某些方面可能我完全不知道,如果是这样,我猜 DEoptim 也没有被告知该知识。

【讨论】:

  • 谢谢,汉斯。我知道这是您的专业领域,我建议任何查看此内容的人听从您的建议。您不认为跨域创建网格不会提供信息吗?
  • 同意 Hans W 的 cmets。您的 f-function 代码也不正确。只有 2 个参数,因此要求 x[3] 应该会引发错误。任何时候 (0.5-x2+x3)==0 都会被零除。并且会有无数这样的例子。同样,您应该使用outer 或循环来大致了解函数的行为。
  • 我同意关于我的目标函数提出的观点。然而,这只是一个测试目标函数,可以轻松地可视化我面临的问题。是的 - 我应该想出一个更好的测试目标函数。尽管如此,在看到这个帖子stackoverflow.com/questions/48037805/… 之后,我已经能够解决我的问题了。另外,感谢@42- 提出网格的想法。这对解决我的问题非常有帮助。问候。
猜你喜欢
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
相关资源
最近更新 更多