[英]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 變量的矩陣乘法。 我相信我已經將這個問題追溯到這個問題。
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.