我是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时应始终为真。请理解任何指导。
答案 0 :(得分:3)
该附加方程式增加了一个平稳点(例如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()