簡體   English   中英

在優化變量中使用“添加到 1”約束進行優化

[英]Optimization with "add to 1" constraint in optimization variable

我正在嘗試使用scipy minimize function 來制定優化問題。 但是,我遇到了以下無法解決的問題:

我想要X = [x1, x2, x3, x4, x5]最小化成本 function F(X)。 然而,這個 X 向量是必須加到 1 的百分比值,即np.sum(X) = 1

問題是:例如,如果我使用帶有一些初始值(例如X0 = [0.2, 0.2, 0.2, 0.2, 0.2] )的“SLSQP”方法,它將嘗試增加每個值以找到一些收斂方向. 例如,該算法將使X0 -> [0.21, 0.2, 0.2, 0.2, 0.2] 但這不可能發生,因為np.sum(X) = 1是我計算目標 function 的要求。

使用約束也無濟於事! 我可以用np.sum(X) = 1做一個約束。 然而,最小化算法只會在計算出目標 function 之后檢查約束。

任何人都知道如何處理這樣的問題?

非常感謝!

當 X 超出其界限時,我通常使用的 NLP 求解器不會要求 function 和梯度評估。 這意味着我們可以通過添加適當的下限來保護諸如sqrt(x)log(x)之類的東西。

當我們評估函數和梯度時,不能假設約束是成立的。

如果您的 function 假設sum(X)=1 ,您可以調用F(X/sum(X)) 唯一的並發症是當X=0時。 在這種情況下,為 F 返回一個較大的值,以便求解器遠離它。

must sum to 1約束有效地減少了需要優化的變量數量。 如果您知道除一個變量之外的所有變量的值,則剩余值由約束隱含。 它必須正好是1 - sum(other_vars)

您可以優化四個變量並計算第五個,而不是優化五個變量X = [x1, x2, x3, x4, x5]X = [x1, x2, x3, x4, 1 - (x1 + x2 + x3 + x4)] .

優化問題的這種表述避免了如果所有 X 都非常低時可能出現的不精確性。

如果變量是百分比,您將需要分別指定 0 和 1 的下限和上限。 此外,您需要約束x1+x2+x3+x4 <= 1以避免負x5 (對於優化器來說,這個不等式約束比原來的等式約束要容易得多。)

def cost_function(X):
    x1, x2, x3, x4 = X
    x5 = 1.0 - (x1, x2, x3, x4)    
    return F((x1, x2, x3, x4, x5))

x0 = [0.2, 0.2, 0.2, 0.2]  # initial guess: all values equal
minimize(cost_function, x0, 
         bounds=[(0.0, 1.0)]*4, 
         constraints=dict(type='ineq', fun=lambda X: 1.0 - X.sum()))

暫無
暫無

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

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