- 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)
117 lines
4.8 KiB
Markdown
117 lines
4.8 KiB
Markdown
# T-ALNS-RRD Reproduction
|
||
|
||
Reproduction of the paper **"Optimizing urban last mile delivery efficiency through dynamic vehicle routing heuristics and traffic flow analysis"** (Liu & Wang, 2025).
|
||
|
||
## Overview
|
||
|
||
This project reproduces the core algorithmic framework of T-ALNS-RRD using a **custom synthetic dataset** (methodological reproduction). The reproduction validates the following trends:
|
||
|
||
1. Traffic-aware cost reduces congestion exposure
|
||
2. ALNS provides further cost reduction over greedy heuristics
|
||
3. Tabu memory improves solution stability
|
||
4. RRD real-time dispatch handles disruption events
|
||
|
||
## Project Structure
|
||
|
||
```
|
||
t_alns_rrd_reproduction/
|
||
├── configs/default.yaml # All parameters (aligned with paper)
|
||
├── src/
|
||
│ ├── data_generator.py # Synthetic data generation
|
||
│ ├── problem.py # DVRPTW-TA formulation
|
||
│ ├── cost.py # Cost functions (Eq.1, Eq.16-17)
|
||
│ ├── baselines/
|
||
│ │ ├── static_vrptw.py # Static VRPTW greedy
|
||
│ │ └── ta_greedy.py # Traffic-aware greedy
|
||
│ ├── alns/
|
||
│ │ ├── operators_destroy.py # Destroy operators (random/worst/related)
|
||
│ │ ├── operators_repair.py # Repair operators (greedy/regret2/time-window)
|
||
│ │ ├── acceptance.py # Simulated annealing
|
||
│ │ └── alns_base.py # ALNS-Base (Algorithm 1)
|
||
│ ├── tabu/
|
||
│ │ ├── move_tabu.py # Move-based Tabu (Eq.22-23)
|
||
│ │ ├── solution_tabu.py # Solution hash memory (Eq.24)
|
||
│ │ ├── frequency_memory.py # Frequency matrices (Eq.25-26)
|
||
│ │ └── t_alns.py # T-ALNS (Algorithm 2)
|
||
│ ├── rrd/
|
||
│ │ ├── event_generator.py # Event detection (Eq.35)
|
||
│ │ ├── candidate_actions.py # Action generation
|
||
│ │ ├── rollout.py # Rollout simulation (Eq.36-39)
|
||
│ │ ├── dispatch.py # Dispatch decision (Eq.40-42)
|
||
│ │ └── t_alns_rrd.py # T-ALNS-RRD (Algorithm 3)
|
||
│ ├── experiments/
|
||
│ │ └── run_main_comparison.py
|
||
│ └── visualization/
|
||
│ └── plot_results.py
|
||
├── data/synthetic/ # Generated datasets
|
||
├── results/ # Experiment outputs
|
||
└── requirements.txt
|
||
```
|
||
|
||
## Quick Start
|
||
|
||
```bash
|
||
# Install dependencies
|
||
pip install -r requirements.txt
|
||
|
||
# Generate data and run quick test
|
||
python3 -c "
|
||
from src.data_generator import DataGenerator
|
||
from src.problem import ProblemContext
|
||
from src.cost import CostCalculator
|
||
from src.alns.alns_base import ALNSBase
|
||
from src.tabu.t_alns import TALNS
|
||
|
||
data = DataGenerator(seed=42).generate_all()
|
||
ctx = ProblemContext(
|
||
customers={c.customer_id: c for c in data['customers']},
|
||
depot=data['depot'], traffic=data['traffic'],
|
||
n_vehicles=data['n_vehicles'], vehicle_capacity=data['vehicle_capacity'],
|
||
)
|
||
cc = CostCalculator()
|
||
|
||
alns = ALNSBase(ctx, cc, config={'max_iterations': 100, 'time_limit_sec': 60})
|
||
result = alns.run(seed=42)
|
||
print(f'ALNS: Cost={result[\"total_cost\"]:.1f} OTDR={result[\"otdr\"]*100:.1f}%')
|
||
|
||
talns = TALNS(ctx, cc, config={'max_iterations': 100, 'time_limit_sec': 60})
|
||
result2 = talns.run(seed=42)
|
||
print(f'T-ALNS: Cost={result2[\"total_cost\"]:.1f} OTDR={result2[\"otdr\"]*100:.1f}%')
|
||
"
|
||
|
||
# Run full comparison experiment
|
||
python3 src/experiments/run_main_comparison.py
|
||
```
|
||
|
||
## Key Algorithms
|
||
|
||
| Algorithm | Description | Paper Reference |
|
||
|-----------|-------------|-----------------|
|
||
| Static-VRPTW | Greedy with static travel times | Baseline 1 |
|
||
| TA-VRPTW-Greedy | Greedy with time-dependent costs | Baseline 2 |
|
||
| ALNS-Base | Adaptive destroy-repair with SA | Algorithm 1 |
|
||
| T-ALNS | ALNS + 3-layer Tabu memory | Algorithm 2 |
|
||
| T-ALNS-RRD | T-ALNS + rollout-based dispatch | Algorithm 3 |
|
||
|
||
## Experiment Configurations
|
||
|
||
- Dataset: 47 customers, 1 depot, 4 vehicles (120kg capacity)
|
||
- Traffic: 12 one-hour intervals, 6:00-18:00
|
||
- Area: 8 × 10 km² urban zone
|
||
- Complete graph: 2,256 arcs, 81,200+ traffic data points
|
||
|
||
## Expected Trends
|
||
|
||
Results should show progressive improvement:
|
||
```
|
||
Static-VRPTW (highest cost, lowest OTDR)
|
||
→ TA-Greedy (reduced congestion)
|
||
→ ALNS-Base (further cost reduction)
|
||
→ T-ALNS (better stability)
|
||
→ T-ALNS-RRD (best under disruptions)
|
||
```
|
||
|
||
## Reproduction Statement
|
||
|
||
> Since the original dataset requires reasonable request to the authors and is not yet publicly available, this project constructs a custom synthetic dataset matching the experimental scale and structure described in the paper to reproduce its core algorithmic framework and comparative experimental logic. This is a **methodological reproduction** focused on verifying the relative impact of different algorithmic modules, not an exact numerical replication.
|