============================================
Q-LEARNING NO FROZENLAKE-V1 (GYMNASIUM)
============================================
1) Instalação (no Colab)
Se estiver rodando localmente, pode rodar esse comando no terminal em vez de dentro do script.
!pip install gymnasium
2) Imports
import gymnasium as gym
import numpy as np
import random
3) Configurar o ambiente FrozenLake
env = gym.make("FrozenLake-v1", is_slippery=True) # lago escorregadio (clássico)
n_states = env.observation_space.n # número de estados
n_actions = env.action_space.n # número de ações
print("Estados:", n_states)
print("Ações:", n_actions)
4) Inicializar Q-table e hiperparâmetros
q_table = np.zeros((n_states, n_actions))
alpha = 0.8 # taxa de aprendizado
gamma = 0.95 # fator de desconto
epsilon = 1.0 # exploração inicial
epsilon_min = 0.01
epsilon_decay = 0.995
num_episodes = 5000
max_steps = 100 # passos máximos por episódio
rewards_por_ep = []
5) Treinamento com Q-Learning
for episode in range(num_episodes):
state, info = env.reset()
total_reward = 0
for step in range(max_steps):
# Política epsilon-greedy
if random.uniform(0, 1) < epsilon:
action = env.action_space.sample() # explorar
else:
action = np.argmax(q_table[state, :]) # explorar o melhor conhecido
next_state, reward, terminated, truncated, info = env.step(action)
done = terminated or truncated
# Atualização da Q-table (Q-Learning)
old_value = q_table[state, action]
next_max = np.max(q_table[next_state, :])
new_value = (1 - alpha) * old_value + alpha * (reward + gamma * next_max)
q_table[state, action] = new_value
state = next_state
total_reward += reward
if done:
break
# Decaimento da exploração
if epsilon > epsilon_min:
epsilon *= epsilon_decay
rewards_por_ep.append(total_reward)
print("Treinamento concluído!")
6) Avaliação do agente (sem exploração)
num_test_episodes = 100
sucessos = 0
for episode in range(num_test_episodes):
state, info = env.reset()
for step in range(max_steps):
action = np.argmax(q_table[state, :]) # sempre escolhe a melhor ação aprendida
next_state, reward, terminated, truncated, info = env.step(action)
done = terminated or truncated
state = next_state
if done:
if reward == 1.0:
sucessos += 1
break
print(f"Episódios bem-sucedidos: {sucessos}/{num_test_episodes}")
print(f"Taxa de sucesso: {sucessos/num_test_episodes:.2f}")