# aprendizaje-por-refuerzo-en-python
Aprendizaje por Refuerzo en Python
Volver a la portada del cursoConfigurar Entornos Gym
Sección 4 · Implementación en Python
Notebook: configurar entornos de Gymnasium
Antes de entrenar al robot del almacén de PyShop necesitas manejar con soltura la herramienta donde vive: Gymnasium, la biblioteca de entornos de aprendizaje por refuerzo que mantiene la Farama Foundation como continuación (un fork) de OpenAI Gym. Esta guía acompaña al notebook primeros-pasos-con-gymnasium: explica cómo abrirlo, qué hace cada sección y qué resultados debes obtener.
Instalación y apertura
En una terminal, dentro de un entorno virtual:
python -m venv .venv
.venv\Scripts\activate # Windows
source .venv/bin/activate # Linux y macOS
pip install gymnasium numpy matplotlib
Abre el notebook en Jupyter, VS Code o Google Colab (en Colab basta con !pip install gymnasium en la primera celda). El curso usa Gymnasium 1.4.0 y NumPy 2.4.6 con Python 3.13. Los entornos de texto que se usan aquí no necesitan extras como gymnasium[box2d].
Objetivos
- Crear un entorno con
gym.makey reiniciarlo conreset. - Leer los espacios de estados y de acciones.
- Dar pasos con
stepy entender sus 5 valores. - Distinguir
terminateddetruncated. - Escribir el almacén de PyShop como entorno propio y validarlo con
check_env.
1. Versiones
La primera celda imprime las versiones instaladas. Si tu Gymnasium es anterior a 1.0, algunos nombres de entornos y la forma de step pueden no coincidir con el curso.
2. FrozenLake: make, reset, espacios y render
import gymnasium as gym
env = gym.make("FrozenLake-v1", render_mode="ansi")
estado, info = env.reset(seed=42)
print(estado, info) # 0 {'prob': 1}
print(env.observation_space, env.action_space) # Discrete(16) Discrete(4)
print(env.render())
FrozenLake es un lago de 4×4 con mapa SFFF / FHFH / FFFH / HFFG: S es la salida, F hielo firme, H un hoyo y G la meta. reset devuelve el estado inicial y un diccionario info; la semilla hace que el azar se repita. Con render_mode="ansi", render() devuelve el mapa como texto.
3. step y sus 5 valores
env.step(accion) devuelve (observacion, recompensa, terminated, truncated, info). terminated indica que el episodio acabó por sus reglas (caer en un hoyo o llegar a la meta); truncated, que se cortó desde fuera: FrozenLake se registra con un límite de 100 pasos (un wrapper TimeLimit). El bucle de un episodio se detiene cuando cualquiera de los dos es True.
4. Un episodio aleatorio
El notebook juega un episodio completo eligiendo acciones con env.action_space.sample() e imprime cada paso. Observa cómo, aunque se pida una dirección, el agente a veces se mueve hacia otra: el lago es resbaloso por defecto.
5. 1000 episodios aleatorios
Al repetir el experimento 1000 veces, el agente aleatorio llega a la meta solo en el 2.1 % de los episodios. FrozenLake da recompensa 1 al llegar y 0 en todo lo demás: es una recompensa escasa, y un agente que casi nunca la ve tiene muy poca información para aprender.
6. Otros entornos: CliffWalking y Taxi
CliffWalking-v1: 48 estados y 4 acciones; −1 por paso y −100 al caer al acantilado.Taxi-v4: 500 estados y 6 acciones (4 movimientos, recoger y dejar al pasajero).
Ojo: en Gymnasium 1.4, gym.make("Taxi-v3") lanza el error DeprecatedEnv y pide usar Taxi-v4. Si copias código de tutoriales antiguos, cambia el número de versión.
7. El almacén de PyShop como entorno propio
Un entorno propio es una clase que hereda de gym.Env, declara observation_space y action_space en __init__ e implementa reset, step y render. El notebook construye AlmacenPyShop: una cuadrícula de 5×5 con Discrete(25) estados y Discrete(4) acciones, −1 por paso, +10 en el andén, −10 en un derrame y truncado a los 50 pasos. reset llama a super().reset(seed=seed) para que el generador interno self.np_random respete la semilla.
8. check_env y primeros pasos
from gymnasium.utils.env_checker import check_env
env = crear_almacen()
check_env(env) # sin errores
print(env.reset(seed=42)) # (0, {})
print(env.step(2)) # (1, -1.0, False, False, {})
print(env.step(1)) # (1, -1.0, False, False, {})
check_env comprueba que los espacios y los valores devueltos tengan la forma que Gymnasium espera; puede mostrar un aviso porque el almacén solo tiene modo de render de texto, pero no un error. El segundo paso intenta bajar a una casilla con estante: el robot se queda en la casilla 1 y aun así paga −1.
9. Agente aleatorio en el almacén
En 1000 episodios al azar, el robot obtiene un retorno medio de −31.87 con 25.2 pasos de media. Llega al andén 63 veces, pisa un derrame 813 y se queda sin tiempo 124. Esta es la línea base que el agente de Q-learning tiene que superar.
10. Retorno y descuento
La ruta óptima tiene 8 pasos y retorno 3. Descontada, vale 3.000 con $\gamma = 1$, −0.434 con $\gamma = 0.9$ y −1.906 con $\gamma = 0.5$.
Ejercicios y qué debes obtener
Los ejercicios del final traen assert para comprobar tus respuestas, y las soluciones van después. Al terminar debes tener: Discrete(16) y Discrete(4) en FrozenLake; 2.1 % de éxito al azar; 48 estados en CliffWalking y 500 en Taxi-v4; check_env sin errores; (1, -1.0, False, False, {}) tras el primer paso a la derecha; −31.87 y 63/813/124 con el robot aleatorio. Si una cifra no coincide, revisa la semilla en reset y que la versión sea la misma.