2026华东杯B题 — 医药物流派车调度与时空聚类优化

2026华东杯B题 — 医药物流派车调度与时空聚类优化

椿咲璃音 Lv2

第二十八届华东杯大学生数学建模邀请赛 B 题(Team B35)。本文针对医药物流企业的派车调度与运单聚类问题,构建了"数据清洗 → 全成本建模 → 时空聚类 → ALNS 自适应大邻域搜索"的四阶段求解体系。核心创新:ST-DBSCAN + ALNS 混合算法在 18.5 万运单、5 维多目标约束下,综合得分提升 75%,装载率从 21.7% 提升至 50.5%。


一、问题重述与分析

1.1 问题背景

某医药物流企业总部位于南通市崇川区,承担药品从多个仓库到各级医院的冷链运输任务。企业运营三种型号车队(4.2M / 7.6M / 9.6M),积累了三个自然月(2018 年 8 月—11 月)的运营数据:

  • 派车单数据(~1,000 条):包含车型、路线顺序、预计到货时间、托盘数
  • 运单数据(~185,000 条):包含物流单号、收货地址、温度类型、容积当量、调度时间

运单温度类型覆盖:冷链、常温、贵冷、贵重、麻精,其中冷链药品对运输车辆的温度属性有严格匹配要求。

当前痛点:派车方案存在装载率低、车辆数与货物量不匹配、温度属性混装等问题,亟需系统性的优化建模。

1.2 三个子问题

问题 任务描述 数据规模 核心方法
问题一 核算当前固定方案的运输成本,分析成本结构 ~1,000 条 全成本模型 + 高德 API 距离矩阵
问题二 基于时空特征优化派车方案,降低成本 ~1,000 条 ST-DBSCAN + 熵权法 + 模拟退火
问题三 对全量运单进行聚类分析,优化调度方案 ~185,000 条 ST-DBSCAN (cKDTree 加速) + AHP + ALNS

1.3 关键假设

编号 假设 依据
A1 两地间最短运输时间不随出发时段变化 高德 API 返回的是典型交通状况下的均值
A2 车辆在出发日 9:00 前完成装车,9:00 准时出发 行业惯例
A3 下午 15:00 后到达需等待至次日(装货需 2h,17:00 结束作业) 物流行业实操约束
A4 同型号车辆性能、油耗在不同路段保持一致 标准化假设
A5 所有订单在预计到货日期前一周已知且不更改 计划调度场景
A6 车辆完成配送任务后返回出发仓库 闭环路径

二、数据预处理

2.1 地址清洗

原始运单地址包含大量噪声:收件人姓名、手机号、派送路由码、楼栋楼层号等。构建多规则分层匹配清洗体系:

规则 正则/策略 示例
姓名 + 电话剥离 re.sub(r'/[一-鿿]{2,4}/\d{5,}.*', '', addr) 赵州镇工业街/张蒙/15354… → 赵州镇工业街
路由码去除 匹配 E3|N5|W1|[POS] 等前缀 E3北京市顺义区… → 北京市顺义区…
$ 分隔符处理 取后半段正式场所名 洪洞广胜寺(坊堆村杨智俊)$洪洞县广胜寺镇中心卫生院
楼层室号截断 re.sub(r'\d+[幢号楼]\d+[单元层]\d+室?', '', addr) 南京市来凤路23号百利华府6幢116室 → 南京市来凤路23号
中文括号清洗 去除 ()、【】 及内部标注 北京市朝阳区(原崇文区)… → 北京市朝阳区…
短地址挂靠 无省市信息的短地名 → 挂靠至仓库所在城市 骨二科 → 南通市崇川区 + 骨二科

清洗后得到 30,060 个有效地址(从 33,841 个去重地址中),无效地址标记为 COORD-FETCH-FAILED 并剔除。

2.2 地理编码与距离矩阵

调用高德地图 Web API 分两步完成:

  1. 地理编码:对清洗后地址批量请求经纬度。针对同名城市歧义 → 先正则提取行政区 → API 获取 adcode → 限定城市范围反查。
  2. 驾车导航距离:构建 和 的完整距离/时间矩阵。

将所有坐标缓存至 geocode_cache.json(约 8,630 条记录),避免重复 API 调用。

2.3 车型与托盘标准化

运单中的车型描述(如"金杯""箱货""4.2米")缺乏统一标准。建立车型 → 标准长度 → 托盘数映射表:

1
2
3
4
5
6
7
8
9
10
# chexing_map.py — 车型标准化映射
def model_to_detail(model_name):
# "金杯" 统一映射为品类中的最大车型
# "箱货" 有多款,取最大载重
mapping = {
'4.2M': {'capacity': 5, 'cold': True},
'7.6M': {'capacity': 11, 'cold': True},
'9.6M': {'capacity': 14, 'cold': True},
# ... 数十个品牌车型 → 标准映射
}

同时处理托盘 ↔ 箱 ↔ 件的单位换算(基于企业提供的换算表)。


三、问题一:全成本核算模型

3.1 成本构成

单次派车的总成本由四部分组成:

3.1.1 月均固定成本

依据广西交通运输厅标准文件,车辆月度固定成本包括折旧、保险、维保等:

3.1.2 人工日成本

在途天数 = 实际到货日期 实际提货日期,返程天数 = 从最后一个送货点返回仓库的行驶时间(取 ceil)。周末等待期照常计算人工。

3.1.3 里程成本

其中 从高德 API 距离矩阵直接查表, 为油耗 + 路桥费之和。

3.1.4 车辆数确定

3.2 车型成本参数

参数 4.2M 7.6M 9.6M
月固定成本 (元) 11,272 14,183 15,399
每公里变动 (元/km) 1.70 2.40 3.00
每日人工 (元/天) 600 600 800
最大托盘数 5 11 14
最大里程 (km) 300 3,500 4,500
年总成本 (元) 515,263 620,199 694,786
单位托盘成本 (元/托·km) 1.03 0.56 0.50

3.3 核算结果

月份 4.2M (辆) 7.6M (辆) 9.6M (辆) 总成本 (万元)
第1月 0 30 7 106.5
第2月 0 141 2 368.2
第3月 0 192 10 516.5

问题诊断:① 4.2M 小型车未被使用,"大车拉小货"浪费装载空间;② 里程成本与人工成本合计占比超 70%,是优化的主要发力点;③ 第2、3月需求量激增,但车辆配置未同步优化。


四、问题二:派车方案优化

4.1 派车单时空聚类 (ST-DBSCAN)

在优化之前,先对派车单进行时空聚类,识别具有"协同配送潜力"的订单群体。

样本特征向量:

其中 为收货地址经纬度, 为到货天数(相对于最早日期的偏移)。

时空邻域定义:

空间距离采用 Haversine 公式计算球面距离:

核心点判定:若 ,则 为核心点,与其邻域内所有点构成一个聚类簇。

参数设置: km, 周,(派车单数据量小,空间跨度大)。

4.2 熵权法车型选择

模拟退火的邻域变换中需要确定换车策略的概率。采用熵权法计算三种车型的综合得分,转化为选车概率。

步骤 1:构建决策矩阵(年总成本、单位托盘成本、托盘容量、变动成本):

车型 年总成本 (万) 单位托盘成本 (元/托·km) 托盘容量 变动成本 (万/年)
4.2M 51.53 1.0305 5 38.0
7.6M 62.02 0.5638 11 45.0
9.6M 69.48 0.4963 14 51.0

步骤 2:计算各指标的信息熵 和熵权 :

步骤 3:熵权结合 softmax 得到选车概率:

车型 固定成本熵权 变动成本熵权 托盘容量熵权 综合得分 softmax 概率
4.2M — — — 0.5545 39.3%
7.6M — — — 0.5478 38.0%
9.6M — — — 0.4455 22.8%

熵值越小 → 指标区分度越高 → 权重越大。固定成本指标的三车差异最大,权重最高(30.1%)。

4.3 模拟退火联合优化

以 ST-DBSCAN 聚类结果作为初始解,对每个簇独立运行模拟退火。

状态编码:解向量 ,其中 为车型, 为配送顺序列表, 为该线路所有预计到货日期的 。

邻域变换(等概率执行以下三种之一):

  1. 同车换序(70%):随机选一车,交换其中两个订单的配送顺序
  2. 跨车挪单(30%):从一车移除一个订单,随机插入另一车的某位置
  3. 随机换车:每次操作后以熵权概率重新采样车型

退火参数:

接受准则:若 则直接接受;否则以 概率接受劣解。

4.4 优化结果

月份 旧方案总成本 新方案总成本 优化幅度 新增 4.2M 车数
第1月 1,065,210 785,143 -26.3% 1 → 替代部分 7.6M
第2月 3,681,908 2,814,889 -23.5% 22 → 短途分流
第3月 5,165,180 4,110,972 -20.4% 22 → 短途分流

模拟退火收敛曲线

策略洞察:优化后 4.2M 小车被用于短途高频率配送,大车(7.6M / 9.6M)聚焦中长途批量运输,实现了"小车跑近路、大车跑远路"的合理分工。

4.5 鲁棒性检验

实际运输中行驶时间受交通路况影响,存在不确定性。采用蒙特卡洛扰动框架检验方案的准时率:

  • 对每条道路的行驶时间施加 的随机扰动
  • 从 1.0 到 1.5 扫描,每个 模拟 100 次
  • 装卸作业时间固定为 2h

鲁棒性检验

在 1.3 倍扰动范围内,准时率仍保持 > 85%,方案具有良好的抗干扰能力。


五、问题三:大规模 ALNS 多目标优化

5.1 任务规模与挑战

指标 数值
运单总数 185,124 条
运单明细行数 ~530,000 行
唯一地址数 30,060 个
车辆类型 11/12 托盘两种容量(冷藏/常温)
温度约束 冷链/常温/贵冷/贵重/麻精 五种

核心挑战:① 数据量远超传统 VRP 求解器容量;② 温度约束使车辆-运单匹配变为多类别分类问题;③ 多个优化目标存在冲突(装载 vs. 时效 vs. 温度适配)。

5.2 ST-DBSCAN 大规模加速

标准 ST-DBSCAN 的 复杂度无法处理 53 万行数据。三层加速策略:

第一层:唯一键压缩

对经纬度(保留 6 位小数,精度 ~0.1m)和时间(保留 3 位小数)进行精度截断,将原始 53 万行压缩为 ~5 万个唯一时空点。复杂度降为 。

第二层:cKDTree 空间索引

1
2
3
4
5
from scipy.spatial import cKDTree

eps_deg = 15 / 111.32 # 15 km → 度
tree = cKDTree(coords) # O(n log n) 构建
pairs = tree.query_pairs(r=eps_deg) # O(n log n) 检索邻居对

第三层:CSR 稀疏图 + BFS 扩展

将所有有效时空边存储为 Compressed Sparse Row (CSR) 格式邻接表,再进行 BFS 广度优先搜索扩展聚类。CSR 将稀疏图的存储从稠密矩阵的 压缩至 ( 为边数),内存占用降低 97%。

算法伪代码(Algorithm 3):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Algorithm: 基于 KDTree 与图压缩优化的 ST-DBSCAN

Input: 运单数据集 D, ε_s = 15 km, ε_t = 0.8 天, MinPts = 3
Output: 带簇标签的结果集 D_result, 聚类中心表 Centers

清洗 D, 过滤无效坐标与时间
生成去重特征键 Key ← [Round(φ), Round(λ), Round(t)]
按 Key 去重得唯一节点集 U_Nodes, 保留索引映射 Idx_Map
ε_deg ← ε_s / 111.32
基于 U_Nodes 空间坐标构建 cKDTree 索引树
空间查询: query_pairs(r=ε_deg) → Spatial_Pairs
Valid_Pairs ← ∅
for each (u, v) ∈ Spatial_Pairs do
if |t(u) - t(v)| ≤ ε_t then Valid_Pairs.append((u, v))
end for
Degree ← 各节点在 Valid_Pairs 中的连接数
Core_Mask ← (Degree ≥ MinPts - 1)
构建 CSR 格式邻接表 Adj
Labels ← {-1,...,-1}, Visited ← {False,...,False}
for each s ∈ U_Nodes do
if Core_Mask[s] and !Visited[s] then
BFS扩展: 将核心点 s 及其密度可达点标记为同一簇
边界点归入当前簇但不向下扩散
Cluster_ID++
end if
end for
通过 Idx_Map 将 U_Nodes 的 Labels 还原至 D_result
聚合 D_result 生成各簇均值, 汇总为 Centers 表

聚类参数:

参数 符号 取值 依据
空间阈值 15 km 城市配送范围,约 20 分钟车程
时间阈值 0.8 天 同一天的配送可合车
最小点数 3 低于 3 单的簇视为噪声/零散需求

5.3 聚类结果

时空聚类地理分布

簇编号 样本量 中心经度 中心纬度 特征
簇 0 127,845 121.15 31.23 上海及周边,配送量最大
簇 1 98,432 120.58 31.32 苏州-无锡-常州走廊
簇 2 85,321 121.47 31.20 浦东-崇明方向
簇 3 67,234 118.78 32.05 南京-马鞍山方向
簇 4 52,118 117.25 31.87 合肥及安徽中部
  • 长三角城市群贡献了约 40% 的运单量
  • 山河四省(河北、山西、山东、河南)合计约 20%
  • 时间维度呈周周期性,周一/周五为配送高峰
  • 噪声点占比约 12%,主要为偏远地区的零散订单

簇分布分析

5.4 VRP 数学建模

决策变量

  • :二元变量,车辆 从点 到点 则为 1
  • :二元变量,配送点 由车辆 服务则为 1

约束条件

装载约束:, 为车辆 的额定托盘数

时间窗约束:, 为到货时间窗口

路径唯一性:(每个送货点仅一辆车访问一次)

回路约束:(从仓库出发,返回仓库)

温度兼容:(冷链药品必须冷藏车配送)

目标:多车场异构车辆路径 (M-HFVRPTW)

问题三的实质是带软时间窗的多车场异构车辆路径问题 (Multi-Depot Heterogeneous Fleet VRP with Time Windows)。由于问题规模过大(),传统精确算法(分支定价、列生成)不可行,采用"先聚类后路径"的分解策略:ST-DBSCAN 将全量订单分解为独立簇 → ALNS 在每个簇内优化。

5.5 AHP 多目标权重

将五个异构优化目标整合为单一评价函数,采用层次分析法 (AHP):

Saaty 判断矩阵(1-9 标度):

装载率 L 里程 D 温度适配 T 非超载 O 准时率 P
装载率 L 1 2 1/6 3 1/3
里程 D 1/2 1 1/9 2 1/5
温度适配 T 6 9 1 9 2
非超载 O 1/3 1/2 1/9 1 1/6
准时率 P 3 5 1/2 6 1

一致性检验:

最终权重(特征值法):

目标 原始 AHP 权重 归一化后 含义
温度适配率 0.5166 0.3485 冷链药品绝不能常车配送
准时率 0.2766 0.2961 药品时效性刚需
装载率 0.1044 0.1535 经济性指标
里程 0.0609 0.1173 归一化
非超载率 0.0846 0.0846 安全底线

温度适配率权重最高——医药物流的冷链完整性是所有优化的首要前提。

5.6 多目标评价函数

其中 = 平均装载率 = , = 平均行驶里程 (km,Haversine 球面距离), = 温度适配率 = , = 非超载率 = , = 准时率。里程 是负向指标,通过 转化为正向得分。

5.7 ALNS 自适应大邻域搜索

在每个 ST-DBSCAN 簇内独立运行 ALNS,天然并行友好。

算法框架

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Algorithm 1: ALNS 调度优化算法

Require: ST-DBSCAN 聚类初始解 s₀, T₀ = 100.0, T_min = 0.05,
N = 500, 早停耐心 P = 80, 算子权重集 W
Ensure: 最优调度方案 s*

s ← s₀, s* ← s₀, T ← T₀
初始化破坏/修复算子权重及得分记录器
for iter = 1 to N do
轮盘赌选择破坏算子 d ∈ {随机, 装载, 温度} 和修复算子 r ∈ {贪心, 随机}
s' ← r(d(s)) // 含车型映射与时空约束检查
Δ = F(s') - F(s)
if Δ > 0 or exp(Δ/T) > random(0,1) then
s ← s'
if F(s) > F(s*) then s* ← s; 算子得分 +σ₁
else 算子得分 +σ₂
else
算子得分 +σ₃
end if
if iter mod 25 == 0 then
衰减因子 ρ = 0.82 更新算子权重
end if
T ← T × 0.932
if 连续 P 次无改进 then break
end for
return s*

破坏算子(3 个)

算子 策略 单次移除比例 目的
随机破坏 随机选 1~3 辆车,移除 10%-35% 运单 10-35% 全局探索多样性
装载破坏 选装载率偏离 0.85 最大的车,移除其运单 10-35% 修复低效/超载
温度破坏 选温度失配(冷链单在常车上)最多的车 10-35% 修复约束违规

修复算子(2 个)

算子 策略 复杂度
贪心修复 对每条移除运单,随机采样 25 辆候选车,选插入后得分最高者
随机修复 满足容积与温度约束的车辆中随机选一辆插入

插入得分函数:

其中 为插入后的新装载率, 为新增里程。

自适应权重更新

每 25 次迭代根据历史得分刷新轮盘赌权重:

衰减因子 ,得分规则:全局最优 +25,当前改善 +8,退火接受 +1。

性能优化

技术 说明 效果
LRU 距离缓存 @lru_cache(maxsize=4,000,000) 装饰 Haversine 计算 避免重复三角函数运算
惰性缓存 Vehicle 类仅在运单变化时重算装载率和里程 目标评价加速 ~5×
浅拷贝 运单对象不可变(__slots__),复制时仅拷贝车辆容器 内存 GC 压力降低 40-60%
CSR 邻接表 稀疏图压缩存储时空边 内存降 97%
HTML 仪表板 Chart.js 实时渲染优化进程 直观监控收敛过程

5.8 ALNS 优化结果

N=500 次迭代优化结果(总耗时约 4.7 小时,53 万行数据):

指标 优化前 优化后 变化
综合得分 0.060 0.105 +75.0%
平均装载率 21.73% 50.53% +132.5%
平均里程 (km) 1,074 981 -8.7%
平均行驶时间 (h) 15.15 13.97 -7.8%
超载率 0.00% 0.00% —
总车辆数 75,471 61,293 -18.8%
总运单数 185,124 185,124 —

N=100 次迭代的优化结果(用于快速验证):

指标 优化前 优化后 变化
综合得分 初始 显著提升 ↑
平均装载率 ~25.5% >40% ↑ 约 60%
平均里程 1,013 km 996.5 km -1.6%
超载率 24.5% 23.3% -4.9%
准时率 85.6% 85.95% +0.4%
温度适配率 97.8% 97.9% +0.1%

核心发现:

  1. 装载率提升是最大亮点:从 21.7% 到 50.5%,ALNS 通过重排运单序列、优化车型选择,使车辆空间利用效率翻倍
  2. 车辆数减少 14,178 辆(-18.8%),直接降低月固定成本约 25 万元
  3. 温度适配率在 97.8% 高基数上仍优化至 97.9%,满足冷链药品的严格合规要求
  4. 里程和行驶时间小幅下降(~8%),主要因为优化重点在装载率而非路径——医药物流的温度约束天然限制了路径合并的灵活度

六、模型评价

6.1 优点

  1. 分层架构合理:数据清洗 → 聚类 → 路径优化,各层职责清晰,可独立调优
  2. 规模可扩展:cKDTree + CSR 稀疏图的三层加速使 50 万+ 数据的时空聚类在数分钟内完成
  3. 多目标科学量化:AHP 一致性检验通过 (CR=0.015),温度适配权重体现了医药物流的核心价值观
  4. ALNS 自适应强:算子权重动态更新,不同簇的数据特征自适配不同的破坏/修复策略
  5. 实时监控:HTML 仪表板 + Chart.js 实现优化过程的实时可视化,便于调参
  6. 三层鲁棒性保障:蒙特卡洛扰动检验准时率 + 温度适配硬约束 + 超载惩罚机制

6.2 缺点与改进方向

  1. 准时率简化为常数(0.92),未来可接入真实的时间窗口计算和交通拥堵预测
  2. 簇间路线独立优化,相邻簇的配送路线可能有合并空间,可用 2-opt 或 LKH 进行后处理
  3. 农药、肥料等部分化工品在清洗时被剔除,这些零散订单可能有业务价值
  4. 仅用了 AHP 主观赋权,可引入熵权法或 CRITIC 进行客观权重修正,形成主客观组合赋权

6.3 模型推广

本模型的"聚类 + 优化"双阶段框架可推广至:

  • 生鲜冷链配送:替换温度约束为保鲜窗口
  • 快递末端揽派:替换装载率目标为派送时效
  • 危险品运输:替换温度匹配为隔离约束

附录 A:代码结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
B35/
├── Task1/ # 问题一
│ ├── amap_distance_crawler.py # 高德 API 距离爬虫
│ ├── 2.py # 坐标获取与补全
│ └── geocode_cache.json # 经纬度缓存
├── Task2/ # 问题二
│ ├── ST-DBSCAN-Task2.py # 派车单时空聚类
│ ├── Calulation.py # 成本/目标函数计算
│ ├── sa.py # 模拟退火核心
│ ├── examine.py # 鲁棒性蒙特卡洛检验
│ └── Draw.py # 路径图/装载率/饼图可视化
├── Task3/ # 问题三
│ ├── ST-DBSCAN-Task3.py # 53 万运单大规模聚类
│ └── ST-DBSCAN时空聚类(Task3)终稿/
├── alns_optimizer.py # ALNS 核心(自实现,~1300行)
│ ├── class Vehicle / Order / Solution
│ ├── 3 破坏算子 + 2 修复算子
│ ├── 轮盘赌自适应权重
│ └── HTML 实时监控仪表板
├── alns_solver.py # ALNS 求解器封装
├── Caluation.py # 成本模型
├── data_stract.py # 数据提取与清洗
├── chexing_map.py # 车型标准化映射
└── location_maps.py # 地址→经纬度映射

附录 B:完整论文


声明:本文为第二十八届华东杯大学生数学建模邀请赛 B 题的赛后整理(Team B35)。赛题数据来源为企业真实脱敏运营数据(2018 年 8 月-11 月),部分代码使用 AI 辅助完成(kimi-2.5pro / Claude 4.5)。

  • Title: 2026华东杯B题 — 医药物流派车调度与时空聚类优化
  • Author: 椿咲璃音
  • Created at : 2026-05-04 15:06:00
  • Updated at : 2026-08-09 15:54:05
  • Link: https://jackerytu.github.io/2026/05/04/2026华东杯B35-物流派车调度优化/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments