[英]Incorrect Solution When Squaring Gekko Integer Variables
如果我将 boolean 变量初始化为 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 返回不正确的成功解决方案)的后续问题,该问题涉及 model 涉及两个 gekko arrays 与 gekko Z157DB7DF530023575515D366C9B67E 变量的矩阵乘法。 我相信我已经将这个问题追溯到这个问题。
APOPT
求解器是一个局部最小化器,它假设只有一个局部最小值。 它也没有检查二阶导数以区分x=0
处的局部最小值和局部最大值。 Hernán Alarcón 给出了一个潜在的解决方案,其中也解决了不平等约束。 这导致求解器不仅接受初始猜测作为解决方案,而且开始搜索并意识到存在更好的解决方案。 至少有两种其他方法可以找到正确的解决方案。
用 x>=1e-3 初始化
不要在x=0
处初始化,而是尝试将x
初始化为不满足KKT 条件的任何值。
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)
开关求解器
这是一个 integer 优化问题,但非线性规划 (NLP) 求解器(例如IPOPT
)也可以解决value=0
的问题。
from gekko import GEKKO
m = GEKKO(remote=False)
b = m.Var(lb=0,ub=1,integer=True, value=0)
m.Maximize(b**2)
m.options.SOLVER=3
m.solve(disp=False)
print(-m.options.OBJFCNVAL)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.