如果我的 objective 函数是非线性(也是指数解释)函数,我应该使用什么求解器? Python 壁虎

What solver should I use if my objective function is an nonlinear (also exponential explanation) function? Python GEKKO

我正在尝试使用 GEKKO 优化指数 objective 函数,但我不知道所选求解器是否是解决此类问题的最佳求解器。

所选的选项是否有效??

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))

您的脚本存在一个问题,即您在调用 objective 函数之前重新定义了 x = [400,300,19] 的值。 objective 函数应使用您的原始定义 x = [x1, x2, x3] 调用,以便它可以优化这些变量。另一个变化是 x3 的值默认为零。将它设置为远离零 x3.value=1.0 允许 APOPT 和 IPOPT 求解器收敛,因为您之前从虚数 objective 与 x3<0.

的边界开始
import numpy as np
from gekko import GEKKO
m = GEKKO()
x = []
x1 = m.Var(value=20,lb=20, ub=6555)  #integer=True
x2 = m.Var(value=1,lb=1,ub=10000)  #integer=True
x3 = m.sos1([30, 42, 45, 55])
x3.value = 1.0
x = [x1, x2, x3]
m.Equation((x1 * x2* x3) * 1e-6 >= 50)
def fun(x):
    return 44440 + ((np.pi * x[0] * x[1] * x[2]) * 1e-4)**0.613
m.Obj(fun(x))

# Change to True to initialize with IPOPT
init = False
if init:
    m.options.SOLVER=3  
    m.solve(disp=False) # Solve

m.options.SOLVER=1
m.solve(disp=True) # Solve

print('Results')
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('x3: ' + str(x3.value))
print('Objective: ' + str(m.options.objfcnval))

对于求解器建议,这里有一个 list of publicly available solvers in Gekko. There are additional commercially available solver options in Gekko but I'll stick with just the publicly accessible ones (APOPT, BPOPT, and IPOPT) for this response. Any nonlinear programming solver should be able to handle a nonlinear objective such as x**0.613. Your problem also includes a Special Ordered Set, Type 1 (m.sos1),因此您的问题不仅是非线性规划 (NLP) 问题,还包括 sos1 的二进制变量。这意味着您需要使用混合整数非线性规划 (MINLP) 求解器。 APOPT 求解器是 Gekko 中唯一公开可用的 MINLP 求解器,它会在您创建 sos1 对象时自动为您选择。如果您想尝试使用 NLP 求解器(例如 IPOPT)解决 MINLP 问题,则需要在创建 m.sos1 对象后 指定求解器 .

m.options.SOLVER = 3

这可能会导致错误的解决方案,因为 x3 只能是以下之一:30, 42, 45, 55。 IPOPT 找到了 x3==47.079550873 的最小解,因此在这种情况下,它没有 return 整数解。如果要保证整数解,则需要使用 APOPT。

 Successful solution

 ---------------------------------------------------
 Solver         :  APOPT (v1.0)
 Solution time  :   4.279999999562278E-002 sec
 Objective      :    44813.4405591393     
 Successful solution
 ---------------------------------------------------

Results
x1: [677.59896405]
x2: [2459.665311]
x3: [30.0]
Objective: 44813.440559

如果您需要更改 MINLP APOPT 求解器的一些调整参数,那么您可以使用如下内容:

m.solver_options = ['minlp_gap_tol 1.0e-2',\
                    'minlp_maximum_iterations 10000',\
                    'minlp_max_iter_with_int_sol 500']

additional information on the APOPT solver options.