You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何加速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开销。
  • 优化变量与计算逻辑:利用约束sum(b[k,:])=1的特性,将二维变量(kk,nn)的定义和操作转换为矩阵形式,用Gekko的矩阵运算替代Python循环,减少循环带来的性能损耗,让求解器更高效处理批量计算。

  • 优化本地计算资源:本地运行时关闭其他占用CPU、内存的程序,确保求解器能充分利用硬件资源;若为多核CPU,可设置IPOPT的m.options.NODES参数为CPU核心数,开启并行计算。

内容的提问来源于stack exchange,提问作者Mostafa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:42:41