具有应满足的约束的 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. 不使用附加方程求解,然后添加它并再次求解。
- 用
BPOPT
用NLP初始化,用APOPT
求解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()
- 不用等式初始化
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()
我是 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. 不使用附加方程求解,然后添加它并再次求解。
- 用
BPOPT
用NLP初始化,用APOPT
求解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()
- 不用等式初始化
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()