运行代码并使用m.open_folder() 打开运行文件夹会显示gk_model0.apm 文件,APMonitor 使用该文件将问题编译为字节码以供解决。
Model
Variables
int_v1 = 0.01, <= 1, >= 0
int_v2 = 0.01, <= 1, >= 0
v3 = 0, <= 5, >= 1
int_v4 = 0.01, <= 1, >= 0
int_v5 = 0.01, <= 1, >= 0
v6 = 0, <= 5, >= 1
End Variables
Intermediates
i0=((0+((1)*(int_v1)))+((2)*(int_v2)))
i1=((0+((1)*(int_v4)))+((2)*(int_v5)))
End Intermediates
Equations
((0+int_v1)+int_v2)=1
v3=i0
((0+int_v4)+int_v5)=1
v6=i1
False
minimize 1
End Equations
End Model
最后一个约束和目标函数的定义方式有问题。
False
minimize 1
另外一些建议是使用整数变量而不是m.sos1() 函数。 m.sos1() 函数在变量是离散但不是整数时使用。替换:
integer=[1,2]
x=[m.sos1(integer) for i in range(len(integer))]
为了更有效的实施,请使用以下内容:
x = m.Array(m.Var,2,lb=1,ub=2,integer=True)
x[i] = ig[i] 将变量 x 的类型从 Gekko 类型更改为整数。请改用x[i].value = ig[i] 来更新初始猜测。根据上面的陈述,x 的上限应该是2,而不是5?可以使用lb=1,ub=2 在变量初始化时设置下限和上限。
函数obj 和con 仅在问题初始化时评估一次,因此目录查找不会随着x 的值的变化而更新。查找值的另一种方法是将 x 乘以 5 以获得查找值。 <2 的约束给出了一个不可行的解决方案,因此我将其更改为 <1000 以使其可行。这是您的原始问题的修改版本,已成功解决。
from gekko import GEKKO
import pandas as pd
m = GEKKO()
x = m.Array(m.Var,2,lb=1,ub=2,integer=True)
def obj(x,a):
return a*x[0]**2-4*x[1]*x[0]**2+x[1]**2+x[0]**2-x[0]+1
def con(x,a):
r = []
for xi in x:
r.append(xi*5)
return a*r[0]*r[1]**2
# initial guess
ig=[1,2]
for i,xi in enumerate(x):
xi.value = ig[i]
a=4
m.Equation(con(x,a)<=1000)
m.Minimize(obj(x,a))
m.options.SOLVER = 1 # APOPT solver
m.solve()
Objects : 0
Constants : 0
Variables : 3
Intermediates: 0
Connections : 0
Equations : 2
Residuals : 2
Number of state variables: 3
Number of total equations: - 1
Number of slack variables: - 1
---------------------------------------
Degrees of freedom : 1
----------------------------------------------
Steady State Optimization with APOPT Solver
----------------------------------------------
Iter: 1 I: 0 Tm: 0.00 NLPi: 8 Dpth: 0 Lvs: 3 Obj: 1.22E+00 Gap: NaN
--Integer Solution: 2.00E+00 Lowest Leaf: 1.22E+00 Gap: 4.81E-01
Iter: 2 I: 0 Tm: 0.00 NLPi: 2 Dpth: 1 Lvs: 2 Obj: 2.00E+00 Gap: 4.81E-01
Iter: 3 I: -1 Tm: 0.00 NLPi: 1 Dpth: 1 Lvs: 1 Obj: 1.22E+00 Gap: 4.81E-01
--Integer Solution: 2.00E+00 Lowest Leaf: 2.00E+00 Gap: 0.00E+00
Iter: 4 I: 0 Tm: 0.00 NLPi: 3 Dpth: 1 Lvs: 1 Obj: 2.00E+00 Gap: 0.00E+00
Successful solution
---------------------------------------------------
Solver : APOPT (v1.0)
Solution time : 1.360000000568107E-002 sec
Objective : 2.00000000000000
Successful solution
---------------------------------------------------