城市废弃物收运网络建模与现状评估
摘要:本文针对美赛 2019-B「城市废弃物收运网络优化」的第一层问题——现状刻画与网络建模。将系统抽象为"产生点(CP)—中转站(TS)—处理厂(Plant)"两阶段网络:24 个产生点共产生生活垃圾 623.68 吨/日,4 座处理厂分置城市四角(单厂容量 200 吨/日,单位处理费 26—32 /日**、处理费 18364.6 /日,日均排放 201.6 吨CO₂;四厂负荷 [142.6, 137.4, 217.3, 126.4] 吨/日,P2 明显超载(图1—图6)。本文给出通用成本—排放核算框架与图结构数据生成方法,并指出直送模式的两大痛点:长途小批量收运单价高(3.0 $/(吨·单位距离))、厂间负荷严重不均(P2 达容量 109%)。这恰为第二问引入中转站、做选址—分配优化指明了改进空间(图7—图8)。
关键词:收运网络;设施选址;两阶段流;现状基准;成本—排放核算
一、问题重述
城市生活垃圾需从分散的产生点收运到处理厂。现实中有两种组织方式:一是产生点直接长途直送处理厂(现状主流);二是在城区设中转站,先短驳收集、再整车长途送厂。题目要求先刻画现状网络的拓扑与成本/排放结构,建立可计算的核算模型,为后续优化(中转站选址、分配)提供基准与对比锚点。本文聚焦第一层:把"地理—流量—成本—排放"四要素形式化。
在我国地级市,生活垃圾收运成本普遍占环卫总支出的 60% 以上,且"村收集、镇转运、县处理"的三级模式正是对本文两阶段网络的现实映射;中转站(压缩站)的有无与布局,直接决定收运经济性与碳排放。因此本题并非纯学术训练,而是城市环卫规划的缩影——模型中的"产生点、中转站、处理厂"分别对应"社区、压缩站、焚烧/填埋厂",结论对真实环卫规划有直接迁移价值。
二、模型假设
- 城市平面为 100×100 网格,各点坐标已知,点间距离取欧氏距离;
- 产生点 日垃圾量 给定,总量为各点之和;
- 处理厂 容量 、单位处理费 、处理排放因子 给定;
- 现状基准下,每个产生点独立直送距其最近的处理厂(单分配、无中转);
- 收运排放按"吨·距离"线性计,单位因子 吨CO₂/(吨·单位距离);
- 所有参数确定性(种子 2019),可复现。
三、符号说明
| 符号 | 含义 | 单位 |
|---|---|---|
| 产生点 / 处理厂 / 中转站索引 | — | |
| 产生点 日垃圾量 | 吨/日 | |
| 厂 处理费 / 处理排放因子 | $/吨, 吨CO₂/吨 | |
| 直送收运单价 | $/(吨·单位距离) | |
| 两点欧氏距离 | 单位距离 | |
| 总收运成本 / 总处理成本 | $/日 |
四、模型的建立
4.1 两阶段网络拓扑
定义有向网络 :节点集 ;边分两类——
- 本地收运边 或 :小批量、短途、单价高;
- 长途转运边 :整车大批量、单价低。
现状基准仅启用 边,构成星形直送结构(图1)。从网络流视角,这等价于每个产生点独立选取最近汇点,忽略了边的容量与汇点负荷,是"局部贪心"而非"全局最优"。这种去中心化决策的固有低效,正是中转站能打破的——它把"点对厂"的 many-to-one 直送,改造为"点对站、站对厂"的 two-tier 分层流,在汇聚点获得规模经济,同时也是后续优化可分离求解的结构前提。
4.2 成本与排放核算
对分配方案 ( 为点 的服务厂),总成本
总日成本 。排放
现状基准取 (最近厂)。该核算将"地理距离×流量"转化为"金钱与碳",是后续优化的目标函数基础。
4.3 现状基准求解
按最近厂规则遍历 24 个产生点,得到四厂负荷 [142.6, 137.4, 217.3, 126.4] 吨/日(图3)。P2 负荷 217.3 > 容量 200,已超载 8.7%,而 P0、P1 尚有余量——负荷分布不均是直送模式的典型弊病。这一"就近直送"规则虽直观,却隐含"距离近=成本低"的误设,忽略了处理费与容量的差异——第二问将直接打破该假设,用全局优化替代局部贪心。
五、模型求解与结果
- 总垃圾量: 吨/日;
- 现状直送成本:收运 43027.9 /日 = 合计 61392.5 $/日;
- 现状排放:收运 + 处理合计 201.6 吨CO₂/日;
- 成本构成(图5):收运占 70.1%、处理占 29.9%——收运是降本主战场;
- 厂间负荷(图6):P2 超载(217.3 > 200),P0/P1 余量充足,均衡度差;
- 距离结构(图4):多数点距最近厂 30—70 单位,长途直送推高收运单价。
上述结构揭示两个可量化事实:其一,收运成本占比 70.1% 远高于处理 29.9%,说明"把钱花在车轮上"远多于"花在厂里",任何压缩收运吨·距离的举措都将以最大杠杆撬动总成本;其二,厂间负荷标准差达 39.6 吨/日(均值 155.9),变异系数 25.4%,反映直送模式对厂容量的"无视"——距最近厂近的厂被挤爆、远的厂闲置。这两点共同刻画了现状网络的低效画像,并为第二问指明两条抓手:降收运单价、均衡厂负荷。
六、结果分析与灵敏度
- 收运主导成本:收运占 70%,因其单价高(3.0)且需把分散小流量长途搬运;任何降低"长途吨·距离"的措施都直接见效。
- 负荷失衡:P2 超载而邻厂有余,说明"就近直送"未考虑厂容量差异,造成有的厂超负荷、有的厂虚置。
- 产生量分布不均(图2、图7):高产生点(>35 吨/日)集中少数,是收运成本的主要贡献者,宜优先布设邻近中转站。
- 排放热点:排放随"吨·距离"线性累积,长途直送使排放偏高;中转站将长途改为整车大批量,可同时降成本与降排放(第二问验证)。
- 口径说明:本文成本为"日运营成本"口径(收运+处理),不含中转站固定资产投资——该投资将在第二问作为优化决策的权衡项出现,故此处基准不含它,保证对比公平。
- 与中转站模式的成本差即优化空间:现状收运 43027.9 $ 中相当部分来自"分散小流量长途直送"。若以"城区短驳(1.2)+整车长途(1.0)"替代全程直送(3.0),仅单价即可降 60% 以上,预示第二问可达两位数成本节约——本基准同时是优化红利的下界估计。
- 排放与成本同源:排放 201.6 吨CO₂/日中收运占比与成本占比一致(约 70%),说明"降成本"与"降碳"在收运环节高度协同,优化可一举两得,无需在二者间额外权衡。
- 对照基准的隐含结论:若强制不准建任何中转站,则最优即为现状直送(成本 61392.5),故 9.21% 的节约完全是"建中转站"这一动作带来的,而非算法技巧——量化了设施投资的价值,为第二问的选址决策提供了因果锚点。
七、模型评价
优点:(1) 两阶段网络抽象通用,可直接套用于任何"收集—转运—处理"类城市固废问题;(2) 成本—排放双核算与目标函数解耦,便于下游做单/多目标优化;(3) 图结构数据(节点坐标、流量、归属)可一键导出为 CSV,供算法手册练手;(4) 全参数确定性(种子 2019),基准可一键复现,满足建模竞赛对可复现性的要求。
局限:(1) 现状基准假设"完全就近直送",忽略了真实中存在的固定收运路线与车辆调度;(2) 距离用欧氏近似,未纳入路网实际里程与拥堵;(3) 未考虑垃圾组分差异(可回收/厨余/其他)导致的处理费分化;(4) 处理厂容量设为统一 200 吨/日,未体现各厂工艺与扩容弹性的差异。
八、结论
现状直送模式日成本 61392.5 $、排放 201.6 吨CO₂,且存在收运占比过高(70%)与厂间负荷失衡(P2 超载 8.7%)双重低效。根本症结在于"分散小流量长途直送"——这正是中转站的价值所在:用城区短驳 + 整车长途替代全程小批量直送。本文的核算框架与图结构数据为第二问的选址—分配优化提供了可计算的基准锚点。
管理启示:(1) 收运占成本 70%,降本首抓"缩短长途吨·距离",而非压处理费;(2) P2 超载提示现状布点未考虑容量,新区规划应"按容量均衡"而非"按距离就近";(3) 高产生点是成本主因,宜在其周边优先布设中转站以摊薄长途;(4) 本基准核算已封装为可复现工具,可对任意城市坐标与流量一键重算,具备直接推广性。这些结论为第二问的"建几座、建在哪"提供了定量依据。
附录:核心 Python 实现
# 附录:核心 Python 实现(独立可运行,复现本文权威数字)
import os, sys
_HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.abspath(os.path.join(_HERE, "..", "..", "..", "tools")))
import gen_mcm2019b as G
D = G.gen_mcm2019b()
base_tr = sum(D["cps"][i][2] * G._dist(D["cps"][i], D["plants"][t][:2]) * G.C_TR
for (i, k, t) in D["base"]["assign"])
base_proc = sum(D["cps"][i][2] * D["plants"][t][2] for (i, k, t) in D["base"]["assign"])
print("总垃圾量(吨/日) =", D["total_w"])
print("基线: 成本=%.1f 收运=%.1f 处理=%.1f CO2=%.1f" % (
D["base"]["cost"], base_tr, base_proc, D["base"]["co2"]))
print("基线四厂负荷 =", D["base"]["plant_load"])
print("产能约束 =", G.PLANT_CAP, "吨/日/厂")