我对Python中的Gekko优化仍然很陌生,而且我在扩展我的NLP问题时遇到了问题。在尝试多次(以不同的方式)调用函数m.Sum、使用m.Intermediate和使用列表理解来缩小表示模型的字符串的大小之后,我仍然会在优化一个只有200个变量的模型时遇到这个错误。当我只对80个变量进行优化时,该模型就能工作。
这是我得到的错误:
APM model error: string > 15000 characters
Consider breaking up the line into multiple equations
The may also be due to only using newline character CR
instead of CR LF (for Windows) or LF (for MacOS/Linux)
To fix this problem, save APM file with appropriate newline characters
STOPPING...
下面是给我带来麻烦的代码片段:
def function_to_minimize(variables0,m):
somme = [ m.Intermediate(
variables0[0+(4*i)] * df['value1'][i] + \
variables0[1+(4*i)] * df['value2'][i] + \
variables0[2+(4*i)] * df['value3'][i] + \
variables0[3+(4*i)] * df['value4'][i]
) for i in range(0,hours)]
somme = reduce(lambda a, b: a+b, somme)
m.Obj(m.Intermediate(somme))
发布于 2022-07-08 17:49:43
尝试多次调用m.Obj()
,而不是创建一个求和。下面是演示这个问题的一个最小的完整问题。如果v = m.Array(m.Var,100,lb=0,ub=10)
是一个由更多变量组成的数组,那么就可以达到15,000个方程的长度限制。
from gekko import GEKKO
m = GEKKO()
v = m.Array(m.Var,100,lb=0,ub=10)
hours = 24
def function_to_minimize(variables0,m):
somme = [ m.Intermediate(
variables0[0+(4*i)] * 1 + \
variables0[1+(4*i)] * 2 + \
variables0[2+(4*i)] * 3 + \
variables0[3+(4*i)] * 4
) for i in range(0,hours)]
somme = sum(somme)
m.Minimize(m.Intermediate(somme))
function_to_minimize(v,m)
m.solve()
使用m.sum()
来避免这个限制。
from gekko import GEKKO
m = GEKKO()
v = m.Array(m.Var,100,lb=0,ub=10)
hours = 24
def function_to_minimize(variables0,m):
somme = [ m.Intermediate(
variables0[0+(4*i)] * 1 + \
variables0[1+(4*i)] * 2 + \
variables0[2+(4*i)] * 3 + \
variables0[3+(4*i)] * 4
) for i in range(0,hours)]
m.Minimize(m.sum(somme))
function_to_minimize(v,m)
m.solve()
或者为每个元素分别使用m.Obj()
或m.Minimize()
调用[m.Minimize(s) for s in somme]
。
from gekko import GEKKO
m = GEKKO()
v = m.Array(m.Var,100,lb=0,ub=10)
hours = 24
def function_to_minimize(variables0,m):
somme = [ m.Intermediate(
variables0[0+(4*i)] * 1 + \
variables0[1+(4*i)] * 2 + \
variables0[2+(4*i)] * 3 + \
variables0[3+(4*i)] * 4
) for i in range(0,hours)]
[m.Minimize(s) for s in somme]
function_to_minimize(v,m)
m.solve()
https://stackoverflow.com/questions/72907917
复制相似问题