如何用Python Gekko解决Absolute Value abs()目标



一个具有平方目标的优化问题在PythonGekko中使用IPOPT成功解决。

from gekko import GEKKO
import numpy as np
m = GEKKO()
x = m.Var(); y = m.Param(3.2)
m.Obj((x-y)**2)
m.solve()
print(x.value[0],y.value[0])

然而,当我切换到绝对值目标np.abs(x-y)(abs的numpy版本(或m.abs(x-y)(abs的Gekko版本(时,IPOPT解算器会报告一个失败的解决方案。绝对值近似CCD_ 5也失败。

失败的解决方案

from gekko import GEKKO
import numpy as np
m = GEKKO()
x = m.Var(); y = m.Param(3.2)
m.Obj(m.abs(x-y))
m.solve()
print(x.value[0],y.value[0])

我知道基于梯度的解算器不喜欢没有连续一阶和二阶导数的函数,所以我怀疑abs()会发生这种情况,其中0是一个没有连续导数的点。有没有abs()的替代方案可以在PythonGekko中使用基于梯度的解算器可靠地求解绝对值?

您可以使用m.abs2,它考虑到了导数的问题,应该可以解决这个问题。

这里有一个使用gekko的二进制开关变量的可能解决方案:

from gekko import GEKKO
import numpy as np
m = GEKKO()
y = m.Param(3.2)
x = m.Var()
#intermediate
difference = m.Intermediate(x - y)
f = m.if3(difference, -difference, difference)
m.Obj(f)
m.solve()
print(x.value[0],y.value[0])

退货:3.2 3.2

m.if3(condition, x1, x2)以值为条件,如果condition >= 0,则返回x1;如果condition < 0,返回x1

在文档的逻辑函数部分中,有各种函数可以解决这个问题,包括m.abs2m.abs3m.if2

类型2函数使用MPCC来解决,并将继续使用IPOPT。类型3功能将自动更改为APOPT。

https://github.com/BYU-PRISM/GEKKO/blob/master/docs/model_methods.rsthttps://gekko.readthedocs.io/en/latest/model_methods.html#logical-功能

最新更新