# aprendizaje-por-refuerzo-en-python
Aprendizaje por Refuerzo en Python
Volver a la portada del cursoProyecto Final: Desarrollo de Agente
Sección 5 · Proyecto Aplicado
Proyecto final: un agente para el almacén de PyShop
Vas a entrenar, evaluar y documentar un agente de aprendizaje por refuerzo tabular que resuelva dos problemas: el almacén de PyShop en su versión resbalosa y el entorno Taxi-v4 de Gymnasium. Se usan Python 3.10 o superior, Gymnasium 1.4, NumPy y Matplotlib (pip install gymnasium numpy matplotlib). El notebook robot-del-almacen es la solución de referencia del almacén sin resbalar: úsalo como guía, no como plantilla para copiar.
Contexto
El robot del almacén de PyShop lleva pedidos desde la salida hasta el andén de envío. En el piso real, el suelo a veces está húmedo y el robot se desliza. El equipo de operaciones quiere saber si un agente aprendido es fiable en esas condiciones, cuánto entrenamiento necesita, qué ajustes funcionan mejor y si el mismo código sirve para otra tarea de logística, como un taxi que recoge y entrega pasajeros.
Entornos
- Almacén resbaloso:
crear_almacen(resbaloso=0.1)del archivo de datos del curso. Cuadrícula de 5×5, 25 estados y 4 acciones; −1 por paso, +10 en el andén, −10 en un derrame, truncado a los 50 pasos. El 10 % de las veces el robot se mueve a un lado. - Taxi-v4:
gym.make("Taxi-v4"), 500 estados y 6 acciones. No usesTaxi-v3: en Gymnasium 1.4 lanza un error.
import gymnasium as gym
import numpy as np
almacen = crear_almacen(resbaloso=0.1)
taxi = gym.make("Taxi-v4")
for env in (almacen, taxi):
print(env.observation_space, env.action_space)
# Discrete(25) Discrete(4)
# Discrete(500) Discrete(6)
Usa semillas fijas en todo: env.reset(seed=...) en cada episodio y np.random.default_rng(42) para el agente. Evalúa siempre con la política greedy (sin explorar) durante 100 episodios.
Tareas
- Línea base. Juega 1000 episodios al azar en el almacén resbaloso y en Taxi-v4. Reporta retorno medio y tasa de éxito.
- Agente. Escribe una clase
Agentecon una tabla Q de NumPy y los métodosactuar(ε-greedy) yaprender(regla de Q-learning). Debe funcionar en ambos entornos sin cambios. - Entrenamiento. Entrena en el almacén resbaloso (sugerencia: 2000 episodios, α = 0.1, γ = 0.95, ε de 1 a 0.05 con decaimiento 0.998) y en Taxi-v4 (3000 episodios, mismo decaimiento).
- Curvas. Grafica el retorno por episodio con una media móvil (por ejemplo, de 50 episodios) para los dos entornos.
- Política. Dibuja la política del almacén con flechas sobre el mapa y comenta al menos dos casillas donde difiera de la ruta del almacén sin resbalar.
- Evaluación. Reporta retorno medio y tasa de éxito greedy en 100 episodios y compáralos con la línea base.
- Experimento de hiperparámetros. En el almacén, prueba al menos tres valores de α, tres de γ y dos esquemas de ε (fijo y con decaimiento). Presenta una tabla y explica el resultado más sorprendente.
- SARSA contra Q-learning. Cambia el objetivo de
aprenderpara obtener SARSA. Compara ambos en el almacén resbaloso y enCliffWalking-v1con ε fijo en 0.1: retorno medio durante el entrenamiento y ruta final. - Guardar. Guarda las dos tablas con
np.save, cárgalas y comprueba que la evaluación da lo mismo.
Resultados de referencia
Con las sugerencias anteriores y la misma forma de usar las semillas que el curso, se obtiene:
| Caso | Resultado |
|---|---|
| Almacén sin resbalar, al azar (1000 episodios) | retorno −31.87 |
| Almacén sin resbalar, Q-learning | retorno 3.0, éxito 100 % |
| Almacén resbaloso, Q-learning (2000 episodios) | retorno 1.04, éxito 93 % |
| Taxi-v4, Q-learning (3000 episodios) | retorno 7.63, éxito 100 % |
| CliffWalking, entrenando (últimos 100) | Q-learning −39.1, SARSA −21.6 |
| CliffWalking, ruta final | Q-learning −13, SARSA −17 |
Tus cifras pueden variar un poco si organizas el azar de otra forma. Lo importante es la tendencia: el almacén resbaloso no llega al 100 %, y SARSA pierde menos mientras explora en CliffWalking.
Extras opcionales
- Otro mapa. Cambia la distribución de estantes y derrames, o haz el almacén de 6×6, y vuelve a entrenar.
- Recoger un paquete. Agrega una casilla de recogida: el robot debe pasar por ella antes del andén. Amplía el estado (casilla × lleva paquete) y ajusta las recompensas.
- Banners con UCB. Implementa UCB para los cuatro banners de PyShop y compáralo con ε-greedy en 20 semillas.
- FrozenLake resbaloso. Entrena el mismo agente en
FrozenLake-v1y compara con el 2.1 % de éxito del agente aleatorio.
Entregables
proyecto.ipynb, ejecutado de principio a fin sin errores, con gráficas visibles y semillas fijas.q_almacen.npyyq_taxi.npy, las tablas finales.INFORME.md(una página): tabla de línea base contra agente en ambos entornos, curvas, política en flechas, tabla del experimento, comparación SARSA y Q-learning, una recomendación para PyShop sobre cuándo confiar en el robot y dos limitaciones del enfoque tabular.
Rúbrica (100 puntos, más 10 de extras)
- Línea base (10 puntos): retorno y éxito al azar en ambos entornos, con semilla.
- Clase Agente (15 puntos): regla de Q-learning correcta, manejo de
terminatedytruncated, sin código específico de un entorno. - Entrenamiento y curvas (15 puntos): curvas legibles con media móvil y ejes rotulados.
- Política y evaluación (15 puntos): mapa de flechas comentado y evaluación greedy de 100 episodios comparada con la línea base.
- Experimento de hiperparámetros (15 puntos): tabla completa y explicación razonada.
- SARSA contra Q-learning (15 puntos): implementación correcta y diferencia explicada con on-policy y off-policy.
- Informe (15 puntos): cifras claras, recomendación concreta y limitaciones honestas.
- Extras (hasta 10 puntos): cualquiera de los opcionales, medido e interpretado.