繁体   English   中英

如何在 Gekko Python 中简化大规模 NLP 模型?

[英]How can I simplify a large scale NLP model in Gekko Python?

我还是 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))

尝试多次调用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.Minimize(s) for s in somme]分别为每个元素调用m.Obj()m.Minimize()

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM