python - GEKKO 优化问题中的二元变量

标签 python optimization gekko

我有一个优化问题,其条件是如果变量值大于 0,则应用特定约束。

我尝试使用 m.if3 生成一个二进制值,如果变量值大于 0,则假定值为 1,但这不起作用,因为 m.if3 条件适用于大于或等于 0,我需要它严格大于 0。这是我使用 if3 的代码示例,但它不起作用。

x = m.Var(lb=0)
a = m.if3(x,0,1)
m.Equation(b - c == a*f ) #b,c,f are calculated values

我还尝试使用典型的 if 语句条件,但这不适用于 gekko 变量(下面的示例)。

if x>0:
   m.Equation(b - c == f )

还有其他方法可以应用此条件(严格大于零)吗?

最佳答案

if3(x,0,1) 对于所需的应用来说是正确的,但关闭或打开的条件两侧都应有 a*()方程的。或者,将所有表达式移至一侧,使其为:

m.Equation(a*(b-c-f)==0)

a=0时,0==0。这是演示解决方案的完整脚本。

from gekko import GEKKO
import numpy as np
m = GEKKO()

b = 0; c=1
f = m.Var()
x = m.Param(-1)
# binary variable (a=0 if x<0, a=1 otherwise)
a = m.if3(x,0,1)
# turn off condition when a==0
m.Equation(a*(b-c-f)==0)

# initialize with IPOPT (NLP solver)
m.options.SOLVER=3
m.solve(disp=False)

# Find integer solution with APOPT (MINLP solver)
m.options.SOLVER=1
m.solve(disp=True)

print(a.value[0])

这给出了a=0的解并且方程被停用。将 x = m.Param(-1) 更改为 x = m.Param(1) 以观察 a=1 的解决方案。

关于python - GEKKO 优化问题中的二元变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74133047/

相关文章:

python - 从 Azure 容器下载 blob 的最佳实践

arrays - 在 Julia 中将数组拆分为训练集和测试集的有效方法是什么?

java - 以 %.7f 格式创建时间戳字符串的更快方法

python - 将非空单元格移到分组列 pandas 的左侧

python - 索引 Pandas MultiIndex 时如何避免排序?

python - 如何根据条件为数据框的列分配值?

java - 我收到上述代码的超时错误。需要帮助来优化嵌套循环

python - 尝试使用 #gekko 最大化这个简单的非线性问题,但出现此错误

python - 在 GEKKO 中设置动态模拟的初始值和稳态结果