python - 将 GEKKO 与 MINLP 求解器结合使用时如何知道方程的最大数量

标签 python optimization gekko

我正在研究一个优化问题,并且使用 gekko 和 APOPT 求解器来解决它,有时当我有很多变量时,我会收到以下错误“异常:@error:最大方程长度”。< br/> 我怎么知道“最大方程长度”?

最佳答案

变量和方程先作为文本文件写入临时文件夹,然后编译为字节码,以便通过自动微分有效计算残差、目标函数、稀疏一阶导数和稀疏二阶导数。 gekko 中的每个方程式限制为 15,000 个字符模型,而不仅仅是使用 APPT 求解器。这个限制可以延长,但它是为了鼓励提高编译和求解速度的模型构建方法。一个简单的gekko模型通过 x = sum(p) 演示了该问题作为 10,000 个值的向量。

from gekko import GEKKO
m = GEKKO(remote=False)
p = m.Array(m.Param,10000,value=1)
x = m.Var(lb=0,integer=True)
m.Equation(x==sum(p))
m.options.SOLVER = 1
m.open_folder()
m.solve()

这会产生超出最大方程长度的错误。

Exception: @error: Max Equation Length
 Error with line number:  10008

运行文件夹用 m.open_folder() 打开。 gekko模型位于文件 gk_model0.apm 中使用文本编辑器进行检查。有几种方法可以减少这个问题的方程长度。

  1. 参数p可以是普通的numpy数组,而不是 gekko参数。总和是在写入模型文件之前预先计算的。
from gekko import GEKKO
import numpy as np
m = GEKKO(remote=False)
p = np.ones(10000)
x = m.Var(lb=0,integer=True)
m.Equation(x==sum(p))
m.options.SOLVER = 1
m.open_folder()
m.solve()

这给出了以下gk_model0.apm型号:

Model
Variables
    int_v1 = 0, >= 0
End Variables
Equations
    int_v1=10000.0
End Equations
End Model
  • 如果参数p需要gekko参数或变量,然后使用m.sum()函数而不是 sum() 。使用m.sum()sum()更有效率或np.sum()对于 gekko优化问题并避免最大方程长度问题。编译时间比第一个选项长。
  • from gekko import GEKKO
    m = GEKKO(remote=False)
    p = m.Array(m.Param,10000,value=1)
    x = m.Var(lb=0,integer=True)
    m.Equation(x==m.sum(p))
    m.options.SOLVER = 1
    m.solve()
    
  • 使用m.Intermediate()尽可能减少方程的大小。这种特殊类型的intermediate variable结合了模型简化原则,其中数量被显式计算一次并在模型中的多个位置使用。问题/答案中还有其他建议,例如 How to fix Python Gekko Max Equation Length error
  • 关于python - 将 GEKKO 与 MINLP 求解器结合使用时如何知道方程的最大数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72644450/

    相关文章:

    python - 将参数传递给父类(super class)时,错误标志为 : "module.__init__() takes at most 2 arguments (3 given)"?

    python - 用python求解非线性方程组

    optimization - 在F#/Scala中优化相互递归的标准方法是什么?

    python - 神经网络直线——GEKKO

    python - 最小化温度向量中每个 T 值的多变量函数

    Python - Pip 安装 - 代理错误 - 'Cannot connect to proxy.',OSError'

    python - 如何通过代理调试 urllib2 请求

    javascript - 编译 RequireJS 去除 AMD 依赖

    C++ std::async 比顺序 for 循环慢

    python - GEKKO ANN 示例中的偏置节点