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

如何在PuLP中为运输类优化问题添加多目标函数?

解决方案及PuLP使用建议

一、次品标准差优化的实现方法

你遇到的AttributeError是因为numpy函数无法识别PuLP的符号变量表达式,必须手动用PuLP的原生语法构建方差/标准差的优化目标(最小化标准差等价于最小化方差,可避免平方根的非线性处理)。

核心思路

假设你需要最小化各车间月度次品产出的方差之和(实现次品产出的月度均衡),结合原有的最大化停产车间数量的目标,采用加权多目标优化方案:

  1. 定义每个车间的月度次品数均值变量;
  2. 手动构建方差的二次表达式;
  3. 用权重平衡两个目标的优先级。

修改后的关键代码

# 替换为你的实际次品率数据
defect_rates = {"shop0": 0.02, "shop1": 0.05, "shop2": 0.03, "shop3": 0.02, "shop4": 0.04}

# 调整问题类型为最大化(适配原停产目标)
prob = LpProblem("Optimization_distribution", LpMaximize)

# 定义每个车间的月度次品均值变量
mu = LpVariable.dicts("Mean_defect", shops, lowBound=0)

# 设置目标权重:w1控制停产优先级,w2控制次品均衡优先级
w1 = 100
w2 = 1

# 构建方差总和表达式:每个车间的月度次品数与均值的平方差之和
variance_sum = lpSum([
    lpSum([(defect_rates[s] * vars[s][m] - mu[s])**2 for m in months])
    for s in shops
])

# 加权目标函数:最大化停产数 + 最小化次品方差
prob += (
    w1 * lpSum([zero_vars[s][m] for (s, m) in routes]) - w2 * variance_sum,
    "Weighted_Objective",
)

# 添加均值约束:均值等于该车间月度次品数的平均值
for s in shops:
    prob += (
        mu[s] == lpSum([defect_rates[s] * vars[s][m] for m in months]) / len(months),
        f"Mean_defect_constraint_{s}",
    )

注意事项

  • 二次目标需要求解器支持二次规划,PuLP默认的CBC求解器可支持;若需要更高效的求解,可使用GUROBI、CPLEX等商业求解器(需授权)。
  • 若你的实际需求是最小化各车间全年次品数的标准差,但因车间年度总产量和次品率固定,该值为常数无需优化,建议重新明确需求(比如月度次品占比的均衡)。

二、优质PuLP学习资源建议

  1. 官方入门指南:从变量定义、约束构建、求解流程学起,覆盖线性规划基础场景;
  2. 实战案例教程:重点学习运输问题、生产调度类案例,这类场景和你的需求高度匹配,可快速掌握建模思路;
  3. 二次规划专题:学习如何用PuLP处理带平方项的目标/约束,解决方差最小化这类非线性优化问题;
  4. 多目标优化技巧:掌握加权法、目标规划法等多目标融合方式,适配复杂场景下的多需求平衡。

内容的提问来源于stack exchange,提问作者Konstantin M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:35:59