Descubre cómo las máquinas aprenden a tomar decisiones a través de la prueba y el error, buscando siempre la máxima recompensa.
(Pasa el cursor)
Es quien aprende y toma decisiones. Piensa en él como el jugador o el robot que explora el mundo.
(Pasa el cursor)
Es el "mundo" con el que el agente interactúa. Contiene los estados, las reglas y los desafíos.
(Pasa el cursor)
Una señal (positiva o negativa) que el entorno le da al agente. Es el feedback que le indica si una acción fue buena o mala.
(Pasa el cursor)
La estrategia o "cerebro" del agente. Es un mapa que le dice cuál es la mejor acción a tomar en cada estado.
Descubre qué tan "valiosa" es cada casilla en función de su cercanía a la recompensa (⭐) o al peligro (🔥).
Una vez conocidos los valores, se determina la mejor ruta (política →), moviéndose siempre hacia la casilla de mayor valor.
Este es un ejemplo simplificado de Q-Learning usando la biblioteca Gymnasium para resolver el entorno clásico "FrozenLake".
import gymnasium as gym
import numpy as np
# 1. Crear el entorno
# 'FrozenLake-v1' es un mundo de rejilla donde el agente debe ir del inicio (S) a la meta (G)
# sin caer en los agujeros (H). `is_slippery=False` lo hace determinista.
env = gym.make('FrozenLake-v1', is_slippery=False)
# 2. Inicializar la Q-Table con ceros
# Una tabla para almacenar los "valores" de cada par (estado, acción).
# Filas: número de estados (casillas). Columnas: número de acciones (izquierda, abajo, derecha, arriba).
q_table = np.zeros([env.observation_space.n, env.action_space.n])
# 3. Definir los hiperparámetros
alpha = 0.1 # Tasa de aprendizaje: qué tanto actualizamos los valores Q.
gamma = 0.9 # Factor de descuento: importancia de las recompensas futuras.
epsilon = 1.0 # Tasa de exploración: probabilidad de tomar una acción aleatoria.
num_episodes = 10000 # Número de veces que el agente jugará el juego para aprender.
# 4. Bucle de entrenamiento
for i in range(num_episodes):
# Reiniciar el entorno para un nuevo episodio
state, info = env.reset()
done = False
while not done:
# Decidir si explorar o explotar
if np.random.uniform(0, 1) < epsilon:
action = env.action_space.sample() # Explorar: tomar acción aleatoria.
else:
action = np.argmax(q_table[state]) # Explotar: tomar la mejor acción conocida.
# Realizar la acción y observar el resultado
next_state, reward, terminated, truncated, info = env.step(action)
done = terminated or truncated
# 5. Actualizar la Q-Table usando la ecuación de Bellman
# Esta es la fórmula del aprendizaje.
old_value = q_table[state, action]
next_max = np.max(q_table[next_state])
# El nuevo valor Q es una mezcla del valor antiguo y el valor aprendido.
new_value = old_value + alpha * (reward + gamma * next_max - old_value)
q_table[state, action] = new_value
state = next_state
print("¡Entrenamiento finalizado!")
print("\nQ-Table resultante:")
print(q_table)
env.close()