Ivan Rodin

Leaders of Digital Transformation 2023 · hackathon

Cash collection for 1,630 terminals

A feasible three-month plan with 5 armored cars · team Branch and Win

One day: terminals due today (filled) on routes built as nearest-neighbor chains; one route in red · synthetic data

Task

Plan cash collection for 1,630 payment terminals across a large metropolitan region for 91 days. A terminal holds at most one million rubles and may go no more than 14 days without a visit; a visit takes 10 minutes, cars work from 08:00 to 20:00, and travel times come as a full asymmetric matrix of 2.66 million entries.

Cash left in a terminal costs 2% a year, a collection costs 0.01% of the amount but at least 100 rubles, and an armored car costs 20,000 rubles a day, so the size of the fleet dominates every other cost.

Approach

  1. 01Forecast every terminal

    One N-BEATS model per terminal, 1,630 in all: 14 days in, 15 days out, trained jointly on the terminal’s own deposits and on the average of its five nearest neighbors. The median error on the hold-out weeks was about 9 thousand rubles a day.

  2. 02Turn forecasts into deadlines

    Each morning every terminal gets its days left: zero if it is already over the cap or at the 14-day limit, otherwise the first day on which forecast deposits would push it over the cap.

  3. 03A pool of routes

    Routes are nearest-neighbor chains that fill a 12-hour shift: one seeded at every terminal and computed once, plus fresh chains through today’s must-visit terminals, so every day has a feasible cover.

  4. 04Choose today’s routes

    A set-covering MIP picks at most K routes. Must-visit terminals are covered at least once, the rest at most once, and optional visits are weighted by how crowded their deadline group is. That is a cheap look-ahead that spreads work across days.

  5. 05Three months in a loop, then the smallest fleet

    Each day’s plan is applied to actual deposits, deadlines are recomputed from fresh forecasts, and the loop runs through all 91 days. The fleet is reduced until some day becomes infeasible. A separate covering model with perfect information estimates how far it could go.

Result

A feasible plan for all 91 days with 5 armored cars; the first versions needed 10.

The covering model over the first 15 days put the likely floor at 4 cars.

Stack

Python · Darts (N-BEATS) · Pyomo · HiGHS · Docker