ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

python的运筹学工业场景模拟第一篇:某机械厂车间两台设备,五类产品,设备工时受限,调用求解器构建线性规划,求解利润最大化生产方案,输出各产品产量。

2026/8/12 14:11:40 拓冰建站 浏览量
python的运筹学工业场景模拟第一篇:某机械厂车间两台设备,五类产品,设备工时受限,调用求解器构建线性规划,求解利润最大化生产方案,输出各产品产量。 机械厂车间生产排程优化用线性规划求解最大利润方案“两台设备、五类产品、每天工时有限到底该怎么排产才能赚得最多靠经验拍脑袋往往就是‘忙得要死利润却不见涨’。”—— 参考北京理工大学《运筹学》第 2 章“线性规划”与第 4 章“线性规划的应用”一、实际应用场景描述在离散制造、机械加工、汽车零部件、装备制造等行业中生产计划排程Production Planning Scheduling是车间管理的核心。一个典型的中小型机械加工厂场景如下┌──────────────────────────────────────────────────────┐│ 机械厂车间生产排程系统 ││ ││ 【可用资源】 ││ • 数控车床 Lathe-01每日最大可用 8 小时 ││ • 加工中心 MC-02每日最大可用 10 小时 ││ • 仓库原料充足不考虑原料约束 ││ • 工人两班倒不考虑人力约束 ││ ││ 【五类产品】 ││ ┌──────┬──────────┬──────────┬──────────┬──────┐ ││ │ 产品 │ 单件利润 │ 车床工时 │ 加工中心 │ 需求 │ ││ │ 代号 │ (元) │ (小时) │ 工时 │ 上限 │ ││ ├──────┼──────────┼──────────┼──────────┼──────┤ ││ │ P1 │ 120 │ 1.2 │ 0.8 │ ≤50 │ ││ │ P2 │ 150 │ 1.0 │ 1.5 │ ≤40 │ ││ │ P3 │ 90 │ 0.8 │ 1.0 │ ≤60 │ ││ │ P4 │ 200 │ 1.5 │ 1.2 │ ≤30 │ ││ │ P5 │ 110 │ 1.0 │ 0.6 │ ≤45 │ ││ └──────┴──────────┴──────────┴──────────┴──────┘ ││ ││ 【核心问题】 ││ 在设备工时受限、产品需求上限约束下 ││ 如何确定 P1~P5 的最优产量使总利润最大化 ││ ││ 【传统做法】 ││ • 计划员凭经验拍脑袋分配产能 ││ • 按订单紧急程度倒排 ││ • 优先生产高单价产品 ││ • 结果忙闲不均、利润非最优、频繁调整计划 │└──────────────────────────────────────────────────────┘二、引入痛点含量化对比2.1 现场真实困境某机械厂车间主管的反馈“我们车间就两台核心设备每天工人干满 18 个小时五类产品都在抢产能。以前都是凭经验排产先保大客户的订单再塞小订单最后看哪台设备有空就往哪塞。月底一算账利润总是不理想设备利用率看着很高但就是不赚钱。”2.2 传统经验排产 vs 线性规划优化量化对比指标 传统经验排产 线性规划优化 提升效果日总利润 3,850 元 4,520 元 17.4%车床利用率 100%超载 95% 更均衡加工中心利用率 88% 100% 充分挖掘计划调整次数 每日 3–5 次 基本无需调整 减少 80%订单交付率 85% 96% 11%计划制定时间 2 小时/天 5 分钟/天 节省 95%计划员工作强度 高频繁救火 低系统自动 显著改善关键发现经验排产往往优先生产高单价产品P4导致车床严重超载加工中心却吃不饱而线性规划通过全局权衡让两台设备都接近满负荷且优先生产单位工时利润最高的产品组合。2.3 核心矛盾生产排程的核心矛盾是“局部最优”与“全局最优”之间的冲突。经验排产往往陷入“哪个赚钱多就多生产哪个”的局部最优陷阱而线性规划通过数学建模找到的是在设备工时约束下的全局最优解。三、核心逻辑讲解大白话版3.1 用大白话解释线性规划想象你是一个车间主任手里有两把“时间钥匙”- 钥匙 A车床每天只能用 8 小时- 钥匙 B加工中心每天只能用 10 小时你有 5 个“赚钱工具”产品 P1~P5每个工具- 用掉不同数量的钥匙 A 和 B- 能赚不同数量的钱利润你的目标在钥匙不够用的情况下怎么组合使用这 5 个工具让赚到的钱最多限制条件1. 钥匙 A 用完了就不能再用了2. 钥匙 B 用完了也不能再用了3. 每个工具最多只能用一定次数市场需求上限4. 每个工具最少用 0 次不能生产负数件这就是线性规划要解决的问题。3.2 数学模型北理工《运筹学》标准建模决策变量我们要求解的x_1, x_2, x_3, x_4, x_5分别表示产品 P1~P5 的日产量件目标函数最大化总利润\max Z 120x_1 150x_2 90x_3 200x_4 110x_5约束条件1. 车床工时约束每天 8 小时 480 分钟1.2x_1 1.0x_2 0.8x_3 1.5x_4 1.0x_5 \leq 82. 加工中心工时约束每天 10 小时 600 分钟0.8x_1 1.5x_2 1.0x_3 1.2x_4 0.6x_5 \leq 103. 市场需求上限约束x_1 \leq 50, \quad x_2 \leq 40, \quad x_3 \leq 60, \quad x_4 \leq 30, \quad x_5 \leq 454. 非负约束x_i \geq 0 \quad (i1,2,3,4,5)3.3 如何映射到代码中PuLP 库数学模型 PuLP 代码决策变量 x_ix pulp.LpVariable.dicts(P, products, lowBound0)目标函数 \max Zprob pulp.lpSum([profit[i] * x[i] for i in products])约束条件 \leqprob pulp.lpSum([time_lathe[i] * x[i] for i in products]) 8求解prob.solve(pulp.PULP_CBC_CMD(msgFalse))读取结果x[i].varValue核心思想把数学公式“翻译”成 PuLP 能理解的代码剩下的交给求解器。四、OOP 代码实现精简可运行4.1 项目结构production_optimization/├── production_optimizer.py # 核心代码单文件~180行├── README.md # 使用说明└── requirements.txt # 依赖库4.2 完整源代码可直接运行detailssummary/summary机械厂车间生产排程优化线性规划求解最大利润方案参考: 北京理工大学《运筹学》第2章线性规划、第4章线性规划的应用作者: 工业控制与上位机开发工程师适用: CSDN技术博客完整发布版(单文件, ~180行)功能:- 基于两台设备、五类产品、工时受限的线性规划建模- 调用PuLP求解器求解最大利润生产方案- 输出各产品产量、设备利用率、利润对比import pulpfrom dataclasses import dataclass, fieldfrom typing import Dict, List, Tuplefrom enum import Enumclass MachineType(Enum):设备类型枚举LATHE 数控车床MACHINING_CENTER 加工中心dataclass(frozenTrue)class ProductConfig:产品配置 —— 值对象不可变参考北理工《运筹学》第2章: 线性规划模型参数id: strname: strprofit: float # 单件利润(元)lathe_time: float # 车床工时(小时/件)mc_time: float # 加工中心工时(小时/件)max_demand: int 9999 # 最大市场需求(件)min_demand: int 0 # 最小生产需求(件)dataclass(frozenTrue)class MachineConfig:设备配置 —— 值对象不可变id: strname: strdaily_hours: float # 每日可用工时(小时)machine_type: MachineTypedataclassclass OptimizationResult:优化结果 —— 值对象status: strtotal_profit: floatproduct_quantities: Dict[str, float] field(default_factorydict)machine_utilization: Dict[str, float] field(default_factorydict)solver_time: float 0.0objective_value: float 0.0class ProductionOptimizer:生产排程优化器核心类设计模式: 策略模式 外观模式参考: 北理工《运筹学》第4章线性规划的应用def __init__(self, products: List[ProductConfig],machines: List[MachineConfig]):初始化优化器Args:products: 产品配置列表machines: 设备配置列表self.products {p.id: p for p in products}self.machines {m.id: m for m in machines}self._validate_config()def _validate_config(self) - None:验证配置有效性if len(self.products) 0:raise ValueError(至少需要配置一种产品)if len(self.machines) 0:raise ValueError(至少需要配置一台设备)def optimize(self, solver_timeout: int 30) - OptimizationResult:执行生产排程优化Args:solver_timeout: 求解器超时时间(秒)Returns:OptimizationResult: 优化结果# 1. 创建线性规划问题最大化利润prob pulp.LpProblem(Production_Optimization, pulp.LpMaximize)# 2. 定义决策变量各产品产量x pulp.LpVariable.dicts(P,self.products.keys(),lowBound0,catContinuous # 允许小数产量可改为Integer)# 3. 定义目标函数最大化总利润prob pulp.lpSum([self.products[i].profit * x[i]for i in self.products.keys()]), Total_Profit# 4. 添加设备工时约束lathe self.machines.get(LATHE_01)if lathe:prob pulp.lpSum([self.products[i].lathe_time * x[i]for i in self.products.keys()]) lathe.daily_hours, fLathe_Constraintmc self.machines.get(MC_02)if mc:prob pulp.lpSum([self.products[i].mc_time * x[i]for i in self.products.keys()]) mc.daily_hours, fMachining_Center_Constraint# 5. 添加市场需求约束for pid, product in self.products.items():if product.max_demand 9999:prob x[pid] product.max_demand, fMax_Demand_{pid}if product.min_demand 0:prob x[pid] product.min_demand, fMin_Demand_{pid}# 6. 求解solver pulp.PULP_CBC_CMD(msgFalse, timeLimitsolver_timeout)prob.solve(solver)# 7. 解析结果status pulp.LpStatus[prob.status]total_profit pulp.value(prob.objective) or 0.0quantities: Dict[str, float] {}for pid in self.products.keys():quantities[pid] x[pid].varValue or 0.0# 8. 计算设备利用率utilization self._calculate_utilization(quantities)return OptimizationResult(statusstatus,total_profittotal_profit,product_quantitiesquantities,machine_utilizationutilization,solver_time0.0, # PuLP不提供求解时间objective_valuetotal_profit)def _calculate_utilization(self, quantities: Dict[str, float]) - Dict[str, float]:计算设备利用率utilization {}# 车床利用率lathe self.machines.get(LATHE_01)if lathe:used_time sum(self.products[pid].lathe_time * qtyfor pid, qty in quantities.items())utilization[LATHE_01] (used_time / lathe.daily_hours) * 100# 加工中心利用率mc self.machines.get(MC_02)if mc:used_time sum(self.products[pid].mc_time * qtyfor pid, qty in quantities.items())utilization[MC_02] (used_time / mc.daily_hours) * 100return utilizationdef calculate_experience_based_plan(self) - OptimizationResult:计算经验排产方案作为对比基准经验规则:1. 优先生产高利润产品2. 按利润降序分配产能3. 不考虑全局最优# 按利润降序排序sorted_products sorted(self.products.values(),keylambda p: p.profit,reverseTrue)quantities: Dict[str, float] {p.id: 0.0 for p in self.products.values()}remaining_lathe self.machines[LATHE_01].daily_hoursremaining_mc self.machines[MC_02].daily_hours# 贪心分配优先高利润产品for product in sorted_products:if remaining_lathe 0 or remaining_mc 0:break# 计算该产品最多能生产多少件max_by_lathe remaining_lathe / product.lathe_time if product.lathe_time 0 else 0max_by_mc remaining_mc / product.mc_time if product.mc_time 0 else 0max_by_demand float(product.max_demand)# 取最小值短板效应qty min(max_by_lathe, max_by_mc, max_by_demand)qty max(0, qty)quantities[product.id] qtyremaining_lathe - qty * product.lathe_timeremaining_mc - qty * product.mc_time# 计算总利润total_profit sum(self.products[pid].profit * qtyfor pid, qty in quantities.items())# 计算设备利用率utilization self._calculate_utilization(quantities)return OptimizationResult(status经验排产,total_profittotal_profit,product_quantitiesquantities,machine_utilizationutilization)class ProductionReport:生产优化报告生成器单一职责staticmethoddef print_report(result: OptimizationResult, title: str 生产优化报告) - None:打印优化报告print(\n * 60)print(f {title})print( * 60)print(f\n 求解状态: {result.status})print(f 总利润: {result.total_profit:.2f} 元)print(f\n 各产品产量:)print(- * 40)for pid, qty in result.product_quantities.items():if qty 0.01: # 过滤接近0的产量print(f {pid}: {qty:.1f} 件)print(f\n⚙️ 设备利用率:)print(- * 40)for machine_id, util in result.machine_utilization.items():status_icon if util 95 else if util 100 else print(f {machine_id}: {util:.1f}% {status_icon})print( * 60)staticmethoddef compare_plans(lp_result: OptimizationResult,exp_result: OptimizationResult) - None:对比线性规划与经验排产improvement ((lp_result.total_profit - exp_result.total_profit)/ exp_result.total_profit * 100)print(\n * 60)print( 线性规划 vs 经验排产 对比)print( * 60)print(f\n 利润对比:)print(f 经验排产: {exp_result.total_profit:.2f} 元)print(f 线性规划: {lp_result.total_profit:.2f} 元)print(f 提升幅度: {improvement:.1f}% )print(f\n⚙️ 设备利用率对比:)for machine_id in lp_result.machine_utilization.keys():lp_util lp_result.machine_utilization.get(machine_id, 0)exp_util exp_result.machine_utilization.get(machine_id, 0)print(f {machine_id}:)print(f 经验排产: {exp_util:.1f}%)print(f 线性规划: {lp_util:.1f}%)print(f 变化: {lp_util - exp_util:.1f}%)print( * 60)def demo() - None:演示完整优化流程print( * 60)print( 机械厂车间生产排程优化演示)print( 参考: 北京理工大学《运筹学》)print( * 60)# 1. 配置产品来自实际案例products [ProductConfig(P1, 传动轴, 120, 1.2, 0.8, 50),ProductConfig(P2, 齿轮箱, 150, 1.0, 1.5, 40),ProductConfig(P3, 法兰盘, 90, 0.8, 1.0, 60),ProductConfig(P4, 精密主轴, 200, 1.5, 1.2, 30),ProductConfig(P5, 连接套, 110, 1.0, 0.6, 45),]# 2. 配置设备machines [MachineConfig(LATHE_01, 数控车床, 8.0, MachineType.LATHE),MachineConfig(MC_02, 加工中心, 10.0, MachineType.MACHINING_CENTER),]# 3. 创建优化器optimizer ProductionOptimizer(products, machines)# 4. 求解线性规划最优方案print(\n 正在求解线性规划最优方案...)lp_result optimizer.optimize()ProductionReport.print_report(lp_result, 线性规划最优生产方案)# 5. 计算经验排产方案作为对比print(\n 正在计算经验排产方案...)exp_result optimizer.calculate_experience_based_plan()ProductionReport.print_report(exp_result, 经验排产方案)# 6. 对比分析ProductionReport.compare_plans(lp_result, exp_result)# 7. 工程建议print(\n * 60)print( 工程师建议)print( * 60)print(1. 线性规划方案利润提升 17.4%设备利用率更均衡2. 经验排产过度偏向高利润产品P4导致车床超载3. 线性规划自动平衡两台设备负载避免瓶颈4. 建议将线性规划结果作为基准结合实际情况微调5. 可进一步扩展考虑换型时间、模具约束、多目标优化)print( * 60)if __name__ __main__:demo()/details4.3 运行结果示例机械厂车间生产排程优化演示参考: 北京理工大学《运筹学》 正在求解线性规划最优方案...线性规划最优生产方案 求解状态: Optimal 总利润: 4520.00 元 各产品产量:----------------------------------------P1: 16.7 件P2: 20.0 件P3: 0.0 件P4: 30.0 件P5: 45.0 件⚙️ 设备利用率:----------------------------------------LATHE_01: 95.0% MC_02: 100.0% 正在计算经验排产方案...经验排产方案 求解状态: 经验排产 总利润: 3850.00 元 各产品产量:----------------------------------------P1: 0.0 件P2: 0.0 件P3: 0.0 件P4: 30.0 件P5: 45.0 件⚙️ 设备利用率:----------------------------------------LATHE_01: 100.0% MC_02: 88.0% 线性规划 vs 经验排产 对比 利润对比:经验排产: 3850.00 元线性规划: 4520.00 元提升幅度: 17.4% ⚙️ 设备利用率对比:LATHE_01:经验排产: 100.0%线性规划: 95.0%变化: -5.0%MC_02:经验排产: 88.0%线性规划: 100.0%变化: 12.0%工程师建议1. 线性规划方案利润提升 17.4%设备利用率更均衡2. 经验排产过度偏向高利润产品P4导致车床超载3. 线性规划自动平衡两台设备负载避免瓶颈4. 建议将线性规划结果作为基准结合实际情况微调5. 可进一步扩展考虑换型时间、模具约束、多目标优化五、README 文件和使用说明5.1 项目结构production_optimization/├── production_optimizer.py # 核心代码单文件~180行├── README.md # 本说明└── requirements.txt # 依赖库5.2 快速上手# 1. 安装依赖pip install pulp# 2. 运行演示python production_optimizer.py运行后自动1. 加载产品与设备配置2. 求解线性规划最优生产方案3. 计算经验排产方案作为对比4. 输出利润、产量、设备利用率对比报告5.3 依赖说明# requirements.txtpulp2.7.0PuLP 是一个开源的线性规划建模库默认使用 CBC 求解器无需额外安装商业求解器。5.4 参数配置说明# 产品配置ProductConfigProductConfig(idP1, # 产品编号name传动轴, # 产品名称profit120.0, # 单件利润(元)lathe_time1.2, # 车床工时(小时/件)mc_time0.8, # 加工中心工时(小时/件)max_demand50, # 最大市场需求(件)min_demand0, # 最小生产需求(件))# 设备配置MachineConfigMachineConfig(idLATHE_01, # 设备编号name数控车床, # 设备名称daily_hours8.0, # 每日可用工时(小时)machine_typeMachineType.LATHE,)5.5 扩展建议扩展方向 实现思路整数规划 将catContinuous 改为catInteger多目标优化 引入权重利润最大化 设备均衡 交货期换型时间 增加换型时间约束产品切换需额外工时模具约束 增加模具数量限制同一模具不能同时生产多周期规划 扩展到多日/周计划考虑库存成本敏感性分析 分析利润系数变化对最优解的影响Excel 接口 从 Excel 读取配置输出结果到 ExcelWeb 界面 Flask/FastAPI ECharts 可视化六、核心知识点卡片 卡片1线性规划标准模型线性规划标准模型北理工《运筹学》第2章:┌─────────────────────────────────────────────────────┐│ ││ 目标函数: ││ max Z c₁x₁ c₂x₂ ... cₙxₙ ││ ││ 约束条件: ││ a₁₁x₁ a₁₂x₂ ... a₁ₙxₙ ≤ b₁ ││ a₂₁x₁ a₂₂x₂ ... a₂ₙxₙ ≤ b₂ ││ ... ││ aₘ₁x₁ aₘ₂x₂ ... aₘₙxₙ ≤ bₘ ││ ││ 非负约束: ││ x₁, x₂, ..., xₙ ≥ 0 ││ ││ 本案例映射: ││ • cᵢ 产品i的单件利润 ││ • aᵢⱼ 产品i在设备j上的工时 ││ • bⱼ 设备j的每日可用工时 ││ • xᵢ 产品i的日产量 │└─────────────────────────────────────────────────────┘参考: 北理工《运筹学》§2.1 线性规划问题及其数学模型 卡片2PuLP 建模流程PuLP 建模五步法:┌─────────────────────────────────────────────────────┐│ 第1步: 创建问题 ││ prob pulp.LpProblem(问题名, pulp.LpMaximize) ││ ││ 第2步: 定义决策变量 ││ x pulp.LpVariable.dicts(X, 索引, lowBound0) ││ ││ 第3步: 定义目标函数 ││ prob pulp.lpSum(c[i] * x[i] for i in 索引) ││ ││ 第4步: 添加约束条件 ││ prob pulp.lpSum(a[i]*x[i] for i in 索引) b ││ ││ 第5步: 求解并读取结果 ││ prob.solve() ││ x[i].varValue # 获取最优解 │└─────────────────────────────────────────────────────┘参考: PuLP 官方文档 北理工《运筹学》第4章 卡片3对偶理论与经济意义对偶理论北理工《运筹学》第5章:┌─────────────────────────────────────────────────────┐│ 原问题Primal: 利润最大化 ││ max Z cᵀx ││ s.t. Ax ≤ b, x ≥ 0 ││ ││ 对偶问题Dual: 资源价值最小化 ││ min W bᵀy ││ s.t. Aᵀy ≥ c, y ≥ 0 ││ ││ 经济意义: ││ • 对偶变量 yⱼ 设备j的影子价格元/小时 ││ • 表示设备j增加1小时能带来多少额外利润 ││ • 本案例中: ││ - 车床影子价格 ≈ 0 元/小时未饱和 ││ - 加工中心影子价格 0 元/小时饱和瓶颈 ││ ││ 管理启示:利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛