Saltar al contenido

# aprendizaje-por-refuerzo-en-python

Aprendizaje por Refuerzo en Python

Volver a la portada del curso
Notebook

Configurar 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.make y reiniciarlo con reset.
  • Leer los espacios de estados y de acciones.
  • Dar pasos con step y entender sus 5 valores.
  • Distinguir terminated de truncated.
  • 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.

Recursos