如何用 Python Gekko 求解绝对值 abs() objective?

How to solve Absolute Value abs() objective with Python Gekko?

在 Python Gekko 中使用 IPOPT 成功解决了平方 objective 的优化问题。

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])

但是,当我切换到绝对值时 objective np.abs(x-y)abs 的 numpy 版本)或 m.abs(x-y)([=15= 的 Gekko 版本) ]), IPOPT 求解器报告一个失败的解决方案。绝对值近似 m.sqrt((x-y)**2) 也失败了。

解决方案失败

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 是一个没有连续的点衍生品。在 Python Gekko 中,是否可以使用基于梯度的求解器可靠地求解绝对值 abs()

你可以改用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])

Returns: 3.2 3.2

m.if3(condition, x1, x2)以value为条件,returnsx1ifcondition >= 0x1ifcondition < 0

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

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

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