具有应满足的约束的 Gekko 不可行解

Gekko infeasible solution with costraint that should be satisfied

我是 gekko 和 APM 的新手,我正在尝试解决一个问题,但解决方案似乎变得不可行,因为二进制变量中的新方程应该是可行的。这是简化的 APM 模型:

Model
Variables
    int_v1 = 0, >= 0
    int_v2 = 0, <= 1, >= 0
    v3 = 0
    v4 = 0
    v5 = 0
    v6 = 0
End Variables
Equations
    (0+int_v1)>=100
    v3=((3.15)*(int_v1))
    v4>=((int_v2)*(300))
    v5=(0+((int_v1)*(3.15)))
    minimize v6
End Equations
Connections
    v3 = sum_1.x[1]
    v4 = sum_1.y
    v5 = sum_2.x[1]
    v6 = sum_2.y
End Connections
Objects
    sum_1 = sum(1)
    sum_2 = sum(1)
End Objects
End Model

http://apmonitor.com/online/view_pass.php 中解决此问题将给出 int_v2 = 1 的解决方案。但是如果我在 v4 之后添加以下等式到问题中,它表示找不到解决方案:

(((1-int_v2))*(v4))=0

我查看了不可行性文件,但云没有掌握问题所在。由于上面的解决方案给出 int_v2 = 1 那么这个等式应该始终为 0 = 0。感谢任何指导。

附加方程添加了一个平稳点(例如 x*y=0),这可能很难求解。对于您的优化问题,求解器 APOPT 和 IPOPT 都错误地报告问题不可行。然而,BPOPT 求解器能够解决 NLP 问题,但不一定是整数解。您发布了 Gekko 问题的 APM 文件。这是你在 Gekko 中的问题(没有附加方程):

from gekko import GEKKO

m = GEKKO(remote=False)
v1 = m.Var(0,lb=0,integer=True)
v2 = m.Var(0,lb=0,ub=1,integer=True)
v3 = m.Var(0); v5 = m.Var(0)
v4 = m.sum([v3]); v6 = m.sum([v5])

m.Equation(v1>=100)
m.Equation(v3==3.15*v1)
m.Equation(v4>=v2*300)
m.Equation(v5==v1*3.15)
m.Minimize(v6)

这里有两种方法:1. 使用 BPOPT 初始化,然后切换到 APOPT 以获得整数解,以及 2. 不使用附加方程求解,然后添加它并再次求解。

  1. BPOPT用NLP初始化,用APOPT
  2. 求解MINLP
from gekko import GEKKO

m = GEKKO(remote=False)
v1 = m.Var(0,lb=0,integer=True)
v2 = m.Var(0,lb=0,ub=1,integer=True)
v3 = m.Var(0); v5 = m.Var(0)
v4 = m.sum([v3]); v6 = m.sum([v5])

m.Equation(v1>=100)
m.Equation(v3==3.15*v1)
m.Equation(v4>=v2*300)
m.Equation(v5==v1*3.15)
m.Minimize(v6)

m.Equation((1-v2)*v4==0)

m.options.SOLVER=2 # solve with BPOPT
m.solve()

m.options.SOLVER=1 # solve with APOPT
m.solve()
  1. 不用等式初始化
from gekko import GEKKO

m = GEKKO(remote=False)
v1 = m.Var(0,lb=0,integer=True)
v2 = m.Var(0,lb=0,ub=1,integer=True)
v3 = m.Var(0); v5 = m.Var(0)
v4 = m.sum([v3]); v6 = m.sum([v5])

m.Equation(v1>=100)
m.Equation(v3==3.15*v1)
m.Equation(v4>=v2*300)
m.Equation(v5==v1*3.15)
m.Minimize(v6)

# solve without equation
m.options.SOLVER=1
m.solve()

# add infeasible equation and solve
m.Equation((1-v2)*v4==0)
m.solve()

您可以打开 运行 文件夹查看 APM 文件与您问题中的文件相似。

# open folder to view apm file
#   or optionally the infeasibilities.txt file
m.open_folder()