在使用GEKKO和MINLP解算器时,如何知道方程的最大数目



我正在研究一个优化问题,我正在使用带有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中。有几种方法可以缩短这个问题的方程长度。

  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
  1. 如果参数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()
  1. 尽可能使用m.Intermediate()来减小方程的大小。这种特殊类型的中间变量结合了模型约简原则,其中一个数量被明确地计算一次,并在模型中的多个地方使用。在问题/答案中有额外的建议,如如何修复Python Gekko最大方程长度错误

最新更新