[英]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.