如何在python Gekko中加速1446个变量的整数非线性规划?



我正在求解整数非线性python gekko编程问题,其中有1446个整数变量,31个变量的线性组合约束,1个要最大化的非线性目标。

程序需要很长时间,我想知道它是否可以加速,以及如何调优一个更好的。solver_options.

这是代码。(我只留下一些关于变量的注释,因为它们的计算依赖于一些外部数据文件。)

m = GEKKO()
m.options.SOLVER = 1  # APOPT is an MINLP solver
# optional solver settings with APOPT
m.solver_options = ['minlp_maximum_iterations 500',
'minlp_as_nlp 0',
'minlp_branch_method 1',
'minlp_integer_tol 0',
'nlp_maximum_iterations 50',
]
# Constraint: sum of all weights <= 1
# e.g. weights = [0.04 * int_v1, 0.05 * int_v2, ..., 0.03 * int_v1446]
m.Equation(m.sum(weights) <= 1)
# Constraint: sum of weights on each cluster has an upper bound
# e.g. weights_per_cluster = {'1': [int_v2, int_v5, int_v8], '2': [int_v1, int_v4, int_v6], ..., '30': [int_v9, int_v12]}
for cluster in clusters:
m.Equation(m.sum(weights_per_cluster[cluster]) <= 0.1)
mu_sig_raw = np.array(mu_sig_raw).transpose() # real value, shape (106, 1446)
mu = np.mean(mu_sig_raw, axis=0) # real value, shape (1446, 1)
sigma = np.cov(np.transpose(mu_sig_raw)) # real value, shape (1446, 1446)
k = len(mu)
# Objective: profit-rate mean-variance model
m.Maximize(
(m.sum([mu[i] * weights[i] for i in range(k)]) - 0.03)
/
m.sqrt(m.sum([
m.sum([sigma[i, j] * weights[i] * weights[j] for j in range(k)])
for i in range(k)
]))
)
m.solve(disp=True)

APOPT求解器在许多自由度下可能很慢(# Variables>>#方程)或许多整数变量。一种策略是使用IPOPT求解器进行初始化,然后切换到APOPT以获得整数解决方案。

m.options.SOLVER=3 # IPOPT
m.solve()
m.options.SOLVER=1 # APOPT
m.solve()

另一个有用的方法是将不等式重新定义为变量,并设置该变量的上界。

for cluster in clusters:
m.Equation(m.sum(weights_per_cluster[cluster]) <= 0.1)

变换:

v = []
for cluster in clusters:
v.append(m.Var(ub=0.1))
m.Equation(m.sum(weights_per_cluster[cluster]) == v[-1])

您可能还需要进一步调整求解器选项。APOPT求解器有许多可用于调优求解器性能的选项。下面列出了一些可用选项和默认值:

  • minlp_maximum_iterations 10000-分支定界法NLP解的最大数目。如果在达到最大迭代次数时存在整数解,则返回成功的解决方案。否则,解决方案不被认为是成功的,并返回一个错误消息和失败的解决方案。
  • minlp_max_iter_with_int_sol 500-当找到候选整数解时nlp解的最大数目
  • minlp_as_nlp 1-将minlp问题作为连续的nlp问题来解决,忽略整数约束
  • minlp_branch_method 3- 1=深度优先(更快找到整数解),2=宽度优先,3=最低目标叶,4=最高目标叶
  • minlp_gap_tol 1.0依照- gap是最低候选叶子(obj_r=非整数解)和最佳整数解(obj_i)之间的距离。当间隙小于minlp_gap_tol时,将返回最佳整数解决方案。被定义为的差距差距= (obj_i-obj_r)/max ((abs (obj_i) + abs (obj_r))/2, 1)。
  • minlp_integer_tol 1.0依照-候选解变量可以偏离整数解而仍被认为是整数的量。
  • minlp_integer_max 2.0 e9-被视为整数的最大值。超过2147483647或低于-2147483648的值不能正确地存储在内部整数变量类型中,因为用于存储整数的位数。
  • minlp_integer_leaves 1-添加额外的整数叶,0=关闭,1=分支上不相等的整数叶,2=分支上相等约束的整数叶。
  • minlp_print_level 1-打印级别(0-10)。开发版本有额外的高级诊断。
  • nlp_maximum_iterations 500-每个NLP子问题的最大迭代次数。减少nlp最大迭代可以提高求解速度,因为较少的计算时间花费在可能不收敛的候选解上
  • 1.0
  • objective_convergence_tolerance e-6-目标函数的收敛容限。低于1.0e-10的值有时会因为数值缩放而遇到收敛问题,无法达到所要求的精度。
  • 1.0
  • constraint_convergence_tolerance e-6-约束的收敛容限。较低的收敛容忍度通常只给解决方案增加一些额外的迭代,但解决方案也不会发生显著变化。

如果找到整数解,则minlp_gap_tol如果整数解的间隙足够小,可能有助于提高求解时间。因为完整的脚本没有发布,我们不能测试任何建议的改进。请考虑张贴完整的脚本,以供将来的问题。

最新更新