簡體   English   中英

平方 Gekko Integer 變量時的錯誤解決方案

[英]Incorrect Solution When Squaring Gekko Integer Variables

如果我將 boolean 變量初始化為 0,我會得到一個不正確的解決方案 (0)。 如果我將它初始化為 1,我會得到正確的解決方案 (1)。

# Squaring doesn't work
#######################################################

m = GEKKO(remote=False)

b = m.Var(lb=0,ub=1,integer=True, value=0)

m.Maximize(b**2)


m.options.SOLVER = 1
m.solve(debug=0, disp=True)

回報:

Successful solution
Objective:  0.

b: [0]

這是上一個問題( Gekko 返回不正確的成功解決方案)的后續問題,該問題涉及 model 涉及兩個 gekko arrays 與 gekko Z157DB7DF530023575515D366C9B67E 變量的矩陣乘法。 我相信我已經將這個問題追溯到這個問題。

嘗試這個:

from gekko import GEKKO
m = GEKKO()
b = m.Var(value=0, integer=True)
m.Equation(b>=0)
m.Equation(b<=1)
m.Maximize(b**2)
m.options.SOLVER = 1
m.solve(disp=False)
print(b.value)

Output:

[1.0]

這個 colab中查看演示。

gekko 示例中,我看到Obj() (最小化)與Equation()一起使用,所以我想,也許變量的下限和上限可以用方程式表示。 顯然,它是這樣工作的。

APOPT求解器是一個局部最小化器,它假設只有一個局部最小值。 它也沒有檢查二階導數以區分x=0處的局部最小值和局部最大值。 Hernán Alarcón 給出了一個潛在的解決方案,其中也解決了不平等約束。 這導致求解器不僅接受初始猜測作為解決方案,而且開始搜索並意識到存在更好的解決方案。 至少有兩種其他方法可以找到正確的解決方案。

用 x>=1e-3 初始化

不要在x=0處初始化,而是嘗試將x初始化為不滿足KKT 條件的任何值。

from gekko import GEKKO
m = GEKKO(remote=False)
b = m.Var(lb=0,ub=1,integer=True, value=1e-3)
m.Maximize(b**2)
m.options.SOLVER=1
m.solve(disp=False)
print(-m.options.OBJFCNVAL)

開關求解器

這是一個 integer 優化問題,但非線性規划 (NLP) 求解器(例如IPOPT )也可以解決value=0的問題。

from gekko import GEKKO
m = GEKKO(remote=False)
b = m.Var(lb=0,ub=1,integer=True, value=0)
m.Maximize(b**2)
m.options.SOLVER=3
m.solve(disp=False)
print(-m.options.OBJFCNVAL)

暫無
暫無

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

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