簡體   English   中英

GEKKO 返回非最優解

[英]GEKKO returned non-optimal solution

我想用 GEKKO 解決以下優化問題:

Minimize x'Qx + 1e-10 * sum_{i=1}^n x_i^0.1
subject to 1' x = 1 and x >= 0

但是,以下代碼返回sol = [0., 0., 0. ,0. ,1.] sol = [0., 0., 0. ,0. ,1.]Objective: 1.99419作為解決方案。 這遠非最佳,我將在下面解釋原因。

import numpy as np
from gekko import GEKKO
n = 5
m = GEKKO(remote=False)
m.options.SOLVER = 1
m.options.IMODE = 3

x = [m.Var(lb=0, ub=1) for _ in range(n)]

m.Equation(m.sum(x) == 1)
np.random.seed(0)
Q = np.random.uniform(-1, 1, size=(n, n))
Q = np.dot(Q.T, Q)

## Add h_i^p
c, p = 1e-10, 0.1
for i in range(n):
    m.Obj(c * x[i] ** p)
    for j in range(n):
        m.Obj(x[i] * Q[i, j] * x[j])

m.solve(disp=True)
sol = np.array(x).flatten()

這顯然是錯誤的,因為如果我們只使用下面的代碼優化二次部分(x'Qx),並將解決方案放在初始目標上,我們會得到一個小得多的目標值( Objective: 0.02489503 )。 1e-10 * sum_{i=1}^n x_i^p基本上被忽略了,因為它非常小。

m1 = GEKKO(remote=False)
m1.options.SOLVER = 1
m1.options.OTOL = 1e-10
x1 = [m1.Var(lb=0, ub=1) for _ in range(n)]
m1.Equation(m1.sum(x1) == 1)
m1.qobj(b=np.zeros(n), A=2 * Q, x=x1, otype='min')
m1.solve(disp=True)
sol = np.array(x1).flatten()

有沒有辦法解決這個問題? 謝謝!

Gekko 使用基於梯度的方法解決非線性規划優化問題:內點和活動集 SQP。 看起來目標函數有問題。 在 Numpy 中使用矩陣運算來簡化目標定義。

## Create Objective
c, p = 1e-10, 0.1
obj = np.dot(np.dot(x,Q),x) + c*m.sum([xi**p for xi in x])
m.Minimize(obj)

這是使用 Gekko 解決的修改后的腳本。 如果達到默認限制250 ,則增加MAX_ITER

import numpy as np
from gekko import GEKKO
n = 5
m = GEKKO(remote=False)
m.options.SOLVER = 3
m.options.IMODE = 3

x = m.Array(m.Var,n,value=0.1, lb=1e-6, ub=1)

m.Equation(m.sum(x) == 1)

np.random.seed(0)
Q = np.random.uniform(-1, 1, size=(n, n))
Q = np.dot(Q.T, Q)
print(Q)

## Create Objective
c, p = 1e-10, 0.1
obj = np.dot(np.dot(x,Q),x) + c*m.sum([xi**p for xi in x])
m.Minimize(obj)

# adjust solver tolerance
m.options.RTOL=1e-10
m.options.OTOL=1e-10
m.options.MAX_ITER = 1000

m.solve(disp=True)
sol = np.array(x).flatten()
print('x: ', sol)
print('obj: ', m.options.OBJFCNVAL)

這給出了一個全局最優解,因為它是二次規划 (QP) 問題(凸優化)。 對 QP 問題使用非線性規划 (SQP) 求解器可以通過 IPPT 求解器得到一個解:

x:  [[0.36315827507] [0.081993130341] [1e-06] [0.086231281612] [0.46861632269]]
obj:  0.024895918696

據我所知, gekko看起來像是為機器學習而構建的,它專注於局部優化而不是全局優化,通常大多數庫都無法保證您獲得最佳解決方案。

如果您真的想要最佳解決方案,那么對於這種情況,我建議您研究區間算術。 諸如mpmath 之類的軟件包可以提供此功能,盡管我還沒有看到優化器在我短暫的搜索中使用它。

關於區間算術如何工作的 TL;DR 是您輸入一系列輸入並返回一系列輸出。 例如,您可以測試1是否在x1 + x2 + x3 + x4的可能輸出范圍內,並且可以查看目標函數的最小/最大潛在值。 通過這種方式,您可以逐步將區間分成兩半,僅保留可能滿足約束且目標函數的最大潛力至少是最大最小潛力的區間。 這允許您以更多計算為代價實現有保證的收斂到全局最優值。

暫無
暫無

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

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