如何加速Gekko求解器优化大规模二次规划问题?
二次规划问题求解加速建议
问题背景
该二次规划问题包含31440个变量b[k, n],约束数量较少,但求解耗时过长。已尝试通过m = GEKKO(remote=False)在本地运行,并分别使用APOPT、IPOPT求解器,仍存在耗时久的问题。
原实现代码
GSP_G = ['_P'] for g in GSP_G: kk = len(emb_units[g]) nn = len(nodes[g]) nodes_list = list(nodes[g]) SP = range(1, Sett_time_period + 1) Met_Vol = {} for n in range(nn): for t in SP: Met_Vol[t, g, n] = Metered_Volume[t, g, nodes_list[n]] m = GEKKO() # Initialize gekko m = GEKKO(remote=False) m.options.SOLVER = 3 # APOPT is an MINLP solver = 1 # IPOPT is an MINLP solver = 3 m.options.IMODE = 2 m.options.DIAGLEVEL = 1 # Variable b = m.Array(m.Var, (kk, nn), lb=0, ub=1) # Constraint for k in range(kk): m.Equation(sum(b[k, :]) == 1) # Define the objective function for n in range(nn): for t in SP: m.Obj(sum([(MV_total[t, g] - \ (sum(b[k, n] for k in range(kk)) \ * Met_Vol[t, g, n])) ** 2])) #m.open_folder() m.solve() # Solve
加速求解建议
重构目标函数,减少重复计算:当前目标函数嵌套多层循环,会生成大量冗余表达式。可以先预计算
sum(b[k,n] for k in range(kk))为中间变量x_n,再构建目标函数,避免重复求和:# 定义中间变量x_n = sum(b[k,n] for k in 0..kk-1) x = m.Array(m.Var, nn) for n in range(nn): m.Equation(x[n] == sum(b[k,n] for k in range(kk))) # 重构目标函数 obj = 0 for n in range(nn): for t in SP: obj += (MV_total[t,g] - x[n]*Met_Vol[t,g,n])**2 m.Obj(obj)这种方式能大幅减少Gekko需要处理的表达式数量,降低求解器计算负担。
切换专门的二次规划求解器:IPOPT是通用非线性规划求解器,对于二次规划(QP)问题,可切换到Gekko支持的
SOLVER=2(BPOPT,专为QP优化),或调用外部专业QP求解器(如OSQP、Gurobi),这类求解器在处理QP问题时效率远高于通用NLP求解器。调整求解器参数:
- 对IPOPT,设置
m.options.MAX_ITER为合理值(如500或1000),避免无意义的迭代;若有近似初始解,开启m.options.WARM_START=1加速收敛。 - 将
DIAGLEVEL设为0,关闭诊断输出,减少IO开销。
- 对IPOPT,设置
优化变量与计算逻辑:利用约束
sum(b[k,:])=1的特性,将二维变量(kk,nn)的定义和操作转换为矩阵形式,用Gekko的矩阵运算替代Python循环,减少循环带来的性能损耗,让求解器更高效处理批量计算。优化本地计算资源:本地运行时关闭其他占用CPU、内存的程序,确保求解器能充分利用硬件资源;若为多核CPU,可设置IPOPT的
m.options.NODES参数为CPU核心数,开启并行计算。
内容的提问来源于stack exchange,提问作者Mostafa
相关产品推荐
相关产品推荐

