微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对 Gekko 整数变量求平方时的错误解决方案

如何解决对 Gekko 整数变量求平方时的错误解决方案

如果我将一个布尔变量初始化为 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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。