繁体   English   中英

平方 Gekko Integer 变量时的错误解决方案

[英]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 变量的矩阵乘法。 我相信我已经将这个问题追溯到这个问题。

尝试这个:

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)

Output:

[1.0]

这个 colab中查看演示。

gekko 示例中,我看到Obj() (最小化)与Equation()一起使用,所以我想,也许变量的下限和上限可以用方程式表示。 显然,它是这样工作的。

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.

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