我是使用 PuLP 的新手,我正在嘗試將標準偏差編程為優化問題中的目標函式。我已經閱讀了這個答案,雖然我知道它是相關的,但我無法將其應用于我的具體情況。
我正在嘗試解決以下優化問題:最大化一組 3 個決策變數的標準差,相關權重向量為 [0.25、0.40 和 0.35]。我的限制是每個決策變數應該在 0.5 到 2.0 之間。(這是一個簡化的示例;在實踐中,我將擁有更大的決策變數集和更大的相應權重向量)。
到目前為止,我的代碼如下:
from pulp import LpMaximize, LpProblem, LpVariable
# Create the model
model = LpProblem(name="max_stdev", sense=LpMaximize)
# Define the decision variables
x = {i: LpVariable(name=f"x{i}", lowBound=0.5, upBound=2.0) for i in range(3)}
# Add the constraints to the model
model = (0.25*x[0] 0.40*x[1] 0.35*x[2] == 1, "weight_constraint")
# Add the objective function to the model, which should be the standard deviation of the x vector
model = ??
# Solve the problem
status = model.solve()
我只是不確定如何以目標函式的形式應用標準偏差公式(見上文)。同樣,我知道這個答案可能很有用,但我只是不確定如何使這個作業。
非常感謝您的幫助!
uj5u.com熱心網友回復:
使用 Pulp 做到這一點可能并不容易。它只接受線性模型,這本質上是非線性和非凸的。使用非凸二次求解器,我們可以最大化
sum(i, (x[i]-μ)^2)
這給出了:
---- 30 VARIABLE x.L
i1 0.500, i2 0.500, i3 1.929
---- 35 VARIABLE z.L = 1.361 obj
VARIABLE mu.L = 0.976 mean
PARAMETER stdev = 0.825 standard deviation
可能的求解器包括 Cplex、Gurobi、Baron、Antigone。
可以用一些絕對值項代替平方偏差目標。但這會很混亂,因為問題是非凸的。這將需要一些額外的二進制變數。類似于以下內容:
max sum(i, splus[i] smin[i])
μ = sum(i, x[i])/n
splus[i] - smin[i] = x(i)-μ
splus[i] ≤ b[i]*M
smin[i] ≤ (1-b[i])*M
0.25*x[0] 0.40*x[1] 0.35*x[2] = 1
smin[i],splus[i] ≥ 0
b[i] ∈ {0,1}
x[i] ∈ [0.5,2]
M = 2-0.5
對于這個例子,我得到了相同的結果:
---- 85 VARIABLE x.L
i1 0.500, i2 0.500, i3 1.929
---- 85 VARIABLE z.L = 1.905 obj
VARIABLE mu.L = 0.976 mean
PARAMETER stdev = 0.825 standard deviation
(通常解決方案不會完全相同)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/489637.html
下一篇:有理貝塞爾曲線的透視投影
