我正在解决一个整数非线性编程问题与蟒蛇壁虎,其中有 1446 个整数变量、31 个变量线性组合的约束以及 1 个要最大化的非线性目标。
该程序需要很长时间,我想知道是否可以speed up,以及如何更好地调整m.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)