MCM520 ← 资料站首页 电工杯 2025 B 优秀范文二:从单点方案到决策地图——中转失效解剖、容量升级经济学与需求波动下的鲁棒收运 打开交互阅读器 →

电工杯 2025 B 优秀范文二:从单点方案到决策地图——中转失效解剖、容量升级经济学与需求波动下的鲁棒收运

一、摘要

范文一给出了本网络的「最优单点方案」:最近邻 + 2-opt 构造各类垃圾路线,并比较了直运与中转两种策略,得到「本参数下中转不划算(节费率 −29.86%)」的结论。本文把视角从「选一个方案」升级为「画一张决策地图」,回答四个更贴近实际管理的问题:中转为什么失效?什么条件下会翻盘?钱该优先花在哪辆车身上?需求波动来了怎么办? 全部实验复用范文一的合成面板(30 个收集点、SEED=20250502)与成本参数,独立重写参数化求解器并断言基准数字逐项吻合(直运 3336.0 元 / 374.38 km;中转 4332.1 元 / 353.51 km),构成对范文一的交叉验证。核心发现有四条:其一,把中转的 996.1 元/日劣势拆成三项——装卸费 400.2 元 + 大车固定与里程 648.1 元 − 尾程收集节省仅 52.2 元,失效根源是收集趟数由车载容量决定而与终点无关,中转收取的是一笔「用不上的合并服务费」;2² 组合枚举显示四种策略在成本—碳平面上呈双前沿结构:直运赢成本(3336 元),厨余中转赢碳排(329.8 kg,比直运低 7.1 kg),但综合社会成本的碳价翻转点高达 73.4 元/kg,是现实碳价的数百倍——碳杠杆救不了中转。其二,车型容量升级是一张分化的处方单:可回收车 +25% 容量年省 9.18 万元(回收期 2.40 年)、厨余车年省 9.40 万元(2.77 年),而其他垃圾车回收期 41.6 年、有害车 411 年——设备投资必须按类排序而非全队换血。其三,蒙特卡洛 200 日实验表明按日均配车时 β=0.15 的温和波动已让厨余 73.5% 的天数需要应急增援;而按 +15% 裕度重新配车的方案 B 仅多花 14.8 元/日(+0.44%),就把全部四类的超载天数清零,期望日总成本从 3983.9 元降至 3350.8 元——裕度是最便宜的保险。其四,Clarke-Wright 节约算法(同配 2-opt)在两类测试上比最近邻再省里程 3.4%–13.7%,但趟数不变、定性结论全部不变,说明范文一的结论不依赖特定构造启发式。全文纯标准库、确定性复现,正文、配图、附录与真源四路数字一致。

二、问题重述

城市生活垃圾分类收运的决策者面对的不是一道静态考题,而是三类动态问题:设施与策略层面,中转站值不值得建、什么参数下值得建?碳交易价格上行会不会改变答案?装备层面,车队更新预算有限,先换哪类车?可靠性层面,各收集点产量天然波动,按平均值配置的车队有多少天会「装不下」?为此本文在范文一的直运/中转单点对比之上追加四个实验:① 把中转劣势做会计学分解,并用 2²=4 种逐类策略组合枚举绘制成本—碳平面,扫描碳价 τ∈[0,10] 元/kg 寻找策略翻转点;② 对四类车型的容量做倍率 λ∈[0.6,1.6] 扫描,叠加购置价与回收期计算,输出设备升级优先级;③ 以每点独立乘子 U(1−β,1+β) 刻画产量波动,β 从 0.05 扫到 0.50、每日重复 200 次,统计各类超载概率,并设计「按 +15% 裕度重新配车」的方案 B 与基准对决;④ 引入 Clarke-Wright 节约算法作为第二构造启发式,检验结论对算法选择的稳健性。

三、模型假设与符号

  • H1(面板同源):完全复用范文一的 30 点合成面板生成逻辑(同一随机种子同一调用顺序,逐点坐标与四类日产量逐一相同)、路网系数 1.2、时间窗 [6:00,12:00] 与全部成本/碳排参数,保证所有对比与范文一同口径。
  • H2(独立实现交叉验证):范文二求解器为独立重写的参数化版本(NN 构造 + 同强度 2-opt),运行首步即断言直运/中转的总成本与总里程和范文一输出一致(偏差 ≤0.1 元 / 0.01 km),作为后续一切实验的地基。
  • H3(应急口径):某日某类垃圾若任一路线装载超出车容,视为触发一次应急增援,应急成本 = 250 元/次 + 超出量×30 元/t;超载概率按「天」计——当日该类只要有一条线超载即记 1 天。
  • H4(升级口径):容量倍率实验只改变对应车型的载重上限,不改变路线数下界之外的网络结构;购置价设为厨余 26 万、可回收 22 万、其他 24 万、有害 15 万元/辆(量级参考国内压缩车市价),回收期 = 购置价 ÷(日节约 × 365)。

主要符号:λ\lambda 为容量倍率;β\beta 为需求波动半幅;τ\tau 为碳价(元/kg);Δ\Delta 为双中转相对直运的成本差;pc(β)p_c(\beta) 为类别 cc 在波动 β\beta 下的超载天数占比;TpayT_{\mathrm{pay}} 为购置回收期(年)。

四、方法:把一个「最优解」摊开成四张决策图

图1 从单点方案到决策地图

四个实验共用同一套底层件:参数化 CVRP 求解器(solve(cap, c, end_at),容量与终点模式均可注入)、统一评价器 eval_plan(一次返回成本/里程/工时/碳排与大车明细)、以及独立的蒙特卡洛引擎(固定种子 seed=77,200 日)。这种「求解—评价—扰动」三层分离让每个实验只改一层:策略实验改终点模式、装备实验改容量参数、可靠性实验改需求乘子。算法对照实验则替换第一层,以 Clarke-Wright 节约算法(按 sij=d0i+d0j−dijs_{ij}=d_{0i}+d_{0j}-d_{ij} 降序合并线路、容量约束内拼接,后接同样的 2-opt)重新构造厨余与可回收两类路线,与最近邻版逐项对比。

五、结果 I:中转失效的机理、双前沿与碳价边界

5.1 996 元的三项分解:一笔用不上的服务费

图2 中转劣势的三项分解

图 2 给出会计学分解:Δ = 996.1 = 装卸费 400.2 + 大车固定与里程 648.1 − 尾程节省 52.2。失效机理一目了然——中转带来的全部节省只有「收集车尾程改去就近中转站」省下的 52.2 元,因为收集趟数由车载容量决定,与终点无关:厨余 16.42 t、容量 5 t,无论卸在厂里还是中转站都得跑 4 趟。中转模式真正的经济性前提——「合并货源、减少收集趟数」——在本模型中从未被激活,于是装卸与大车的 1048.3 元成为纯粹的额外支出。这解释了范文一节费率为何是负的 −29.86%,也给出管理启示:要让中转划算,必须同时改造收集端的班次制度(小车卸空即返场复用),而不是只修一条专线。

5.2 双前沿结构:没有全能冠军

图3 成本-碳平面的四种组合

图 3 把 2² 种逐类组合铺在成本—碳平面上:直运(3336 元,336.9 kg)、其他中转(3811,345.9)、厨余中转(3857,329.8)、双中转(4332,338.7)。值得注意的是「其他中转」在两个维度上都被支配(更贵且碳更高——其大车专线最长),而厨余中转以 +521 元换 −7.1 kg 碳排,与直运构成帕累托前沿的两端。换言之,「中转一无是处」并不准确:若园区以碳排为独立考核指标(例如绿电园区自设碳中和目标),只对厨余开中转是一个真实的减碳选项。

5.3 碳价边界:73.4 元/kg 之外的现实世界

图4 碳价杠杆救不了中转

把碳价 τ 注入综合社会成本后(图 4),双中转与直运的差距从 τ=0 的 996.1 元单调走阔至 τ=10 的 1014.1 元——因为双中转的碳排(338.7 kg)本就高于直运(336.9 kg),碳价只会放大中转的劣势;τ 的全部扫描区间内最优策略始终是直运。唯一可能翻转的组合是「厨余中转 vs 直运」,其翻转点 τ* = 521 ÷ 7.1 ≈ 73.4 元/kg CO₂,而全国碳市场价格约为 0.07–0.1 元/kg——相差三个数量级。结论清晰:在可见的碳价水平下,碳杠杆不足以改变收运策略选择;减碳的正确路径是第五节的容量升级(趟数减少直接降碳),而非绕道中转。

六、结果 II:容量升级的设备经济学

6.1 倍率扫描:两条敏感曲线与两条平坦曲线

图5 容量倍率扫描

图 5 显示 λ 从 0.6 升到 1.6 时全站日成本的响应:厨余与可回收是敏感者——λ=1.25 时全站成本分别降至 3078 元与 3084 元(较基准 −7.7% / −7.5%),因为容量跨过临界点后趟数从 4 降到 3,每省一趟就是白拿 200 元固定成本;其他垃圾(基准 8 t 已够大)与有害垃圾(日产仅 2.05 t)的曲线几乎水平,容量再大也无活可合。

6.2 回收期排序:一张可以签字的采购清单

图6 升级年节约与回收期

叠加购置价后(图 6):可回收车 +25% 容量年省 9.18 万元、回收期 2.40 年;厨余车年省 9.40 万元、回收期 2.77 年——两项均在设备常规寿命的四分之一内回本,属于「应该马上签」的投资;其他垃圾车年省仅 0.58 万元(41.6 年)、有害车 0.04 万元(411 年),明确出局。这份排序把范文一「建议增大厨余车型」的定性敏感性分析(其 8 t 情景成本 802.9 元)落实为带资金时间观的采购顺序,也再次印证:降本的主杠杆在「趟数 × 固定成本」,凡不能减趟的升级都是沉没成本。

七、结果 III:需求波动的鲁棒调度与算法稳健性

7.1 波动是常态:超载概率的饱和形态

图7 需求波动下的超载概率

图 7 的 200 日蒙特卡洛揭示了一个被均值思维掩盖的事实:哪怕 β 只有 0.05(±5% 的温和波动),按日均配车的方案 A 已有 31%–52.5% 的天数在某类上触发应急;β=0.15 时厨余的超载天数达 73.5%。「其他」「有害」类曲线早早饱和于 0.445 与 0.42——它们只有 2 条路线且载荷率高,任何向下的波动冗余都不存在,向上波动几乎必然超载。均值方案的真实成本不是账面的 3336 元,而是含应急期望的 3983.9 元(β=0.15 世界),账面便宜了 16%,代价是把风险藏进了每一天的现场调度。

7.2 方案 B:14.8 元买断全部超载

图8 两方案在同一波动世界的对决

方案 B 只做一件事:规划时把有效容量除以 1.15 再重解(车辆不变、装得更松)。在 β=0.15 的同一波动世界里(图 8),它的表现是压倒性的:期望日总成本 3983.9 → 3350.8 元,四类超载天数占比全部归零。差额来源一目了然——方案 A 的期望里有 647.9 元/日的应急支出,方案 B 用 14.8 元/日的规划冗余(+0.44%)把它整体买断。原因在于裕度规划恰好把每条线的基准装载压到 0.87 cap,覆盖了 ±15% 波动的理论上界;而趟数在重解后并未增加(厨余 16.42 t 在 4.35 t 容量下仍可 4 趟装下),冗余几乎是免费的。管理含义:与其组建昂贵的应急梯队,不如在排线时系统性留出 15% 装载余量。

7.3 算法对照:结论不属于某个启发式

Clarke-Wright 节约算法(同样接 2-opt)给出更优解:厨余 95.25 km / 1038.1 元(最近邻版 110.19 km / 1075.5 元,里程差 −13.6%,成本差 −3.5%)、可回收 104.38 km / 1060.9 元(−12.2% / −3.3%)。两者趟数完全一致(均为 4 趟),因此固定成本、工时结构与全部定性结论——中转失效、容量分级、裕度价值——均不受影响。这说明范文一与本文的结论建立在网络结构性状之上,而非构造启发式的偶然产物;同时也提示后续工作可用 CW 或元启发式进一步压榨 3% 上下的里程空间。

八、结论与建议

  1. 中转站的正确打开方式:本网络中转劣势 996.1 元/日的根源是趟数与终点脱钩;除非同步改革收集班次(小车高频复用)或装卸费降至负补贴水平,否则不应新建中转专线。碳价即便涨至现实的数百倍也不改变此结论。
  2. 碳减排的可行抓手:若设独立碳目标,厨余单类中转是唯一有效的组合(−7.1 kg/日);更经济的路径是容量升级——厨余/可回收换大车既省钱又自然减趟降碳。
  3. 设备投资顺序:可回收车(2.40 年回本)→ 厨余车(2.77 年)→ 其他/有害放弃。预算有限时严格按此序执行。
  4. 鲁棒调度规范:排线一律按有效容量 = 标称容量 ÷ (1+β_design) 设计(β_design 取 0.15),以 0.44% 的规划溢价消除约六成的应急暴露;应急梯队仅保留给 β 超过设计值的极端日。
  5. 方法论提示:收运类赛题的结论应做「启发式无关性」检查——至少用两种构造算法交叉验证趟数与成本结构,避免把算法伪影当成网络性质。

九、模型验证(四路一致)

三重交叉验证:① 附录脚本独立导入真源重跑,基准数字(直运 3336.0 元 / 374.38 km,中转 4332.1 元 / 353.51 km)与范文一输出逐项吻合,构成跨真源互证;② 分解恒等式 400.2 + 648.1 − 52.2 = 996.1 精确闭合;③ 方案 B 的零超载结果经数学核对——裕度规划使各线基准装载 ≤ 0.87 cap,恰被 ±15% 波动上界覆盖,非数值巧合。蒙特卡洛引擎固定种子(seed=77)保证 200 日序列可复现。正文、配图、附录、真源四路数字一致。

参考文献

[1] 2025 年电工杯数学建模竞赛 B 题:城市垃圾分类运输的路径优化与调度问题(赛题原文,官方数据未公开)。

[2] 本站范文一:城市垃圾分类运输的路径优化与调度——CVRP 建模 + 直运/中转对比(assets/problems/papers/dgcup2025b-1.md)。

[3] Clarke G, Wright J W. Scheduling of vehicles from a central depot to a number of delivery points[J]. Operations Research, 1964, 12(4): 568–581.

[4] Toth P, Vigo D. Vehicle Routing: Problems, Methods, and Applications[M]. 2nd ed. SIAM, 2014.

附录:核心 Python 实现(可独立运行复现上述数字)

import sys, os
_HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.abspath(os.path.join(_HERE, "..", "..", "..", "tools")))
import gen_dgcup2025b_2 as H

R = H.gen_dgcup2025b_2()
print("基准交叉验证:", R["check"])
print("--- 中转劣势分解 ---")
print("gap=%(gap)s = 装卸 %(handle)s + 大车 %(trailer)s - 尾程节省 %(tail_save)s"
      % R["decomp"])
print("--- 组合枚举(成本/碳排/工时) ---")
for r in R["combos"]:
    print("%s: %.0f 元 / %.1f kg / %.1f h" % (r["name"], r["cost"],
                                              r["carbon"], r["hours"]))
print("碳价翻转点 tau*=%s 元/kg" % R["tau_flip_kitchen"])
print("--- 容量升级(+25%%档) ---")
for u in R["upgrade"]:
    print("%s: 日省%s 年省%s万 回收%s年"
          % (u["cls"], u["day_save"], u["year_save_wan"], u["payback_year"]))
print("--- MC 波动(beta=0.15 与极端 beta=0.50) ---")
m15 = next(m for m in R["mc_a"] if abs(m["beta"] - 0.15) < 1e-9)
m50 = R["mc_a"][-1]
print("beta=0.15: 超载率%s 期望总=%s" % (m15["overload_prob"],
                                         m15["total_expect"]))
print("beta=0.50: 超载率%s 期望总=%s" % (m50["overload_prob"],
                                         m50["total_expect"]))
b = R["mc_b15"]
print("方案B(+15%%裕度): 重配成本=%s 期望总=%s 超载率%s"
      % (b["replan_cost"], b["total_expect"], b["overload_prob"]))
print("--- CW vs NN(+2opt) ---")
for r in R["cw_compare"]:
    print("%s: NN %d趟/%skm/%s元 | CW %d趟/%skm/%s元"
          % (r["cls"], r["nn_routes"], r["nn_km"], r["nn_cost"],
             r["cw_routes"], r["cw_km"], r["cw_cost"]))