我有一个优化问题,其条件是如果变量值大于 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/