如何使用Python Gekko解决IPOPT中的本地不可行问题?

时间:2019-10-27 04:20:15

标签: python mathematical-optimization ipopt gekko

我在IPOPT(v3.12.10)中收到本地不可行错误。

Converged to a point of local infeasibility. Problem may be infeasible.

我还使用m.options.SOLVER=1在APOPT求解器中进行了尝试,并得到了类似的错误。

No feasible solution

有两个方程和三个变量,对此问题有多种可行的解决方案。解决这个问题的方法是平面与球体相交。

from gekko import GEKKO
m = GEKKO()
x=m.Var(); y=m.Var(); z=m.Var()
m.Equations([x**2+y**2+z**2==1,x+z==y])
m.options.SOLVER = 3 # APOPT=1, IPOPT=3
m.solve(debug=0) # debug=0 doesn't stop when unsuccessful
print('Solution 1')
print(x.value[0],y.value[0],z.value[0])

当我添加一个目标函数以最大化z时,IPOPT收敛为一个解决方案。

# add objective
m.Obj(-z) # maximize z
m.solve()
print('Solution 2')
print(x.value[0],y.value[0],z.value[0])

如何在不添加目标函数的情况下避免失败的解决方案?

1 个答案:

答案 0 :(得分:2)

x=0y=0z=0的起点需要不同的初始猜测才能收敛到解决方案。

x=m.Var(0.01); y=m.Var(); z=m.Var()

因为存在许多解,所以将使用不同的初始猜测值获得不同的解。您尝试过m.Obj(-z)的目标函数可以提高收敛性,并使解决方案独一无二。

GEKKO中的所有解决方案选项都是基于梯度的非线性规划求解器,包括APOPT,BPOPT,IPOPT等。所有这些求解器都会产生只能保证为局部最小值或最大值的解决方案。他们都使用Karush-Kuhn-Tucker conditions来确定何时找到最佳解决方案。通过从x=0y=0z=0开始,满足第二个KKT条件(无可行下降),但不满足第一个条件(可行约束)。这会导致您在求解器报告本地不可行时观察到的错误。该点也称为固定点,其中函数的导数为零。