René Cano
Todos los proyectos

Núm. 6

PackFlow

Carga 3D de camiones con aprendizaje por refuerzo

Mi rol
Autor único
Periodo
Jun – jul 2026

El problema

Cargar un camión de reparto no es solo meter cajas: hay que respetar el peso máximo, no aplastar lo frágil y dejar cerca de la puerta lo que se entrega primero. Quise ver si un agente de aprendizaje por refuerzo puede aprender a cargar mejor que una regla simple cuando no cabe todo.

Qué construí

Soy el único autor del repositorio: 7 commits, del 24 de junio al 14 de julio de 2026.

  • Un entorno de Gymnasium en vóxeles: un camión de 12 × 6 × 8 y una cola de paquetes. Cada acción es una posición con una de 6 rotaciones, más la opción de saltar el paquete. La máscara de acciones solo permite colocaciones que caben, no chocan, quedan apoyadas en al menos el 80% de su base y no rebasan el peso máximo.
  • Una recompensa que suma el volumen colocado y el respeto al orden de entrega, y resta el daño a los paquetes frágiles y el volumen que quedó fuera. Los paquetes generados suman entre ~110% y 130% de la capacidad, así que el agente tiene que decidir qué dejar.
  • Métricas de violaciones del orden de descarga y de daño, pensadas para comparar políticas.
  • El entrenamiento con MaskablePPO y un extractor propio: una CNN 3D para la ocupación del camión y un MLP para la cola. El currículo tiene 5 fases, de 4 a 20 paquetes, y cada fase reutiliza los pesos de la anterior.
  • Una API FastAPI con un endpoint que devuelve la solución completa y un WebSocket que transmite la carga paso a paso. Si no encuentra un checkpoint de PPO, usa un baseline greedy que toma la primera colocación válida.
  • Una consola en React con react-three-fiber que anima el camión con escenarios predefinidos.
  • 11 tests de pytest sobre el entorno.

Arquitectura

Diagrama de arquitectura: una cola de paquetes con peso, fragilidad y orden de entrega entra a un entorno de Gymnasium que representa el camión en vóxeles de 12 × 6 × 8; una máscara de acciones deja solo colocaciones sin choques, con al menos 80% de apoyo y dentro del peso; un agente MaskablePPO con CNN 3D y un MLP aprende con un currículo de 5 fases, de 4 a 20 paquetes; una API FastAPI usa el checkpoint cuando exista o un baseline greedy, y transmite la carga por WebSocket a una consola React con react-three-fiber.

Resultados

Todavía no hay resultados medidos. El repositorio no tiene checkpoint ni registros de entrenamiento, así que no puedo afirmar que el agente supere al baseline greedy. Lo que sí funciona hoy es el entorno con sus 11 tests, la API con el greedy de respaldo y la visualización.

Límites conocidos

  • Falta la parte central: entrenar el currículo completo y comparar contra el greedy en volumen cargado, orden de entrega y daño.
  • El baseline greedy es débil, porque toma la primera colocación válida. Para una comparación justa hace falta además una heurística más fuerte.
  • El README de la raíz es una copia del README del frontend, hay __pycache__ versionado y una carpeta duplicada packflow/packflow/api. No hay CI.

Links