Initial commit: T-ALNS-RRD paper reproduction project

- 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)
This commit is contained in:
huangfu
2026-06-02 21:11:00 +08:00
commit 8ff9715fb7
45 changed files with 9293 additions and 0 deletions

View File

@@ -0,0 +1,149 @@
# Calibrated configuration (v2) for T-ALNS-RRD Reproduction
# Key changes from default:
# - 60 customers (was 47), 100kg capacity (was 120kg)
# - Tighter time windows (30-90min vs 60-150min)
# - θ=50 for CES scaling (was 1.0)
# - 1000 iterations, 30 seeds, statistical testing
# - More frequent & impactful RRD events
# Problem scale - HARDER THAN DEFAULT
problem:
n_customers: 55
n_vehicles: 4
depot_count: 1
vehicle_capacity_kg: 115 # 120 → 115 (slightly tighter, still feasible)
service_time_min: 4
area_width_km: 8.0
area_height_km: 10.0
operating_start: 360
operating_end: 1080
n_time_intervals: 12
# Customer generation - MORE CONSTRAINED
customers:
demand_min_kg: 3
demand_max_kg: 13 # 3 → 13 (was 15 - keep feasible)
window_length_min: 30 # NEW: shortest window (min)
window_length_max: 90 # NEW: longest window (min)
time_window_categories:
morning:
earliest: 540
latest: 720
afternoon:
earliest: 780
latest: 960
evening:
earliest: 1020
latest: 1200
num_clusters: 3
cluster_labels: ["residential", "commercial", "office"]
# Road network (unchanged)
roads:
types:
arterial:
speed_kmh: 45
proportion: 0.25
collector:
speed_kmh: 30
proportion: 0.35
residential:
speed_kmh: 20
proportion: 0.40
noise_std: 0.05
use_complete_graph: true
# Traffic congestion - SCALED CES
traffic:
multipliers: [1.0, 1.0, 1.6, 1.6, 1.2, 1.2, 1.0, 1.0, 1.2, 1.2, 1.7, 1.7]
congestion_scale_theta: 50.0 # 1.0 → 50.0 (CES into paper range)
risk_aversion_beta: 0.3
uncertainty_base: 0.05
# Cost function weights (unchanged)
cost:
lambda_lateness: 1.0
lambda_congestion: 1.0
lambda_stability: 0.3
# ALNS parameters - MORE ITERATIONS
alns:
max_iterations: 1000 # Always run full iterations
time_limit_sec: 600
destroy_ratio_min: 0.1
destroy_ratio_max: 0.4
initial_temperature_factor: 0.05
cooling_rate: 0.99975
reaction_factor: 0.1
segment_length: 100
stall_limit: 400 # 200 → 400 (allow longer search)
max_attempts: 5
reward_global_best: 1.0
reward_improvement: 0.5
reward_accepted: 0.2
reward_rejected: 0.0
# Tabu memory parameters (unchanged)
tabu:
move_tabu:
tenure: 7
tenure_min: 3
tenure_max: 12
overlap_threshold: 0.5
stall_for_increase: 50
solution_tabu:
tenure: 15
buffer_size: 1000
hash_prime: 1000000007
frequency:
normalization_factor: 2
normalization_interval: 50
diversification:
delta_max: 0.7
eta_balance: 0.5
weights: [0.4, 0.3, 0.3]
aspiration:
beta_threshold: 0.3
gamma_threshold: 0.8
# RRD parameters - MORE EVENTS
rrd:
rollout:
horizon_min_min: 30
horizon_max_min: 120
urgency_alpha: 1.0
n_sim_min: 5 # 2 → 5
n_sim_max: 30 # 50 → 30
mc_iterations: 50
time_overhead_ms: 10
time_per_sim_ms: 50
dispatch:
weight_rollout: 0.4
weight_stability: 0.3
weight_recovery: 0.3
tabu:
penalty: 50.0
bonus: 25.0
events:
urgency_threshold: 0.3 # 0.5 → 0.3 (easier to trigger)
event_probability: 0.5 # NEW: event check probability
event_check_interval: 5 # NEW: check every N iterations
weights:
E1_traffic: [0.5, 0.3, 0.2]
E2_urgent: [0.7, 0.1, 0.2]
E3_capacity: [0.3, 0.4, 0.3]
E4_timewindow: [0.8, 0.1, 0.1]
max_actions: 20
# Experiment settings - MORE SEEDS + STATISTICAL TESTING
experiments:
random_seeds: 30 # 5 → 30 (paper standard)
seed_start: 1
report_mean_std: true
statistical_testing: true # NEW: run paired t-tests
sensitivity:
fleet_sizes: [2, 3, 4, 5, 6]
customer_counts: [30, 40, 47, 60]
capacities: [80, 100, 120, 140, 160]
robustness:
sigma_values: [0.1, 0.2, 0.3, 0.5]

View File

@@ -0,0 +1,6 @@
algorithm,total_cost_mean,total_cost_std,otdr_mean,otdr_std,ces_mean,ces_std,travel_time_mean,delay_penalty_mean,congestion_cost_mean,computation_time_mean,avg_delay_mean,max_delay_mean,late_customers_mean
Static-VRPTW,15321.894699999999,1.9173831849720224e-12,43.63636363636363,0.0,3193.5278,0.0,3111.4945,9016.872399999997,3193.5278,0.1911109209060669,300.5624133333332,512.7649999999998,30.0
TA-VRPTW-Greedy,5013.09167,175.89575187422835,91.27272727272727,3.6161051854972857,1789.1400299999998,75.81980551459641,2932.68725,291.26438999999993,1789.1400299999998,0.027298784255981444,67.99000710714286,167.66838,4.6
ALNS-Base,3246.7716299999997,104.20460175913583,88.54545454545455,2.7171529419951392,906.95191,49.998293085829985,2309.61222,30.207500000000017,906.95191,63.5413857460022,7.706254285714287,14.838140000000044,4.3
T-ALNS,3228.2472500000003,85.46898350558733,84.54545454545453,3.1198879215112094,863.8959600000001,45.765308168456315,2311.5525900000002,52.79870000000001,863.8959600000001,48.58432672023773,8.081892531746034,19.420940000000087,6.5
T-ALNS-RRD,3336.590004828589,160.19969851781602,85.09090909090908,2.064168044354714,981.6906182031265,117.47264426552245,2306.6826584178852,48.21672820757747,981.6906182031265,51.64886746406555,7.734138309051906,21.168398007750977,6.1
1 algorithm total_cost_mean total_cost_std otdr_mean otdr_std ces_mean ces_std travel_time_mean delay_penalty_mean congestion_cost_mean computation_time_mean avg_delay_mean max_delay_mean late_customers_mean
2 Static-VRPTW 15321.894699999999 1.9173831849720224e-12 43.63636363636363 0.0 3193.5278 0.0 3111.4945 9016.872399999997 3193.5278 0.1911109209060669 300.5624133333332 512.7649999999998 30.0
3 TA-VRPTW-Greedy 5013.09167 175.89575187422835 91.27272727272727 3.6161051854972857 1789.1400299999998 75.81980551459641 2932.68725 291.26438999999993 1789.1400299999998 0.027298784255981444 67.99000710714286 167.66838 4.6
4 ALNS-Base 3246.7716299999997 104.20460175913583 88.54545454545455 2.7171529419951392 906.95191 49.998293085829985 2309.61222 30.207500000000017 906.95191 63.5413857460022 7.706254285714287 14.838140000000044 4.3
5 T-ALNS 3228.2472500000003 85.46898350558733 84.54545454545453 3.1198879215112094 863.8959600000001 45.765308168456315 2311.5525900000002 52.79870000000001 863.8959600000001 48.58432672023773 8.081892531746034 19.420940000000087 6.5
6 T-ALNS-RRD 3336.590004828589 160.19969851781602 85.09090909090908 2.064168044354714 981.6906182031265 117.47264426552245 2306.6826584178852 48.21672820757747 981.6906182031265 51.64886746406555 7.734138309051906 21.168398007750977 6.1

View File

@@ -0,0 +1,11 @@
algo_a,algo_b,t_statistic,p_value,significant
Static-VRPTW,TA-VRPTW-Greedy,185.3330576633527,1.9716478558253748e-17,***
Static-VRPTW,ALNS-Base,366.44151297950805,4.2727722775178273e-20,***
Static-VRPTW,T-ALNS,447.4543816071859,7.080306899468622e-21,***
Static-VRPTW,T-ALNS-RRD,236.58509746594012,2.191284240436559e-18,***
TA-VRPTW-Greedy,ALNS-Base,31.25967939768836,1.720760601298381e-10,***
TA-VRPTW-Greedy,T-ALNS,29.4464353247755,2.93244000878877e-10,***
TA-VRPTW-Greedy,T-ALNS-RRD,24.6826583540389,1.4102196456675431e-09,***
ALNS-Base,T-ALNS,0.46670227005865406,0.6518039930669947,ns
ALNS-Base,T-ALNS-RRD,-1.515866438976666,0.1638582485938116,ns
T-ALNS,T-ALNS-RRD,-2.4093905940604805,0.03928826243785392,*
1 algo_a algo_b t_statistic p_value significant
2 Static-VRPTW TA-VRPTW-Greedy 185.3330576633527 1.9716478558253748e-17 ***
3 Static-VRPTW ALNS-Base 366.44151297950805 4.2727722775178273e-20 ***
4 Static-VRPTW T-ALNS 447.4543816071859 7.080306899468622e-21 ***
5 Static-VRPTW T-ALNS-RRD 236.58509746594012 2.191284240436559e-18 ***
6 TA-VRPTW-Greedy ALNS-Base 31.25967939768836 1.720760601298381e-10 ***
7 TA-VRPTW-Greedy T-ALNS 29.4464353247755 2.93244000878877e-10 ***
8 TA-VRPTW-Greedy T-ALNS-RRD 24.6826583540389 1.4102196456675431e-09 ***
9 ALNS-Base T-ALNS 0.46670227005865406 0.6518039930669947 ns
10 ALNS-Base T-ALNS-RRD -1.515866438976666 0.1638582485938116 ns
11 T-ALNS T-ALNS-RRD -2.4093905940604805 0.03928826243785392 *

View File

@@ -0,0 +1,149 @@
# Calibrated configuration (v2) for T-ALNS-RRD Reproduction
# Key changes from default:
# - 60 customers (was 47), 100kg capacity (was 120kg)
# - Tighter time windows (30-90min vs 60-150min)
# - θ=50 for CES scaling (was 1.0)
# - 1000 iterations, 30 seeds, statistical testing
# - More frequent & impactful RRD events
# Problem scale - HARDER THAN DEFAULT
problem:
n_customers: 55
n_vehicles: 4
depot_count: 1
vehicle_capacity_kg: 115 # 120 → 115 (slightly tighter, still feasible)
service_time_min: 4
area_width_km: 8.0
area_height_km: 10.0
operating_start: 360
operating_end: 1080
n_time_intervals: 12
# Customer generation - MORE CONSTRAINED
customers:
demand_min_kg: 3
demand_max_kg: 13 # 3 → 13 (was 15 - keep feasible)
window_length_min: 30 # NEW: shortest window (min)
window_length_max: 90 # NEW: longest window (min)
time_window_categories:
morning:
earliest: 540
latest: 720
afternoon:
earliest: 780
latest: 960
evening:
earliest: 1020
latest: 1200
num_clusters: 3
cluster_labels: ["residential", "commercial", "office"]
# Road network (unchanged)
roads:
types:
arterial:
speed_kmh: 45
proportion: 0.25
collector:
speed_kmh: 30
proportion: 0.35
residential:
speed_kmh: 20
proportion: 0.40
noise_std: 0.05
use_complete_graph: true
# Traffic congestion - SCALED CES
traffic:
multipliers: [1.0, 1.0, 1.6, 1.6, 1.2, 1.2, 1.0, 1.0, 1.2, 1.2, 1.7, 1.7]
congestion_scale_theta: 50.0 # 1.0 → 50.0 (CES into paper range)
risk_aversion_beta: 0.3
uncertainty_base: 0.05
# Cost function weights (unchanged)
cost:
lambda_lateness: 1.0
lambda_congestion: 1.0
lambda_stability: 0.3
# ALNS parameters - MORE ITERATIONS
alns:
max_iterations: 1000 # Always run full iterations
time_limit_sec: 600
destroy_ratio_min: 0.1
destroy_ratio_max: 0.4
initial_temperature_factor: 0.05
cooling_rate: 0.99975
reaction_factor: 0.1
segment_length: 100
stall_limit: 400 # 200 → 400 (allow longer search)
max_attempts: 5
reward_global_best: 1.0
reward_improvement: 0.5
reward_accepted: 0.2
reward_rejected: 0.0
# Tabu memory parameters (unchanged)
tabu:
move_tabu:
tenure: 7
tenure_min: 3
tenure_max: 12
overlap_threshold: 0.5
stall_for_increase: 50
solution_tabu:
tenure: 15
buffer_size: 1000
hash_prime: 1000000007
frequency:
normalization_factor: 2
normalization_interval: 50
diversification:
delta_max: 0.7
eta_balance: 0.5
weights: [0.4, 0.3, 0.3]
aspiration:
beta_threshold: 0.3
gamma_threshold: 0.8
# RRD parameters - MORE EVENTS
rrd:
rollout:
horizon_min_min: 30
horizon_max_min: 120
urgency_alpha: 1.0
n_sim_min: 5 # 2 → 5
n_sim_max: 30 # 50 → 30
mc_iterations: 50
time_overhead_ms: 10
time_per_sim_ms: 50
dispatch:
weight_rollout: 0.4
weight_stability: 0.3
weight_recovery: 0.3
tabu:
penalty: 50.0
bonus: 25.0
events:
urgency_threshold: 0.3 # 0.5 → 0.3 (easier to trigger)
event_probability: 0.5 # NEW: event check probability
event_check_interval: 5 # NEW: check every N iterations
weights:
E1_traffic: [0.5, 0.3, 0.2]
E2_urgent: [0.7, 0.1, 0.2]
E3_capacity: [0.3, 0.4, 0.3]
E4_timewindow: [0.8, 0.1, 0.1]
max_actions: 20
# Experiment settings - MORE SEEDS + STATISTICAL TESTING
experiments:
random_seeds: 30 # 5 → 30 (paper standard)
seed_start: 1
report_mean_std: true
statistical_testing: true # NEW: run paired t-tests
sensitivity:
fleet_sizes: [2, 3, 4, 5, 6]
customer_counts: [30, 40, 47, 60]
capacities: [80, 100, 120, 140, 160]
robustness:
sigma_values: [0.1, 0.2, 0.3, 0.5]

View File

@@ -0,0 +1,5 @@
configuration,total_cost_mean,total_cost_std,otdr_mean,otdr_std,ces_mean,ces_std,computation_time_mean,iterations_mean
ALNS-Base (no Tabu),3213.5472600000003,92.47828809019447,86.54545454545455,3.302891295379083,873.8731200000002,72.66381047359131,83.00211868286132,656.4
+ Move Tabu only,3232.33156,23.85173277307108,86.18181818181817,3.042400096487549,884.6135199999999,23.691658934148084,51.74106793403625,472.8
+ Frequency Memory only,3216.9874600000003,87.42641474241665,87.63636363636364,3.726163914894401,892.23014,36.74464052488473,67.69878606796264,532.6
Full T-ALNS,3207.3305,83.1845531049185,83.63636363636363,2.8747978728803405,859.0403399999999,44.94860445801399,56.30859026908875,499.4
1 configuration total_cost_mean total_cost_std otdr_mean otdr_std ces_mean ces_std computation_time_mean iterations_mean
2 ALNS-Base (no Tabu) 3213.5472600000003 92.47828809019447 86.54545454545455 3.302891295379083 873.8731200000002 72.66381047359131 83.00211868286132 656.4
3 + Move Tabu only 3232.33156 23.85173277307108 86.18181818181817 3.042400096487549 884.6135199999999 23.691658934148084 51.74106793403625 472.8
4 + Frequency Memory only 3216.9874600000003 87.42641474241665 87.63636363636364 3.726163914894401 892.23014 36.74464052488473 67.69878606796264 532.6
5 Full T-ALNS 3207.3305 83.1845531049185 83.63636363636363 2.8747978728803405 859.0403399999999 44.94860445801399 56.30859026908875 499.4

View File

@@ -0,0 +1,6 @@
algorithm,total_cost_mean,total_cost_std,otdr_mean,otdr_std,ces_mean,ces_std,travel_time_mean,delay_penalty_mean,congestion_cost_mean,computation_time_mean,computation_time_std,avg_delay_mean,max_delay_mean,late_customers_mean
Static-VRPTW,7580.3396999999995,1.016845989170083e-12,68.08510638297872,0.0,30.313699999999994,3.972054645195637e-15,3044.2300999999998,4505.795900000001,30.313699999999994,0.004783535003662109,0.00018088214390829616,300.3863933333334,493.0151000000001,15.0
TA-VRPTW-Greedy,2217.5418,7.227591305891663,100.0,0.0,22.31862,0.32531771700907924,2195.22318,0.0,22.31862,0.028783178329467772,0.002923092418020413,0.0,0.0,0.0
ALNS-Base,1897.9593999999997,64.64205953831464,100.0,0.0,22.97466,1.153527213809888,1874.9847399999999,0.0,22.97466,19.402582216262818,1.9577010142186166,0.0,0.0,0.0
T-ALNS,1893.51538,62.880952004856034,100.0,0.0,23.124559999999995,1.2951313612912023,1870.39082,0.0,23.124559999999995,17.40975332260132,1.1775580697211723,0.0,0.0,0.0
T-ALNS-RRD,1892.75974,58.436822595286664,99.57446808510639,0.9515182882977844,23.177039999999998,1.2170745018280524,1869.5270800000003,0.05561999999999898,23.177039999999998,16.82726149559021,1.2918458665987367,0.05561999999999898,0.05561999999999898,0.2
1 algorithm total_cost_mean total_cost_std otdr_mean otdr_std ces_mean ces_std travel_time_mean delay_penalty_mean congestion_cost_mean computation_time_mean computation_time_std avg_delay_mean max_delay_mean late_customers_mean
2 Static-VRPTW 7580.3396999999995 1.016845989170083e-12 68.08510638297872 0.0 30.313699999999994 3.972054645195637e-15 3044.2300999999998 4505.795900000001 30.313699999999994 0.004783535003662109 0.00018088214390829616 300.3863933333334 493.0151000000001 15.0
3 TA-VRPTW-Greedy 2217.5418 7.227591305891663 100.0 0.0 22.31862 0.32531771700907924 2195.22318 0.0 22.31862 0.028783178329467772 0.002923092418020413 0.0 0.0 0.0
4 ALNS-Base 1897.9593999999997 64.64205953831464 100.0 0.0 22.97466 1.153527213809888 1874.9847399999999 0.0 22.97466 19.402582216262818 1.9577010142186166 0.0 0.0 0.0
5 T-ALNS 1893.51538 62.880952004856034 100.0 0.0 23.124559999999995 1.2951313612912023 1870.39082 0.0 23.124559999999995 17.40975332260132 1.1775580697211723 0.0 0.0 0.0
6 T-ALNS-RRD 1892.75974 58.436822595286664 99.57446808510639 0.9515182882977844 23.177039999999998 1.2170745018280524 1869.5270800000003 0.05561999999999898 23.177039999999998 16.82726149559021 1.2918458665987367 0.05561999999999898 0.05561999999999898 0.2