Logística (bajo NDA)
Sistema de ruteo dinámico y app para conductores que redujo kilómetros recorridos y mejoró puntualidad sin agregar flota.
Problema
El operador atendía más de 4.000 paradas diarias en cinco ciudades con rutas planeadas en hojas de cálculo y WhatsApp. Los despachadores pasaban 3 horas cada mañana armando rutas; los conductores improvisaban con Waze al llegar a zona. El on-time rate oscilaba entre 76% y 82%.
Solución
Diseñamos un motor de ruteo con restricciones reales (ventanas horarias, capacidad de vehículo, zonas restringidas) sobre un solver mixto (OR-Tools + heurísticas propias) y lo conectamos a una app móvil con tracking en tiempo real. El despacho dejó de armar rutas a mano; el sistema prioriza SLA y costo según tipo de carga.
Stack
- TypeScript
- Python
- Postgres + PostGIS
- AWS
- Flutter
"Lo mejor no es el ahorro directo, es que ya no dependemos del mejor despachador para tener un buen día."
Contexto
La operación tenía ~120 conductores y crecía sumando clientes enterprise que exigían SLA explícito. El despacho manual era el cuello de botella y el costo estaba subiendo: cada conductor adicional sumaba complejidad cuadrática a la planificación.
Decisiones técnicas
Implementamos el solver en Python con OR-Tools, envuelto en un servicio Node (TypeScript) que orquesta planificación + re-planificación cuando hay desviaciones. PostGIS para operaciones geoespaciales. App del conductor en Flutter, offline-first, con cola de eventos que se sincroniza vía MQTT cuando recupera red.
Dimensionamos el solver para resolver rutas de hasta 500 paradas en menos de 3 minutos en CPU normal; para zonas más densas usamos clustering previo y solving paralelo.
Lecciones aprendidas
El solver puro no convence hasta que el despachador lo valida y lo puede override. La primera iteración, 100% automática, generó resistencia. La segunda iteración deja que el despachador mueva paradas entre rutas y el sistema re-optimiza; adopción se disparó.