我正在研究一个优化问题,并且使用 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
中使用文本编辑器进行检查。有几种方法可以减少这个问题的方程长度。
- 参数
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/