资讯动态

用Python+PuLP搞定钢管运输优化:手把手复现2000年数模国赛B题

发布时间:2026/8/21 22:59:00 来源:尧图企业网站定制
用PythonPuLP实现钢管运输优化数学建模实战指南当面对复杂的资源调度问题时数学建模往往能提供清晰的解决路径。2000年全国大学生数学建模竞赛B题钢管订购与运输就是一个经典的优化案例它模拟了西气东输工程中的实际挑战。本文将带你用现代Python工具链完整复现这个问题的解决方案。1. 问题理解与数据准备钢管运输问题的核心是在满足管道建设需求的前提下最小化总成本包括订购成本和运输成本。我们需要考虑以下约束条件7个钢厂的产能限制运输网络的路径成本各铺设点的钢管需求量钢管必须全部用完不允许剩余原始数据通常以表格形式呈现我们可以用pandas进行结构化处理import pandas as pd # 钢厂数据名称、产能(单位)、生产成本(元/单位) factories pd.DataFrame({ name: [S1, S2, S3, S4, S5, S6, S7], capacity: [800, 800, 1000, 2000, 2000, 2000, 3000], cost: [160, 155, 155, 160, 150, 155, 150] }) # 铺设点需求数据 demand_points pd.DataFrame({ name: [A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15], demand: [104, 301, 750, 606, 194, 205, 201, 680, 480, 300, 220, 210, 420, 500, 0] # A15为虚拟点 })运输成本矩阵可以表示为二维表格展示从每个钢厂到每个铺设点的单位运输成本钢厂\铺设点A1A2...A15S1170160...0...............S7290265...02. 建立线性规划模型PuLP是Python中用于线性规划的强大库它提供了直观的建模接口。我们需要定义决策变量、目标函数和约束条件。2.1 初始化模型from pulp import LpProblem, LpMinimize, LpVariable, lpSum, LpStatus # 创建问题实例 model LpProblem(Steel_Pipe_Transportation, LpMinimize) # 定义决策变量从钢厂i到铺设点j的运输量 transport {} for i in factories[name]: for j in demand_points[name]: transport[(i,j)] LpVariable(ftrans_{i}_{j}, lowBound0, catInteger) # 定义决策变量各钢厂的订购量 order {} for i in factories[name]: order[i] LpVariable(forder_{i}, lowBound0, upBoundfactories[factories[name]i][capacity].values[0], catInteger)2.2 构建目标函数总成本包括订购成本和运输成本两部分# 订购成本 order_cost lpSum([order[i] * factories[factories[name]i][cost].values[0] for i in factories[name]]) # 运输成本 transport_cost lpSum([transport[(i,j)] * get_transport_cost(i,j) for i in factories[name] for j in demand_points[name]]) # 设置目标函数最小化总成本 model order_cost transport_cost其中get_transport_cost(i,j)是获取运输成本的辅助函数可以根据实际数据实现。2.3 添加约束条件需求约束每个铺设点的需求必须被满足for j in demand_points[name]: model lpSum([transport[(i,j)] for i in factories[name]]) demand_points[demand_points[name]j][demand].values[0]供应约束每个钢厂的发货量不超过其订购量for i in factories[name]: model lpSum([transport[(i,j)] for j in demand_points[name]]) order[i]产能约束已通过变量定义中的upBound实现3. 模型求解与结果分析3.1 求解模型# 求解模型 model.solve() # 输出求解状态 print(f求解状态: {LpStatus[model.status]}) print(f最优总成本: {model.objective.value()}元)3.2 结果提取与展示我们可以将结果整理成更易读的格式# 提取订购方案 order_plan pd.DataFrame([(i, order[i].varValue) for i in factories[name]], columns[钢厂, 订购量]) # 提取运输方案 transport_plan [] for (i,j), var in transport.items(): if var.varValue 0: transport_plan.append({ 钢厂: i, 铺设点: j, 运输量: var.varValue, 运输成本: var.varValue * get_transport_cost(i,j) }) transport_plan pd.DataFrame(transport_plan)3.3 可视化分析使用matplotlib可以直观展示运输网络import matplotlib.pyplot as plt import networkx as nx # 创建图对象 G nx.DiGraph() # 添加节点和边 for _, row in transport_plan.iterrows(): if row[运输量] 0: G.add_edge(row[钢厂], row[铺设点], weightrow[运输量]) # 绘制网络图 plt.figure(figsize(12,8)) pos nx.spring_layout(G) nx.draw(G, pos, with_labelsTrue, node_size2000, node_colorskyblue, font_size10) edge_labels {(u,v): f{d[weight]} for u,v,d in G.edges(dataTrue)} nx.draw_networkx_edge_labels(G, pos, edge_labelsedge_labels) plt.title(钢管运输网络优化方案) plt.show()4. 模型优化与扩展4.1 灵敏度分析PuLP支持对模型进行灵敏度分析帮助我们理解参数变化对结果的影响# 检查约束的松弛情况 for name, constraint in model.constraints.items(): print(f{name}: 影子价格{constraint.pi}, 松弛量{constraint.slack}) # 检查变量的敏感性 for var in model.variables(): print(f{var.name}: 减少成本{var.dj})4.2 模型扩展实际问题可能更加复杂我们可以考虑以下扩展方向多阶段运输引入中转节点考虑铁路、公路等多种运输方式非线性成本当运输量达到一定规模时单位运输成本可能降低时间维度考虑不同时间点的生产和运输能力变化不确定性使用随机规划处理需求和成本的不确定性例如考虑运输折扣的模型调整# 定义分段运输成本 for (i,j), var in transport.items(): if var.varValue 1000: # 假设运输量超过1000单位有折扣 transport_cost var.varValue * (get_transport_cost(i,j) * 0.9) else: transport_cost var.varValue * get_transport_cost(i,j)4.3 性能优化技巧当问题规模较大时可以采取以下优化措施稀疏矩阵处理只创建实际存在的运输路径变量分解算法将大问题分解为多个子问题并行计算利用多核处理器加速求解# 稀疏变量创建示例 potential_routes [(S1,A1), (S2,A3), ...] # 只包含实际可能的路线 transport LpVariable.dicts(trans, potential_routes, lowBound0, catInteger)5. 工程实践建议在实际项目中应用此类优化模型时有几个关键点需要注意数据质量检查确保产能、需求和成本数据的准确性模型验证用小规模数据测试模型的正确性结果合理性检查验证最优解是否符合业务常识文档记录详细记录模型假设和参数选择依据一个常见的验证方法是固定部分变量观察目标函数的变化是否符合预期# 验证示例固定S1的订购量为800检查成本变化 with order[S1].fix(800): model.solve() print(f固定S1产量后的成本: {model.objective.value()})对于团队协作项目建议使用Jupyter Notebook或Python脚本配合版本控制系统如Git来管理代码和模型变更。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价