问题描述
如果我将一个布尔变量初始化为 0,我会得到一个不正确的解决方案 (0)。如果我将它初始化为 1,我会得到正确的解决方案 (1)。
# Squaring doesn't work
#######################################################
m = GEKKO(remote=False)
b = m.Var(lb=0,ub=1,integer=True,value=0)
m.Maximize(b**2)
m.options.soLVER = 1
m.solve(debug=0,disp=True)
返回:
Successful solution
Objective: 0.
带有b: [0]
这是上一个问题 (Gekko returning incorrect successful solution) 的后续问题,该问题涉及一个模型,该模型涉及两个具有 gekko 整数变量的 gekko 数组的矩阵乘法。我相信我已经将这个问题追溯到了这个问题。
解决方法
试试这个:
from gekko import GEKKO
m = GEKKO()
b = m.Var(value=0,integer=True)
m.Equation(b>=0)
m.Equation(b<=1)
m.Maximize(b**2)
m.options.SOLVER = 1
m.solve(disp=False)
print(b.value)
输出:
[1.0]
查看 this colab 中的演示。
在 gekko examples 中,我看到 Obj()
(最小化)与 Equation()
一起使用,所以我想,也许变量的下限和上限可以表示为方程代替。显然,它是这样工作的。
APOPT
求解器是一种局部最小化器,它假设只有一个局部最小值。它也不检查二阶导数以区分 x=0
处的局部最小值和局部最大值。 Hernán Alarcón 给出了一个潜在的解决方案,其中也解决了不等式约束。这导致求解器不仅接受初始猜测作为解决方案,而且开始搜索并意识到存在更好的解决方案。至少还有两种其他方法可以找到正确的解决方案。
初始化为 x>=1e-3
不要在 x=0
处初始化,而是尝试将 x
初始化为任何不符合 KKT conditions 的值。
from gekko import GEKKO
m = GEKKO(remote=False)
b = m.Var(lb=0,ub=1,integer=True,value=1e-3)
m.Maximize(b**2)
m.options.SOLVER=1
m.solve(disp=False)
print(-m.options.OBJFCNVAL)
切换求解器
这是一个整数优化问题,但非线性规划 (NLP) 求解器(例如 IPOPT
)也可以使用 value=0
求解该问题。
from gekko import GEKKO
m = GEKKO(remote=False)
b = m.Var(lb=0,value=0)
m.Maximize(b**2)
m.options.SOLVER=3
m.solve(disp=False)
print(-m.options.OBJFCNVAL)