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

标签 python optimization exponential nonlinear-optimization gekko

我正在尝试使用 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 .

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 . 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指定求解器。对象。

m.options.SOLVER = 3

这可能会导致错误的解决方案,因为 x3只能是以下之一:30, 42, 45, 55 . IPOPT 找到 x3==47.079550873 的最小解所以在这种情况下,它没有返回整数解。如果要保证整数解,则需要使用 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 .

关于python - 如果我的目标函数是非线性(也是指数解释)函数,我应该使用什么求解器? python 壁虎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57574800/

相关文章:

Python Speedtest 面临认证问题_ssl.c :1056

python - 如何将 @shared_task 装饰器用于基于类的任务?

php - 基于 PHP 或 Django 的可扩展且灵活的电子商务网站框架

c++ - 使用 C++ 打印带有一个前导零的指数符号

python - 在 Python 中操纵 numpy.random.exponential 分布

python - 在 python 中高效地找到数组的范围?

c++ - CPLEX如何以相同的成本得到所有不同的最优解

mysql - 有 300 多万条记录的 MySQL 表有哪些优化技术?

javascript - 加载 JavaScript 或 CSS 而不执行它们的方法有哪些?

php - 在 PHP 中将指数转换为整数