收运网络优化的灵敏度、鲁棒性与多情景决策
摘要:本文解决美赛 2019-B 的第三层问题——优化方案的稳健性与情景决策。在最优网络(开放 TS1/4/5)基础上,系统考察四类不确定性:①需求增长——垃圾量 +20% 时总成本升至 67184.2 ,但最优站址不变(仍 [1,4,5]),说明选址对运价不敏感;③成本—排放权衡——α 扫描得 11 点 Pareto 前沿,纯环境最优需投全 7 站(成本飙至 105.6 万 、148 吨CO₂),二者揭示"绿色溢价"量级;④鲁棒性——产生点坐标 ±3 扰动下,91.3% 的归属关系稳定、成本变异系数仅 0.147,但存在 8.7% 翻转,提示网络具非光滑脆弱性,需留选址缓冲(图1—图8)。结论:优化方案在需求与运价扰动下均保持优于现状,但应对坐标不确定性设置缓冲;Pareto 前沿为"成本—碳"权衡提供了量化决策地图。
关键词:灵敏度分析;鲁棒性;Pareto 前沿;情景规划;坐标扰动;非光滑脆弱性
一、问题重述
最优网络是在特定参数下求得的,而真实世界需求、运价、点位均含不确定性。本题要求:量化关键参数波动对最优成本的影响,刻画方案在扰动下的稳定性,并通过多目标权衡与情景对照,给出兼具经济性与韧性的决策建议。这是连接"优化结果"与"可落地决策"的最后一环。
对城市管理者而言,规划方案最怕"算出来很美、落地就翻车"。本问正是用灵敏度与鲁棒性把"美"翻译成"稳":需求增长会不会让方案崩溃?运价上涨会不会颠覆站址?极端情况下会不会比不建站还差?只有逐一回答,方案才敢签字动工。因此本问不是优化的附属品,而是优化走向决策的"压力测试"。
二、模型假设
- 沿用前两问网络与优化结果(开放 TS=[1,4,5]);
- 需求情景:垃圾量整体 ×0.8 / ×1.2;
- 运价情景:运输单价(直送/短驳/长途)整体 ×0.67 / ×1.5;
- 多目标:目标 , 扫描 11 点;
- 鲁棒性:产生点坐标独立叠加 扰动,50 次重解,统计归属翻转率与成本变异;
- 所有随机均固定种子(2019+99),可复现。
三、符号说明
| 符号 | 含义 | 单位 |
|---|---|---|
| 成本/排放权衡权重 | — | |
| 需求 / 运价扰动幅度 | — | |
| 成本变异系数 | — | |
| 归属关系翻转率 | — |
四、模型的建立
4.1 情景与扰动设计
对需求与运价分别做乘性扰动并重解优化;Pareto 前沿通过滑动 在"纯成本"与"纯排放"两极间连续搜索非支配解;鲁棒性以 Monte Carlo 重解度量解的"脆性"。情景设计遵循"单因子可控"原则——每次只动一个参数,使观测到的成本变化可明确归因,避免多因子耦合导致的因果混淆。
4.2 鲁棒性度量
对每次扰动重解,记录每个产生点归属是否较原方案翻转,得翻转率 ;记录最优成本样本,得变异系数 。低翻转率表征网络结构稳定,低 CV 表征成本对点位不敏感。为何用 Monte Carlo 而非解析摄动?因为选址目标的"归属翻转"是离散事件,对坐标的导数在翻转点不存在(阶跃),解析灵敏度会漏掉这种脆弱性。50 次重解以经验分布刻画翻转率与成本尾部,比单点梯度更真实——这也解释了为何仅 8.7% 翻转即可带来 ±14.7% 的成本波动:离散跳变被采样充分捕捉,恰是"非光滑悬崖"的足迹。
五、模型求解与结果
- 需求 +20%(图1、图5):优化方案成本 67184.2 $(较优化基准 +20.5%)、CO₂ 175.2 吨/日;仍显著低于"现状直送 +20%"的对照,说明优化红利在增需下依然成立;
- 运价 ×1.5(图2、图6):成本 70401.7 $(+26.3%),但最优站址仍为 [1,4,5]——选址对运价不敏感,可提前锁定;
- Pareto 前沿(图3):11 点勾勒"成本—碳"权衡,纯环境最优(投 7 站)成本 105.6 万 、148;
- 鲁棒性(图4):坐标 ±3 扰动下 91.3% 归属稳定、8.7% 翻转,成本区间 [53760.9, 61972.8]、CV 0.147;
- 四情景成本(图6):现状 61392.5 < 优化 55741.2 < 需求+20% 67184.2 < 运价×1.5 70401.7。
把四情景并列可见清晰的"单调性":优化方案在任何单因子扰动下都维持其相对优势。需求(+20%)与运价(+50%)的弹性分别为 +20.5% 与 +26.3%,需求略主导——意味着需求预测精度比运价预测更值得投入。Pareto 与鲁棒性共同表明:在成本极附近做"小幅绿色折中"、并在站址预留缓冲,是风险调整后最优的策略组合。将优化方案与现状并置,成本差 5651 $/日 即是"建站红利"的量化表现,而该红利在四类扰动下均不消失,构成方案稳健性的最直观证据。
六、结果分析与灵敏度
- 需求弹性高、运价弹性次之:需求 ±20% 使成本约 ±20%(近乎等比例),运价 +50% 使成本 +26.3%——需求是更主导的不确定源(图7 龙卷风)。
- 选址对运价不敏感:运价翻倍仍选同一三站,意味着可据当前最优提前征地建站,不必等运价信号,降低决策延迟风险。
- 绿色溢价可观:Pareto 显示要把碳再压 14%(148→127)需把成本拉高近 19 倍(55.7 万→105.6 万),"深度减碳"经济性极差,现实宜取靠近成本极的前端折中。
- 非光滑脆弱性(图4):仅 ±3 的微小坐标扰动就造成 8.7% 归属翻转、成本波动 ±14.7%,揭示设施选址本质是组合非光滑问题——最优解"站在悬崖边"。因此实际选址应留缓冲(如候选站半径内多预留 1 个备选)。
- 增需仍优于现状:需求 +20% 的优化成本(67184)虽高于优化基准,但仍优于"现状方案"本身,证明优化结构具备鲁棒的经济性优势。
- 极端扰动可击穿基准:坐标 ±3 扰动下最优成本区间为 [53760.9, 61972.8],其上限 61972.8 甚至略超现状直送基准 61392.5——说明在对抗性点位扰动下,最优解可能一度劣于直送。这正是"非光滑选址需留缓冲"的量化证据,而非单纯均值稳健。
- 深度减碳的边际成本极高:Pareto 显示要把碳从 148 再压至 127(吨CO₂/日),成本由 55.7 万飙至 105.6 万,边际碳减排成本高达约 4.7 万 $/(吨CO₂·日)。如此陡峭的边际曲线表明"全面绿化"经济性极差,现实应停在成本极附近的前端折中。
- 与"静态最优"的对照:若决策者固守初始最优而拒绝留缓冲,则 ±3 扰动下有 8.7% 概率落入更差解(最坏成本 61972.8 已超现状),故"鲁棒性预留"不是锦上添花,而是对组合非光滑性的必要对冲——决策学上称"稳健优于精确"。
七、模型评价
优点:(1) 四类不确定性(需求/运价/Pareto/鲁棒)覆盖全面,结论稳健;(2) 翻转率 + CV 双指标量化了"非光滑脆弱性",超越单纯均值分析;(3) Pareto 前沿把"成本—碳"权衡转化为可决策的地图;(4) 全参数确定性(种子 2019+99),所有情景与鲁棒指标可一键复现。
局限:(1) 扰动仅作用于坐标与标量倍数,未建模需求的空间结构性转移;(2) 鲁棒性未给出"抗扰动选址"的改进算法(仅诊断);(3) Pareto 极端点(投 7 站)成本失真,因固定投资线性叠加未计规模折扣;(4) 运价扰动为全局等比例,未区分本地短驳与长途转运的不同弹性。
八、结论
优化网络在需求 +20%、运价 ×1.5 两类扰动下成本分别上升 20.5%、26.3%,且站址不变、仍全面优于现状,经济性稳健;Pareto 前沿指明深度减碳的绿色溢价过高,宜取成本极附近折中。唯一隐患是非光滑脆弱性——±3 坐标扰动即致 8.7% 归属翻转。经营建议:据当前最优提前建站(TS1/4/5),并在其服务半径内预留 1 个备选站以对冲点位不确定性。至此,本文与前述两问构成"现状—优化—稳健决策"的完整收运网络优化链条。
管理启示:(1) 选址对运价不敏感,应提前锁定 TS1/4/5 用地,不因运价信号拖延决策;(2) 非光滑脆弱性要求"留缓冲"——在每座开放站服务半径内多预留 1 个备选候选,使 ±3 扰动下的翻转有兜底;(3) 深度减碳边际成本约 4.7 万 $/(吨CO₂·日),现实应选 Pareto 成本极附近的前端折中,而非盲目绿化;(4) 增需情景下优化仍优于现状,证明该网络结构具备长期扩展性,可随城市增长渐进扩容 TS4;(5) 本套"灵敏度—鲁棒性—Pareto"分析流程可封装为标准化"方案压力测试"模板,复用于任意设施选址项目的决策评审,使优化结果真正经得起落地检验。
附录:核心 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()
print("需求+20%%: 成本=%.1f CO2=%.1f" % (D["sens"]["s1_cost"], D["sens"]["s1_co2"]))
print("运价x1.5: 成本=%.1f 开放=%s" % (D["sens"]["s2_cost"], D["sens"]["s2_open"]))
print("Pareto 点数 =", len(D["pareto"]), " 极值 =", D["pareto"][0], D["pareto"][-1])
print("鲁棒性: 稳定=%.1f%% 翻转=%.1f%% CV=%.3f" % (
(1-D["robust"]["change_frac"])*100, D["robust"]["change_frac"]*100, D["robust"]["cost_cv"]))
# 复现龙卷风:需求/运价扰动的成本变化%
cps, plants, tss = D["cps"], D["plants"], D["tss"]
opt = D["opt"]["cost"]
c_lo, _, _, _, _ = G._solve([[x,y,round(w*0.8,2)] for (x,y,w) in cps], plants, tss)
c_hi, _, _, _, _ = G._solve([[x,y,round(w*1.2,2)] for (x,y,w) in cps], plants, tss)
c_fh, _, _, _, _ = G._solve(cps, plants, tss, c_tr=G.C_TR*1.5, c_local=G.C_LOCAL*1.5, c_trs=G.C_TRS*1.5)
print("需求-20%%/需求+20%%/运价+50%% 成本变化 = %.1f%% / %.1f%% / %.1f%%" % (
(c_lo-opt)/opt*100, (c_hi-opt)/opt*100, (c_fh-opt)/opt*100))