Prueba de concepto que combina Investigación Operativa y Machine Learning para asignar pedidos de delivery a repartidores.
Estado: prueba de concepto. El baseline exacto de Investigación Operativa está validado y el modelo que poda el espacio de búsqueda está entrenado. La versión con Reinforcement Learning todavía está en exploración.
Dado un conjunto de pedidos (restaurante → casa) y una flota de repartidores, hay que decidir:
- Qué pedidos agrupar en cada recorrido (máximo 3 por repartidor).
- En qué orden visitar restaurantes y casas.
- Qué repartidor hace cada recorrido.
El objetivo es minimizar la suma de tiempos de entrega, respetando el SLA de cada pedido y la capacidad y velocidad de cada vehículo. El escenario está calibrado para Buenos Aires con lluvia, el peor caso operativo.
1. Baseline exacto (el "profesor"). Se resuelve en dos pasos con OR-Tools:
- Paso 1: para cada subconjunto de pedidos y cada repartidor, calcular el recorrido óptimo. Si no cumple el SLA, se descarta.
- Paso 2: set partitioning: elegir qué recorridos ejecutar para cubrir cada pedido exactamente una vez, con un recorrido por repartidor como máximo.
El problema es que el Paso 1 crece combinatoriamente: con muchos pedidos hay miles de recorridos candidatos.
2. Poda con un modelo. Una red chica en PyTorch (MLP) recibe 8 features de cada par de pedidos y predice si ese par va junto en la solución óptima. Se entrena por imitación del baseline, con split por escenario para evaluarla en escenarios nuevos. Con esos scores solo se arman los candidatos prometedores, y el Paso 2 sigue siendo exacto. Por eso la solución nunca viola el SLA ni la capacidad: el modelo solo decide qué candidatos mirar.
El detalle del modelo matemático está en delivery-rl/docs/modelo-matematico.md.
delivery-rl/
├── src/
│ ├── escenario.py generador de escenarios aleatorios realistas
│ ├── baseline.py solución óptima exacta (el profesor)
│ ├── generar_dataset.py resuelve N escenarios y guarda los óptimos
│ ├── features.py features por par de pedidos
│ ├── dataset_pares.py dataset supervisado a partir de los óptimos
│ ├── modelo.py scorer de pares (MLP)
│ ├── entrenamiento.py entrenamiento y evaluación
│ └── poda.py poda de candidatos con el modelo + solver
├── tests/ tests y pruebas de estrés (hasta 150 pedidos)
├── notebooks/ análisis de sensibilidad
└── data/ dataset, óptimos y modelo entrenado
cd delivery-rl
pip install -r requirements.txt
python src/escenario.py # genera y muestra un escenario
python src/dataset_pares.py # arma data/pares.npz desde los óptimos
python src/entrenamiento.py # entrena el scorer -> data/modelo.pt
python src/poda.py # compara poda vs. óptimo exactoPython · OR-Tools · PyTorch · NumPy · Gymnasium / Stable-Baselines3 (exploración de RL)