python 壁虎 : optimizing performance of nonlinear optimization

标签 python nonlinear-optimization gekko

我正在使用 GEKKO‍ 来解决非线性规划问题。我的目标是将 GEKKO‍ 性能与替代方案进行比较,因此我想确保我从 GEKKO‍ 中获得其所能提供的最佳性能。

n个二元变量,每个变量都分配有一个权重,每个权重都是区间[0, 1]中的一个数字(即有理数w满足0<= w <= 1)。每个约束都是线性的。目标函数是非线性的:它是非零变量权重的乘积,目标是最大化乘积。

我首先将目标函数指定为

m.Obj(-np.prod([1 - variables[i] + weights[i] * variables[i] for i in range(len(variables))]))

但随后我会遇到 APM 模型错误:字符串 > 15000 个字符。所以我使用 if3 函数切换到辅助变量

aux_variables = [m.if3(variables[i], weights[i], 1) for i in range(len(variables))]
m.Obj(-np.prod(aux_variables))

我手动设置的唯一全局参数位于以下代码中。

# initialize model

m = GEKKO(remote=False)


# set global variables

m.options.SOLVER = 1 # APOPT solver
# "APOPT is an MINLP solver"
# "APOPT is also the only solver that handles Mixed Integer problems."

m.options.IMODE = 3 # steady state optimization

m.solver_options = ['minlp_maximum_iterations 500', \
                    # minlp iterations with integer solution
                    'minlp_max_iter_with_int_sol 10', \
                    # treat minlp as nlp
                    'minlp_as_nlp 0', \
                    # nlp sub-problem max iterations
                    'nlp_maximum_iterations 50', \
                    # 1 = depth first, 2 = breadth first
                    'minlp_branch_method 1', \
                    # maximum deviation from whole number
                    'minlp_integer_tol 0.05', \
                    # covergence tolerance
                    'minlp_gap_tol 0.01']

# initialize variables
variables = m.Array(m.Var, (number_of_vars), lb=0, ub=1, integer=True)

# set initial values
for var in variables:
    var.value = 1

问题:

在全局参数和目标函数的制定方面,我还能做些什么(如果有的话)来优化 GEKKO 对于这个特定问题的性能?

同时,我希望 GEKKO‍ 能够产生不错的结果。

最佳答案

重新表述问题以提高速度的一种方法是使用中间变量。

原始(0.0325 秒,# Var=5)

m.Obj(-np.prod([1 - variables[i] + weights[i] * variables[i] \
      for i in range(len(variables))]))

修改(0.0156 秒,# Var=5)

ival = [m.Intermediate(1 - variables[i] + weights[i] * variables[i]) \
                       for i in range(len(variables))]
m.Obj(-np.prod(ival))

这也应该可以帮助您避免字符串长度的问题,除非您有 number_of_vars那是非常大的。看来最优解永远是variables[i]=1weights[i]=1variables[i]=0weights[i]=0 。与np.prod这意味着如果任何一项乘积项为零,则整个目标函数为零。将单个产品值设置为 1 是否有帮助?而不是使用目标函数来查找值?帮助 APOPT 找到正确解决方案的一件事是使用类似 1.1 的东西。在你的中间声明中而不是 1.0 。因此,当您最大化时,它会尝试避免 0.1有利于找到给出 1.1 的解决方案的值.

from gekko import GEKKO
import numpy as np
m = GEKKO(remote=False)
number_of_vars = 5
weights = [0,1,0,1,0]
m.options.IMODE = 3
variables = m.Array(m.Var, (number_of_vars), lb=0, ub=1, integer=True)
for var in variables:
    var.value = 1
ival = [m.Intermediate(1.1 - variables[i] + weights[i] * variables[i]) \
                       for i in range(len(variables))]
# objective function
m.Obj(-np.prod(ival))
# integer solution with APOPT
m.options.SOLVER = 1
m.solver_options = ['minlp_maximum_iterations 500', \
                    # minlp iterations with integer solution
                    'minlp_max_iter_with_int_sol 10', \
                    # treat minlp as nlp
                    'minlp_as_nlp 0', \
                    # nlp sub-problem max iterations
                    'nlp_maximum_iterations 50', \
                    # 1 = depth first, 2 = breadth first
                    'minlp_branch_method 1', \
                    # maximum deviation from whole number
                    'minlp_integer_tol 0.05', \
                    # covergence tolerance
                    'minlp_gap_tol 0.01']
m.solve()
print(variables)

求解器也更容易找到诸如m.sum()这样的求和的解。它给出了相同的 variables解决方案为 np.prod()选项。

# objective function
m.Obj(-m.sum(ival))

您可以添加后处理线来恢复产品目标函数,该函数将是 01 .

if3函数对于您的应用来说不是一个好的选择,因为切换条件为 0,轻微的数值变化将导致不可靠的结果。求解器考虑 00.050.951根据选项 minlp_integer_tol=0.05 得到整数解。该选项允许在足够接近整数值时接受整数解。如果variables[i]值为 0.01然后if3函数将选择True选项时应选择 False选项。您仍然可以使用 if3如果您在二进制值之间设置了切换点,例如m.if3(variables[i]-0.5, weights[i], 1),则函数。但是,有比使用 if3 更简单的方法来解决您的问题。功能。

关于 python 壁虎 : optimizing performance of nonlinear optimization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58378909/

相关文章:

python - 拆分带有附加空格的 Python 字符串(句子)

algorithm - 一种检查非线性函数 f 是否始终为正的算法

gekko - 如何在 mpc 中使用矢量设定点,以便提供有关 future 设定点将如何变化的程序信息

gekko - 使用 Gekko 和 Python 拟合数据的数值 ODE 解

python - Keras 预测()值错误 : input doesn't have the correct dimension

python - 为什么我不能将文件目录存储在变量中以与 csv.reader(file()) 一起使用?

python - 尝试在 Azure 上部署 Django 服务器时出现 "ModuleNotFoundError: No module named ' django '"

matlab - 使用 fmincon() 求解矩阵形式的非线性程序

r - 使用 R nloptr 包进行最小化 - 多重等式约束

python - 如何在 Python Gekko 优化中强制执行二进制(或整数)变量?