我正在尝试使用python进行优化问题,我开始研究GEKKO,因为它解决了非线性程序。我在LINGO中编写了一个简单的模型来检查与我从GEKKO(相同模型)得到的答案不相同的值的答案。
Python代码:
from gekko import GEKKO
# Initialize Model
smplmdl = GEKKO()
# Create Variables
x = smplmdl.Array(smplmdl.Var, 3, lb = 0)
a = smplmdl.Array(smplmdl.Var, 3, lb = 0)
Constant_Val = [10, 15, 20]
for i in range(3):
smplmdl.Equation(x[i]*(sum(a[j] for j in range(3))) == Constant_Val[i])
# Objective Function
smplmdl.Obj(sum(x[i] for i in range(3)))
smplmdl.options.IMODE = 3
smplmdl.solve()
smplmdl.options.OBJFCNVAL
print('x:', x)
print('a:', a)
print(smplmdl.options.OBJFCNVAL)
术语代码:
Min = x1 + x2 + x3;
x1*(a1 + a2 + a3) = 10;
x2*(a1 + a2 + a3) = 15;
x3*(a1 + a2 + a3) = 20;
可以简化模型。
from gekko import GEKKO
# Initialize Model
smplmdl = GEKKO(remote=False)
# Create Variables
x = smplmdl.Array(smplmdl.Var, 3, lb = 0)
a = smplmdl.Array(smplmdl.Var, 3, lb = 0)
Constant_Val = [10, 15, 20]
for i in range(3):
smplmdl.Equation(x[i]*sum(a) == Constant_Val[i])
# Objective Function
smplmdl.Minimize(sum(x))
# Solve and print solution
smplmdl.solve()
print('x:', x)
print('a:', a)
print(smplmdl.options.OBJFCNVAL)
给出了解决方案:
x: [[5.7995291433e-05] [8.699293715e-05] [0.00011599058287]]
a: [[57475.93038] [57475.930412] [57475.930377]]
Objective: 0.00026097881145
目标是最小化x的和,IPOPT得到的目标函数为2.6e-4
。如果LINGO给出了不同的解决方案,则可能存在可以调整的求解器公差,以获得更好的一致性。尝试调整m.options.RTOL
和m.options.OTOL
的残差和目标函数公差。对于非凸问题,多起点方法或全局求解器可能更适合于此问题。
如果目的是比较LINGO和GEKKO,也许可以尝试一个简单的凸优化问题,如:
from gekko import GEKKO
import numpy as np
m = GEKKO()
x = m.Array(m.Var,4,value=1,lb=1,ub=5)
x1,x2,x3,x4 = x
# change initial values
x2.value = 5; x3.value = 5
m.Equation(x1*x2*x3*x4>=25)
m.Equation(x1**2+x2**2+x3**2+x4**2==40)
m.Minimize(x1*x4*(x1+x2+x3)+x3)
m.solve()
print(x,m.options.OBJFCNVAL)