我试图用GEKKO优化一个指数目标函数,但我不知道所选的解算器是否是这类问题的最佳解算器。你知道吗
所选的是有效的选择吗??你知道吗
import numpy as np
'GEKKO MODELING'
from gekko import GEKKO
m = GEKKO()
m.options.SOLVER=1 # APOPT is an MINLP solver
# Initialize variables
x = []
x1 = m.Var(value=20,lb=20, ub=6555) #integer=True
x2 = m.Var(value=0,lb=0,ub=10000) #integer=True
x3 = m.sos1([30, 42, 45, 55])
x = [x1, x2, x3]
# Equations
m.Equation((x1 * x2* x3) * 10 ** (-6)>=50)
def fun(x):
return 44440 + ((np.pi * x[0] * x[1] * x[2]) * 10 ** (-4))**0.613
x = [400,300,19]
'GEKKO Optimization'
m.Obj(fun(x))
m.solve(disp=False) # Solve
print('Results')
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('x3: ' + str(x3.value))
print('Objective: ' + str(m.options.objfcnval))
脚本的一个问题是在调用目标函数之前重新定义了
x = [400,300,19]
的值。应使用原始定义x = [x1, x2, x3]
调用目标函数,以便优化这些变量。另一个变化是x3
的值默认为零。将其设置为远离零x3.value=1.0
允许APOPT和IPOPT解算器收敛,因为您以前使用x3<0
在虚数目标的边界上开始。你知道吗对于解算器建议,这里有一个list of publicly available solvers in Gekko。在Gekko中还有其他商业上可用的解算器选项,但是对于这个响应,我将坚持使用公开访问的选项(APOPT、BPOPT和IPOPT)。任何非线性规划求解器都应该能够处理非线性目标,例如
x**0.613
。你的问题还包括一个Special Ordered Set, Type 1 (m.sos1),因此你的问题不仅仅是一个非线性规划(NLP)问题,还包括sos1
的二进制变量。这意味着您需要使用混合整数非线性规划(MINLP)求解器。APOPT解算器是Gekko中唯一公开的MINLP解算器,当您创建sos1
对象时,它会自动为您选择。如果您想尝试使用NLP解算器(例如IPOPT)来解决MINLP问题,那么您需要在创建m.sos1
对象之后指定解算器。你知道吗这可能导致不正确的解决方案,因为
x3
只能是以下之一:30, 42, 45, 55
。IPOPT找到一个x3==47.079550873
的最小解,因此在本例中,它没有返回整数解。如果要保证整数解,就需要使用APOPT。你知道吗如果需要更改MINLP APOPT解算器的某些调整参数,则可以使用以下方法:
有additional information on the APOPT solver options。你知道吗
相关问题 更多 >
编程相关推荐