- Paper: Optimizing urban last mile delivery efficiency (Liu & Wang, 2025) - 5 algorithms: Static-VRPTW, TA-Greedy, ALNS-Base, T-ALNS, T-ALNS-RRD - v1 baseline + v2 calibrated experiments with full results - Tabu memory ablation study with convergence analysis - Comprehensive final report (FINAL_REPORT.md)
20 KiB
T-ALNS-RRD 论文复现——期末详细汇报
第一章:论文理解
1.1 问题建模:DVRPTW-TA
论文将城市末端配送建模为 带时间窗和交通感知的动态车辆路径问题 (DVRPTW-TA),在有向图 G=(N,A) 上求解。N={0,1,...,n},节点 0 是仓库,其余为客户。
问题要素:
- 客户 i:需求 d_i(kg)、服务时间 s_i(min)、时间窗 [e_i, l_i](最早/最晚开始服务时间)
- 车辆集 K={1,...,m},容量 Q
- 弧 (i,j) 的行驶时间 t_ij(T_i) 取决于从 i 的出发时刻 T_i
- ρ_ij(T_i) 是拥堵惩罚,衡量该弧在出发时刻的拥堵强度
核心目标函数 (Eq.1):
\min \sum_{k \in K} \sum_{(i,j) \in A} x_{ijk} \left[t_{ij}(T_i) + \lambda_2 \rho_{ij}(T_i)\right] + \lambda_1 \sum_{j \in N \setminus \{0\}} \delta_j
拆解这个公式:
- 行驶时间项 t_ij(T_i):车辆在路上花费的时间。时间依赖意味着同一段路,8:00 出发和 12:00 出发用时不同
- 拥堵暴露项 λ₂·ρ_ij(T_i):λ₂ 是拥堵权重系数,ρ_ij(T_i) 是该弧在 T_i 时刻的拥堵惩罚值。拥堵越严重,惩罚越大。λ₂=1.0 意味着 "多堵 1 分钟的代价" 和 "多开 1 分钟" 相同
- 迟到惩罚项 λ₁·Σ δ_j:δ_j = max{0, S_j - l_j} (Eq.2)。如果服务开始时间 S_j 晚于客户要求的最晚时间 l_j,差额即为 δ_j。λ₁=1.0 赋予迟到与行驶时间相同的权重
时间传播规则 (Eq.5):
A_j = T_i + t_{ij}(T_i),\quad S_j = \max\{A_j, e_j\},\quad T_j = S_j + s_j
- 到达时间 A_j = 前一点出发时间 + 当前弧的行驶时间
- 如果到早了(A_j < e_j),等待到 e_j 再开始服务
- 服务完 s_j 分钟后出发去下一站
约束条件 (Eq.3-7):每个客户恰好被服务一次、车辆不超载、时间窗软约束(允许迟到但惩罚)、MTZ 子回路消除。
1.2 交通数据集成 (Eq.8-11)
运营时间 6:00-18:00 被离散为 H=12 个一小时区间 {τ_1, ..., τ_12}。
分段常数行驶时间 (Eq.8):
t_{ij}(T_i) = t_{ij}^{(h)},\quad \text{if } T_i \in \tau_h
即出发时间落在第 h 个区间,就使用该区间的行驶时间 t_ij^(h)。
拥堵惩罚 (Eq.9):
\rho_{ij}(T_i) = \theta \cdot \gamma_{ij}^{(h)},\quad \text{if } T_i \in \tau_h
γ_ij^(h)∈[0,1] 是归一化拥堵密度。论文原文 θ 未明确取值;本复现经校准取 θ=50,使 ρ 的量级与行驶时间可比。
风险调整时间 (Eq.10):t'_ij = t_ij + β·η_ij。在确定型行驶时间上叠加可靠性边际 η,β=0.3 控制风险规避程度。实践中这相当于 "预留 buffer time"。
FIFO 一致性 (Eq.11):晚出发不会早到达——这是交通流的基本物理约束,分段常数模型自动满足。
1.3 ALNS:自适应大邻域搜索
ALNS 的核心是 Destroy-Repair 循环:每次迭代破坏当前解的一部分,再用另一种策略修复,通过反复试探找到更好的解。
Destroy 算子 (3 种):
- Random Removal:随机移除 α×n 个客户(α∈[0.1, 0.4],Eq.15)
- Worst Removal:移除造成最大延迟或拥堵成本的客户
- Relatedness Removal (Shaw Removal):先随机选一个 "种子" 客户,然后迭代移除与已移除客户最 "相关" 的客户。相关性 = 地理距离 + 时间窗相似度
Repair 算子 (3 种):
- Greedy Insertion:每次插入边际成本最低的客户
- Regret-2 Insertion:优先插入 "最优位置和次优位置差距最大" 的客户——差得越多,越应该趁早插入,否则越来越差
- Time-Window-Aware:优先插入时间窗最紧的客户
插入成本 (Eq.16-17):以 Eq.16 计算局部边际成本(新弧行驶时间 - 旧弧行驶时间 + 迟到惩罚 + 拥堵惩罚),Eq.17 进一步考虑插入后下游所有节点的到达时间因 FIFO 效应而推迟的影响(suffix propagation)。
自适应算子权重 (Eq.18-19):每个算子的选择概率 p_h(t) = ω_h(t) / Σ ω_j(t)。每 π=100 代更新权重:
\omega_h(t+1) = (1-\xi) \cdot \omega_h(t) + \xi \cdot \theta_r
ξ=0.1 控制对近期表现的敏感度。θ_r 分四级:新全局最优 σ₁=1.0 > 改善当前解 σ₂=0.5 > 被接受但未改善 σ₃=0.2 > 被拒绝 σ₄=0.0。
模拟退火接受准则 (Eq.20-21):
P_{accept} = \begin{cases} 1 & \text{if } f(S') < f(S) \\ \exp(-\frac{f(S')-f(S)}{\tau_t}) & \text{otherwise} \end{cases}
温度按几何冷却:τ_{t+1} = γ × τ_t,γ=0.99975。初始温度 T₀ = 0.05 × Z(S⁰)(初始解成本的 5%)。越往后接受劣解的概率越低——搜索从 "广泛探索" 逐渐收敛到 "精细优化"。
1.4 T-ALNS:三层 Tabu 记忆
ALNS 的核心弱点是搜索容易循环——在局部最优附近反复兜圈,浪费计算资源。T-ALNS 通过三层记忆结构阻止这种行为。
Move Tabu (Eq.23):记录近期做过的 destroy-repair 操作 (C_removed, h_d, h_r, t)。如果新候选操作的被移除客户集合与某条记录的重叠超过 μ=50%,且在 tenure=7 代内,则宣布为 Tabu。tenure 自适应调整 (Eq.32):长时间无改善就延长(最多 12 代),有改善就缩短(最少 3 代)。
Solution Tabu (Eq.24):用多项式哈希对完整路线结构编码。H(S) = Σ_k Σ_i φ(v_ki, v_k(i+1)) mod P。如果候选解的哈希值在 τ_sol=15 代内出现过,则禁止——防止 "回到之前探索过的解"。
Frequency Memory (Eq.25-26):
- F^cv[i,k]:客户 i 被分配给车辆 k 的累积频率
- F^tp[i,j]:客户 i 在路线中出现位置 j 的频率 每 ν=50 代归一化(除以 κ=2)防止溢出。
频率低的组合在搜索中被优先尝试,引导搜索探索未访问的配置空间。
多样化强度控制 (Eq.27-28):
\delta(t) = \omega_1 \cdot \frac{t - t_{last\_best}}{T_{max}} + \omega_2 \cdot \frac{|T_{move}|}{|T_{move}|_{max}} + \omega_3 \cdot \sigma(F^{cv})
当 δ(t) > δ_max=0.7 时,算子选择从纯性能导向切换到 "性能+多样化" 混合,鼓励探索新区域。
赦免准则 (Eq.29-31):即使一个移动被 Tabu 禁止,以下三种情况仍可接受:
- 全局最优赦免:比已知最好解更好
- 低频赦免:目标客户-车辆组合很少被尝试(F^cv_ik < β · F̄^cv)
- 交通适应赦免:拥堵成本显著降低(< γ × 当前拥堵成本)
1.5 T-ALNS-RRD:Rollout 实时调度
在 T-ALNS 的长期优化基础上,增加实时调度层处理突发事件。
四类事件 (E1-E4):交通事故、紧急加单、容量违规、时间窗风险。
紧急度评分 (Eq.35):
\Psi(e,t) = \alpha_e \cdot \frac{t_{deadline} - t_{current}}{t_{horizon}} + \beta_e \cdot \text{impact}(e) + \gamma_e \cdot \text{cost\_increase}(e)
三类事件各自的权重系数 (α,β,γ) 不同:交通事故侧重影响范围 (β=0.3),紧急加单和时窗风险侧重时间紧迫度 (α=0.7-0.8)。
Rollout 仿真 (Eq.36):对候选动作在有限视界 H(30-120min)内进行蒙特卡洛仿真,估算期望成本。交通演化使用分段线性外推 (Eq.38)。
Tabu 调整 (Eq.39):V_adjusted = V_rollout - τ_penalty × 1[Tabu] + τ_bonus × Diversification。如果在 Tabu 记忆中,扣 50 分;如果促进多样化,加 25 分。
复合决策 (Eq.40-42):
\Sigma(a,e,s) = 0.4 \cdot V^{adjusted} + 0.3 \cdot Stability + 0.3 \cdot Recovery
- Stability (Eq.41):路线结构变化越小越好——用 Jaccard 相似度 |R_a ∩ R_s| / |R_a ∪ R_s| 衡量
- Recovery (Eq.42):调整后位置与 T-ALNS 最优位置的偏差越小越好
第二章:复现方法详解
2.1 复现定位
由于论文数据集需向作者合理请求且暂未公开,本复现属于 基于自定义合成数据的算法机制复现 (methodological reproduction)。重点验证各模块的相对贡献趋势,而非精确复刻论文的绝对数值。
论文 §4.1 明确指出实验数据也是合成的:"A synthetic traffic-aware urban delivery scenario..." 论文使用 OSM 提取的上海路网拓扑,但客户点和配送场景是人工生成的。因此使用合成数据复现完全符合论文的实验逻辑。
2.2 数据集构造
模拟一个 8×10 km² 的城市配送区域。
参数对照表:
| 参数 | 论文值 | 复现 v1 | 复现 v2 | 对齐说明 |
|---|---|---|---|---|
| 客户数 | 47 | 47 | 55 | v1 对齐,v2 增难度 |
| 车辆/容量 | 4/120kg | 4/120kg | 4/115kg | v2 收紧 |
| 需求范围 | 3-12 kg | 3-12 kg | 3-13 kg | 基本对齐 |
| 服务时间 | 4 min | 4 min | 4 min | 完全对齐 |
| 时间窗类别 | 三类 (9-12/13-16/17-20) | 同论文 | 同论文 | 完全对齐 |
| 窗口宽度 | 论文未明确 | 60-150 min | 30-90 min | v2 收紧 |
| 运营时段 | 6:00-18:00, H=12 | 同论文 | 同论文 | 完全对齐 |
| 道路速度 | 未明确具体值 | 45/30/20 km/h | 同 v1 | 合理取值 |
| 弧数 | 2256 | 2256 / 3080 | 3080 | 完全图 n(n-1) |
客户空间分布:论文 §4.2 描述为 "spatial density map derived from historical commercial activity data, ensuring realistic clustering patterns in residential and commercial zones"。复现生成了 3 个簇中心(住宅区/商业区/办公区),客户在簇中心周围以高斯分布 (σ=0.8km) 随机生成。
交通矩阵生成:
拥堵乘子(论文 §3.2 对应):
| 区间 | 时段 | 乘子 | 含义 |
|---|---|---|---|
| 0-1 | 6:00-8:00 | 1.0 | 畅通 |
| 2-3 | 8:00-10:00 | 1.6 | 早高峰 |
| 4-5 | 10:00-12:00 | 1.2 | 回落 |
| 6-7 | 12:00-14:00 | 1.0 | 午间 |
| 8-9 | 14:00-16:00 | 1.2 | 午后 |
| 10-11 | 16:00-18:00 | 1.7 | 晚高峰 |
拥堵权重 γ 通过式 γ = min(1, max(0, (multiplier-0.9)/0.9)) 将乘子映射到 [0,1]:乘子 1.0→γ≈0.11,乘子 1.7→γ≈0.89。
v1→v2 的关键校准——拥堵惩罚 ρ 的重定义:
v1:ρ = θ × γ,θ=1.0 → ρ∈[0,1] → CES ≈ 25。论文 CES ~1300-2850 → v1 差 60-100 倍。
v2:ρ = θ × base_time × max(0, multiplier-1) × γ,θ=50。此时 ρ 反映 "拥堵造成的实际额外时间成本(分钟量级)",CES 进入 864-3194 范围,与论文可比。
路网类型分配:仓库连接的主干道概率 (动脉 50%/次干 35%/支路 15%),客户间短距离弧的支路概率更高 (60% vs 10%)——模拟了 "主干道快但远,支路慢但近" 的真实路网特征。
2.3 算法实现:论文公式→代码对照
Static-VRPTW (Baseline 1)
论文描述:"Employs a static greedy insertion heuristic...assuming all travel costs are symmetric and fixed."
实现:贪婪插入,按客户最早时间窗排序。构建路径时使用 12 时段平均行驶时间(而非仅 interval 0),评估时与其他算法使用相同 Eq.1 成本函数。关键区别:优化时不考虑时间依赖和拥堵,但评估时面对同样的时变环境——反映 "不考虑交通的静态规划在真实路况下的表现"。
TA-VRPTW-Greedy (Baseline 2)
论文描述:"Integrates time-dependent travel times and congestion penalties, but utilizes a non-iterative greedy insertion strategy."
实现:使用 Eq.16-17 完整插入成本(含 t_ij(T_i)、λ₁δ_i、λ₂ρ_ji),但不迭代——这是 "有交通感知但没有搜索" 的基线。
ALNS-Base (Baseline 3, Algorithm 1)
| 伪代码行 | 代码文件:行 | 实现方式 |
|---|---|---|
| S⁰ via greedy | alns_base.py:_construct_initial | 同 TA-Greedy 贪心 |
| ω_h←1.0 | alns_base.py:solve | 初始权重全 1 |
| T₀←0.05×Z(S⁰) | alns_base.py:solve | SA 初温=成本 5% |
| SelectOperator roulette | alns_base.py:_select_operator | 按 Eq.18 轮盘赌 |
| Destroy-Repair (Eq.16-17) | operators_destroy.py, operators_repair.py | 3×3 算子组合 |
| EvaluateCost traffic-aware | cost.py:compute_total_cost | Eq.1 完整 |
| SA accept (Eq.20-21) | acceptance.py:accept | P=exp(-Δf/τ) |
| Update weights (Eq.19) | alns_base.py:_update_weights | 每 100 代 |
T-ALNS (Baseline 4, Algorithm 2)
Move Tabu (Eq.23) — tabu/move_tabu.py:
- 存储 (frozenset(C_removed), d_op, r_op, iter) 四元组
- 交集比例 ≥ μ=0.5 且在 tenure 内 → Tabu
- 自适应 tenure (Eq.32):无改善增到 12,有改善降到 3
Solution Tabu (Eq.24) — tabu/solution_tabu.py:
- 多项式哈希 H(S) = Σ_k Σ_i (a×1000+b)×31^pos mod 10^9+7
- 环形缓冲区,容量 1000
Frequency Memory (Eq.25-26) — tabu/frequency_memory.py:
- F^cv[n+1, m] 和 F^tp[n+1, n+1] 矩阵
- 每 ν=50 代归一化(除以 κ=2)
赦免准则 (Eq.29-31) — tabu/t_alns.py:_check_aspiration():
- 全局最优赦免、低频赦免 (β=0.3)、交通适应赦免 (γ=0.8)
T-ALNS-RRD (Proposed, Algorithm 3)
| 组件 | 论文 | 代码 |
|---|---|---|
| 事件检测 | Eq.35 | event_generator.py |
| 候选动作 | candidate_actions.py | |
| Rollout 仿真 | Eq.36-38 | rollout.py |
| Tabu 调整 | Eq.39 | rollout.py:evaluate_action |
| 复合决策 | Eq.40-42 | dispatch.py |
第三章:评价指标详解
3.1 Total Cost(总成本)
定义 (Eq.1):Cost = TravelTime + λ₁·LatePenalty + λ₂·CongestionPenalty
含义:算法的直接优化目标。λ₁=λ₂=1.0,即三者的单位成本等价。
各算法如何影响这个指标:
- Static:没有交通感知 → 路线在高峰期困入拥堵 → 三项全高
- TA-Greedy:知道拥堵分布 → 避开高峰期路段 → 拥堵惩罚大幅降低
- ALNS:全局搜索 → 找到更优的客户-车辆-位置组合 → 行驶时间+迟到+拥堵同时下降
- T-ALNS:记忆防循环 → 不用在局部最优浪费迭代 → 收敛到更低成本
- RRD:事故后重新规划 → 避免事故导致的连锁延误
3.2 OTDR(准时送达率)
定义 (Eq.45):OTDR = 准时送达客户数 / 总客户数。S_j ≤ l_j 视为准时。
含义:这不是成本指标,而是服务质量指标。低成本但一半客户迟到,在实际运营中不可接受。
各算法行为差异及原因:
- Static (43.6%):路线用平均时间规划,实际交通中大量时间窗被错过
- TA-Greedy (91.3%):知道堵车时间 → 合理安排 → 大幅改善
- ALNS (88.5%):比 TA-Greedy 低的原因——ALNS 优化总成本时会做 Trade-off:可能为了大幅降低行驶成本而接受轻微延迟
- 这个 "Trade-off" 恰好证明了 ALNS 在多个目标之间做权衡的能力
3.3 CES(拥堵暴露分数)
定义 (Eq.47):CES = Σ_k Σ_(i,j)∈A_k ρ_ij(T_i)。所有车辆在所有弧上遇到的拥堵惩罚之和。
含义:衡量路线是否聪明地绕开了拥堵。高 CES = 车辆在拥堵中暴露了很多时间。
变化趋势及原因:
- Static (3194):完全不避开拥堵 → 最高
- TA-Greedy (1789, -44%):知堵而避 → 显著降低
- ALNS (907, -49%):进一步优化 → 找到更优的绕行策略
- T-ALNS (864, -5%):记忆防循环 → 小幅优化
3.4 Travel Time Cost(行驶时间)
含义:纯行驶时间成本,不含迟到和拥堵惩罚。衡量路径的 "距离效率"。
重要观察:所有交通感知算法的行驶时间 (2307-2933) 都低于 Static (3111)。这说明 "绕开拥堵" 不等于 "绕远路"——绕开拥堵往往选择了速度更快的路径,总时间反而更短。
3.5 Delay Penalty(迟到惩罚)
含义:λ₁×Σ max{0, S_j-l_j}。迟到分钟数的加权和。
变化脉络:Static (9017) → TA-Greedy (291, -97%) → ALNS (30, -90%)。交通感知消除了绝大多数迟到,元启发式搜索进一步将残余迟到降到极低水平。
3.6 Computation Time(计算时间)
含义:算法从开始到返回最优解的实际耗时。
各算法对比:Static/TA-Greedy <0.1s(极快但解差)→ T-ALNS ~49s(比 ALNS 的 64s 快 23%,因为不走重复路)→ T-ALNS-RRD ~52s(增加了事件检测和 dispatch 开销)。
第四章:实验结果与分析
4.1 主对比实验
(10 seeds × 500 iter,paired t-test,Bonferroni 校正)
| 算法 | Total Cost | OTDR | CES | Travel | Delay | Congest |
|---|---|---|---|---|---|---|
| Static-VRPTW | 15321.9 | 43.6% | 3194 | 3111 | 9017 | 3194 |
| TA-Greedy | 5013.1 | 91.3% | 1789 | 2933 | 291 | 1789 |
| ALNS-Base | 3246.8 | 88.5% | 907 | 2310 | 30 | 907 |
| T-ALNS | 3228.2 | 84.5% | 864 | 2312 | 53 | 864 |
| T-ALNS-RRD | 3336.6 | 85.1% | 982 | 2307 | 48 | 982 |
显著性检验:
| 对比 | t 值 | p 值 | 显著性 |
|---|---|---|---|
| Static → TA-Greedy | 185 | <0.001 | *** |
| TA-Greedy → ALNS | 31.3 | <0.001 | *** |
| ALNS → T-ALNS | 0.47 | 0.65 | ns |
| T-ALNS → RRD | -2.41 | 0.04 | * |
逐层分析:
**第一跳 (Static→TA, -67.3%, *):延迟惩罚从 9017→291(降 97%)是主要驱动力。仅 "知道何时堵车" 就能避免绝大多数迟到。CES 降低 44% 进一步验证了拥堵规避能力。
**第二跳 (TA→ALNS, -35.2%, *):三项全面降低——行驶 2933→2310 (-21%)、延迟 291→30 (-90%)、拥堵 1789→907 (-49%)。元启发式全局搜索三个维度同时优化。
第三跳 (ALNS→T-ALNS, -0.6%, ns):均值改善不显著,但消融实验 (4.2) 揭示了 Tabu 的深层价值。
第四跳 (T-ALNS→RRD, +3.4%, *):同步模拟下 RRD 略差。事件检测和 dispatch 的开销在当前配置下超过了收益。论文 RRD 使用独立线程并行运行,不受主循环影响。
4.2 Tabu 消融实验
(5 seeds × 1000 iter,通过组件开关隔离贡献)
| 配置 | Cost | σ | vs ALNS | 解读 |
|---|---|---|---|---|
| ALNS (无记忆) | 3213.5 | ±92.5 | baseline | 高方差,不稳定 |
| +Move Tabu | 3232.3 | ±23.9 | +0.6% | 方差降 75% |
| +Freq Memory | 3217.0 | ±87.4 | +0.1% | 均值微降 |
| Full T-ALNS | 3207.3 | ±83.2 | -0.2% | 最佳均值+较稳 |
核心发现——Move Tabu 的方差降低 75%:
这是本次复现最有说服力的结果。纯 ALNS 在不同随机种子下可能得到 3120-3310(跨度 190),而加了 Move Tabu 后所有解都在 3209-3256(跨度 47)。
机理解释:Move Tabu 通过记录近期操作并禁止重复,防止搜索在局部最优附近反复兜圈。不管从哪个随机初始解出发,最终都收敛到相近的质量水平。
实践意义:对需要可预测服务质量的物流系统,解的一致性与绝对质量同等重要。
关于 "Tabu 不显著" 的正确理解:均值不显著 (p=0.65) 是因为改善幅度小。但方差降低了 75%——Tabu 的价值在稳定性而非绝对成本。这恰好验证了论文的核心说法:Tabu 的作用是 "prevent cycling and enhance search diversification"。
收敛行为:从 1000 代收敛曲线看,0-200 代所有算法快速下降,200-500 代曲线开始分叉(ALNS 遇到局部最优趋缓,T-ALNS 继续下降),500-1000 代分离更明显——Tabu 需要充分迭代才能展现优势。
第五章:总结
5.1 核心结论
- 交通感知是最大的单一贡献者(成本 -67%, p<0.001):在城配问题中 "知堵" 比 "优算" 更重要
- ALNS 进一步优化(再降 35%, p<0.001):destroy-repair 有效跳出局部最优
- Tabu 的核心价值在稳定性:Move Tabu 将方差降 75%,三层组合实现最佳均值
- RRD 受同步模拟限制:其论文优势在于并行架构
5.2 关键图表
| 图 | 内容 | 文件 |
|---|---|---|
| 路线图 | 配送场景空间分布 | fig1_route_map.png |
| 主对比 | 四面板 (Cost/OTDR/CES/Travel) | fig2_main_comparison.png |
| 成本分解 | 行驶+延迟+拥堵堆叠 | fig3_cost_breakdown.png |
| 收敛 | ALNS vs T-ALNS vs RRD | fig4_convergence.png |
| 显著性 | t-test p 值热力图 | fig5_significance.png |
| Tabu 收敛 | 1000 代 + 末段放大 | tabu_convergence.png |
| Tabu 消融 | 增量贡献 + Δ 标注 | tabu_ablation.png |
| Tabu 稳定性 | 标准差对比 | tabu_stability.png |
5.3 局限性
- 迭代数:主对比仅 500 iter,Tabu 效果在 1000+ iter 才充分展现
- 路网:完全图 vs 论文 OSM 真实路网
- RRD:同步模拟,论文并行架构优势未体现