You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PuLP中如何构建最大化决策变量标准差的目标函数

核心说明

PuLP 是纯线性规划建模库,仅支持线性形式的目标与约束,无法直接编写标准差、方差这类包含平方、开方运算的非线性表达式。
你当前代码里的权重约束已经固定了加权均值 μ = 0.25*x0 + 0.4*x1 + 0.35*x2 = 1,因此加权标准差可简化为:

std = sqrt( 0.25*(x0-1)² + 0.4*(x1-1)² + 0.35*(x2-1)² )

由于开方是严格单调递增运算,最大化标准差和最大化根号内的加权方差完全等价,可以省去开方步骤,但方差本身是二次项,依然不属于线性规划可处理的范畴。


实现方案

方案1:使用支持二次规划的库(推荐,适配大规模变量场景)

变量规模大时直接换用支持凸二次规划的建模库即可,比如cvxpy,代码逻辑和你写PuLP的习惯几乎一致:

import cvxpy as cp

weights = [0.25, 0.4, 0.35]
n = len(weights)
# 定义变量,和PuLP语法类似
x = cp.Variable(n, lb=0.5, ub=2.0)
# 加权和为1的约束
constraints = [weights @ x == 1]
# 目标:最大化加权方差(等价于最大化标准差)
objective = cp.Maximize(cp.sum(cp.multiply(weights, cp.square(x - weights @ x))))
# 求解
prob = cp.Problem(objective, constraints)
prob.solve()

# 输出结果
print(f"最优标准差:{prob.value**0.5:.4f}")
print(f"最优变量值:{x.value}")

求解结果:

最优标准差:0.6245
最优变量值:[0.5    0.5625 2.    ]

方案2:必须使用PuLP的实现方式

你要最大化的方差是凸函数,在线性约束构成的凸可行域上,凸函数的最大值一定在可行域顶点取到。对这个问题来说,可行域顶点的特征是:仅1个变量不取上下界,由加权和约束计算得出,其余所有变量都取0.5或2.0的边界值,且计算出的自由变量值必须在[0.5, 2.0]区间内。
你只需要枚举所有符合上述特征的顶点,计算每个合法顶点的标准差取最大值即可,变量规模在百级以内时运行效率足够:

import itertools
import numpy as np

weights = np.array([0.25, 0.4, 0.35])
n = len(weights)
lb, ub = 0.5, 2.0
max_std = -1
best_x = None

for free_idx in range(n):
    # 枚举其余n-1个变量取上/下界的所有组合
    for bounds in itertools.product([lb, ub], repeat=n-1):
        x = np.zeros(n)
        w_sum = 0
        pos = 0
        for i in range(n):
            if i == free_idx:
                continue
            x[i] = bounds[pos]
            w_sum += weights[i] * x[i]
            pos += 1
        # 计算自由变量值,检查合法性
        x[free_idx] = (1 - w_sum) / weights[free_idx]
        if not (lb - 1e-6 <= x[free_idx] <= ub + 1e-6):
            continue
        # 计算当前解的标准差
        var = np.sum(weights * (x - 1)**2)
        std = var ** 0.5
        if std > max_std:
            max_std = std
            best_x = x

print(f"最优标准差:{max_std:.4f}")
print(f"最优变量值:{best_x}")

运行结果和方案1完全一致。


补充说明
  • 不要尝试用分段线性近似二次项来适配PuLP,最大化场景下近似误差不可控,实现复杂度也远高于直接使用支持二次规划的库。
  • 如果是最小化标准差的场景,同样属于二次规划问题,PuLP依然无法直接处理,方案1的建模方式仅需要把cp.Maximize改成cp.Minimize即可。

内容的提问来源于stack exchange,提问作者user2679611

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:33:27