我正在研究一个优化问题,我正在使用带有APOPT求解器的gekko来解决它,有时当我有很多变量时,我得到以下错误异常:@error:最大方程长度。
我怎么知道"max方程长度"呢?
变量和方程先以文本文件的形式写入临时文件夹,然后再编译成字节码,进行残差、目标函数、稀疏一阶导数、稀疏二阶导数的自动微分高效计算。在gekko
模型中,每个方程限制为15,000个字符,而不仅仅是APOPT求解器。这个限制可以扩展,但它是为了鼓励模型构建方法,以提高编译和解决方案的速度。一个简单的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()
。对于gekko
优化问题,使用m.sum()
比sum()
或np.sum()
更有效,避免了方程长度最大的问题。编译时间比第一个选项长。
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()
来减小方程的大小。这种特殊类型的中间变量结合了模型约简原则,其中一个数量被明确地计算一次,并在模型中的多个地方使用。在问题/答案中有额外的建议,如如何修复Python Gekko最大方程长度错误