P4Learned Delivery Routing
7

System line · 07 of 13

Integrated demo

python run_demo.py plans a full day: 20 orders, 3 vans, travel times from the model, vans from the CSP, stop order from A*. A late route turns into a new rule and the day is planned again.

Day
Thursday, 20 orders, 3 vans, depot Midtown Center
Outcome
late by 2.1 min in loop 1, every order on time in loop 2
Outputs
console, 4 figures, HTML report
Script
run_demo.py

Console output

python run_demo.py
=== INPUT: n20_s4, weekday Thu, depot zone 7 (Midtown Center)
travel times: NN-predicted taxi minutes x 1.2 (van factor)
  van 0: shift 08:00-17:00, capacity 13, max 10 stops
  van 1: shift 09:00-18:00, capacity 13, max 10 stops
  van 2: shift 10:00-19:00, capacity 13, max 10 stops
  order zone                           window        demand service
      0 19 Yorkville West               12:30-13:30      1     7
      1 16 Upper East Side South        11:45-12:30      1    10
      2 18 Upper West Side South        12:45-13:45      1    10
      3 19 Yorkville West               15:00-15:30      1    10
      4  5 Lenox Hill West              15:30-16:30      2     5
      5 15 Upper East Side North        15:45-16:30      1     7
      6 11 Penn Station/Madison Sq West 12:45-13:15      3    10
      7 12 Sutton Place/Turtle Bay Nort 10:45-11:15      2    10
      8  6 Lincoln Square East          13:00-14:00      3     5
      9 10 Murray Hill                  14:00-14:30      1    10
     10  5 Lenox Hill West              14:30-15:15      1     7
     11  5 Lenox Hill West              10:15-10:45      3     5
     12 15 Upper East Side North        11:45-12:45      1     5
     13 16 Upper East Side South        12:45-13:45      1    10
     14 19 Yorkville West               11:30-12:00      1     7
     15 18 Upper West Side South        16:15-16:45      1     7
     16  3 JFK Airport                  15:00-15:30      1    10
     17  6 Lincoln Square East          15:30-16:30      1     5
     18  6 Lincoln Square East          13:15-14:15      2     5
     19 12 Sutton Place/Turtle Bay Nort 14:30-14:45      2     7

=== INTEGRATION LOOP (NN -> CSP -> A*)
  loop 1: CSP solved (rules: 2 from NN, 0 learned; 20 assignments, 0 backtracks)
           van 0 late by 2.1 min -> new rule: orders 16 and 5 on different vans
  loop 2: CSP solved (rules: 2 from NN, 1 learned; 20 assignments, 0 backtracks)

=== SOLUTION
status: ok -- all 20 orders on time after 2 loop(s)
van 0 (shift 08:00-17:00, load 9/13, 7 stops, back 16:29):
    order 11 zone  5 window 10:15-10:45 arrive 08:11 serve 10:15
    order 14 zone 19 window 11:30-12:00 arrive 10:27 serve 11:30
    order  0 zone 19 window 12:30-13:30 arrive 11:43 serve 12:30
    order 13 zone 16 window 12:45-13:45 arrive 12:49 serve 12:49
    order  9 zone 10 window 14:00-14:30 arrive 13:11 serve 14:00
    order 16 zone  3 window 15:00-15:30 arrive 14:53 serve 15:00
    order 17 zone  6 window 15:30-16:30 arrive 16:13 serve 16:13
van 1 (shift 09:00-18:00, load 10/13, 7 stops, back 16:38):
    order  1 zone 16 window 11:45-12:30 arrive 09:10 serve 11:45
    order  2 zone 18 window 12:45-13:45 arrive 12:07 serve 12:45
    order  8 zone  6 window 13:00-14:00 arrive 13:02 serve 13:02
    order 19 zone 12 window 14:30-14:45 arrive 13:20 serve 14:30
    order 10 zone  5 window 14:30-15:15 arrive 14:44 serve 14:44
    order  5 zone 15 window 15:45-16:30 arrive 15:00 serve 15:45
    order 15 zone 18 window 16:15-16:45 arrive 16:04 serve 16:15
van 2 (shift 10:00-19:00, load 11/13, 6 stops, back 15:49):
    order  7 zone 12 window 10:45-11:15 arrive 10:09 serve 10:45
    order 12 zone 15 window 11:45-12:45 arrive 11:10 serve 11:45
    order  6 zone 11 window 12:45-13:15 arrive 12:15 serve 12:45
    order 18 zone  6 window 13:15-14:15 arrive 13:10 serve 13:15
    order  3 zone 19 window 15:00-15:30 arrive 13:37 serve 15:00
    order  4 zone  5 window 15:30-16:30 arrive 15:19 serve 15:30

=== A* SEARCH TRACE (van 0, first 12 expansions; f = g + h, minutes)
  #  1 at depot visited []               clock 08:00 g    0.0 h  461.0 f  461.0
  #  2 at    11 visited [11]             clock 10:20 g  140.0 h  321.0 f  461.0
  #  3 at    14 visited [14]             clock 11:37 g  217.0 h  244.0 f  461.0
  #  4 at    14 visited [11, 14]         clock 11:37 g  217.0 h  244.0 f  461.0
  #  5 at     0 visited [0]              clock 12:37 g  277.0 h  184.0 f  461.0
  #  6 at     0 visited [11, 0]          clock 12:37 g  277.0 h  184.0 f  461.0
  #  7 at     0 visited [14, 0]          clock 12:37 g  277.0 h  184.0 f  461.0
  #  8 at     0 visited [11, 14, 0]      clock 12:37 g  277.0 h  184.0 f  461.0
  #  9 at     9 visited [11, 14, 9]      clock 14:10 g  370.0 h   91.0 f  461.0
  # 10 at     9 visited [11, 0, 9]       clock 14:10 g  370.0 h   91.0 f  461.0
  # 11 at     9 visited [14, 0, 9]       clock 14:10 g  370.0 h   91.0 f  461.0
  # 12 at     9 visited [11, 14, 0, 9]   clock 14:10 g  370.0 h   91.0 f  461.0

=== SEARCH COUNTERS per van (same stops, three algorithms)
  van 0 UCS    expanded   132 generated   133 route time  508.7 min  0.8 ms
  van 0 Greedy expanded   122 generated   125 route time  508.7 min  3.4 ms
  van 0 A*     expanded    68 generated   132 route time  508.7 min  3.3 ms
  van 1 UCS    expanded   130 generated   131 route time  457.9 min  0.8 ms
  van 1 Greedy expanded   113 generated   115 route time  457.9 min  3.1 ms
  van 1 A*     expanded    46 generated   110 route time  457.9 min  2.6 ms
  van 2 UCS    expanded    64 generated    65 route time  348.5 min  0.3 ms
  van 2 Greedy expanded    64 generated    65 route time  348.5 min  1.6 ms
  van 2 A*     expanded    21 generated    53 route time  348.5 min  1.2 ms

=== CSP PRUNING: same rules, solvers switched on/off
  (a) this day's constraint set
      BT         assignments   384 backtracks   364 checks  1113
      BT+FC      assignments    21 backtracks     1 checks     0
      BT+FC+AC3  assignments    20 backtracks     0 checks     0
  (b) hard rush-hour instance: 20 orders, windows 09:00-12:00, zero capacity slack, 4 NN rules
      BT             assignments  4136 backtracks  4116 fc_prunes     0 ac3_prunes    0 9.0 ms
      BT+FC          assignments  1701 backtracks  1681 fc_prunes  1708 ac3_prunes    0 3.5 ms
      BT+FC+AC3      assignments  1188 backtracks  1168 fc_prunes  1257 ac3_prunes   21 2.9 ms
      +degree order  assignments    20 backtracks     0 fc_prunes    12 ac3_prunes    0 0.1 ms

=== NN ON vs OFF: replay with real held-out trip durations (50 replays, test week)
  NN on              plan ok   late per day 0.68 ± 0.47 (3.4%), lateness 7.5 min
  hist-avg           plan ok   late per day 1.38 ± 0.87 (6.9%), lateness 24.8 min
  NN off (distance)  plan ok   late per day 0.70 ± 0.81 (3.5%), lateness 6.1 min

figures: outputs\demo_map.png, outputs\demo_gantt.png, outputs\demo_constraint_graph.png, outputs\demo_stats.png
report:  outputs/demo_report.html

Figures

Routes per van
Routes per van
Windows, arrivals, waiting and service
Windows, arrivals, waiting and service
Counters and the replay of real trips
Counters and the replay of real trips

When no plan exists

python run_demo.py --impossible
=== INTEGRATION LOOP (NN -> CSP -> A*)
  loop 1: CSP unsat (rules: 21 from NN, 0 learned; 0 assignments, 0 backtracks)

NO SOLUTION: not every order can be served on time.
Unserviceable orders / reasons:
  - order 0: window not reachable from the depot by any van: van 0: earliest arrival 08:48 is after the window closes 08:20; van 1: earliest arrival 09:46 is after the window closes 08:20; van 2: earliest arrival 10:43 is after the window closes 08:20
Suggestion: widening the windows of orders [0] by 30 min (15-min steps) makes it feasible.