繁体   English   中英

如何用 Python Gekko 解决绝对值 abs() 目标?

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

在 Python Gekko 中使用 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(xy)abs的 numpy 版本)或m.abs(xy)abs的 Gekko 版本)时,IPOPT 求解器报告失败的解决方案。 绝对值近似m.sqrt((xy)**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])

回报:3.2 3.2

m.if3(condition, x1, x2)将 value 作为条件,如果condition >= 0则返回x1 ,如果condition < 0则返回x1

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM