簡體   English   中英

將 GEKKO 與 MINLP 求解器一起使用時如何知道最大方程數

[英]How to know the maximum number of Equations when using GEKKO with an MINLP solver

我正在研究一個優化問題,我正在使用帶有 APOPT 求解器的 gekko 來解決它,有時當我有很多變量時,我會收到以下錯誤“異常:@error:最大方程長度”。
我怎么知道“最大方程長度”?

變量和方程在編譯成字節碼之前以文本文件的形式寫入臨時文件夾,以便通過自動微分有效計算殘差、目標函數、稀疏一階導數和稀疏二階導數。 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中,該文件使用文本編輯器進行檢查。 有幾種方法可以減少這個問題的方程長度。

  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 Max Equation Length 錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM