通过 PuLP 最大化决策变量的标准差

use*_*611 1 python math linear-programming pulp

我是 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()

Run Code Online (Sandbox Code Playgroud)

我只是不确定如何以目标函数的形式应用标准差公式(见上文)。再说一次,我知道这个答案可能有用,但我只是不确定如何使其发挥作用。

非常感谢您的帮助!

Erw*_*gen 6

使用 Pulp 来做到这一点可能并不那么容易。它只接受线性模型,这本质上是非线性和非凸的。使用非凸二次求解器,我们可以最大化

\n
sum(i, (x[i]-\xce\xbc)^2)\n
Run Code Online (Sandbox Code Playgroud)\n

这给出:

\n
----     30 VARIABLE x.L  \n\ni1 0.500,    i2 0.500,    i3 1.929\n\n\n----     35 VARIABLE z.L                   =        1.361  obj\n            VARIABLE mu.L                  =        0.976  mean\n            PARAMETER stdev                =        0.825  standard deviation\n
Run Code Online (Sandbox Code Playgroud)\n

可能的求解器包括 Cplex、Gurobi、Baron、Antigone。

\n

可以用一些绝对值项来代替平方偏差目标。但这会很混乱,因为问题是非凸的。这将需要一些额外的二进制变量。大致如下:

\n
   max sum(i, splus[i] + smin[i])\n       \xce\xbc = sum(i, x[i])/n\n       splus[i] - smin[i] = x(i)-\xce\xbc\n       splus[i] \xe2\x89\xa4 b[i]*M\n       smin[i]  \xe2\x89\xa4 (1-b[i])*M \n       0.25*x[0] + 0.40*x[1] + 0.35*x[2] = 1\n       smin[i],splus[i] \xe2\x89\xa5 0\n       b[i] \xe2\x88\x88 {0,1}\n       x[i] \xe2\x88\x88 [0.5,2]\n       M = 2-0.5\n
Run Code Online (Sandbox Code Playgroud)\n

对于此示例,我得到相同的结果:

\n
----     85 VARIABLE x.L  \n\ni1 0.500,    i2 0.500,    i3 1.929\n\n\n----     85 VARIABLE z.L                   =        1.905  obj\n            VARIABLE mu.L                  =        0.976  mean\n            PARAMETER stdev                =        0.825  standard deviation\n     \n
Run Code Online (Sandbox Code Playgroud)\n

(通常解决方案不会完全相同)。

\n