[英]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.abs2
、 m.abs3
和m.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.