1
resposta

[Projeto] Q-LEARNING NO FROZENLAKE-V1

============================================

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}")

1 resposta

Ei! Tudo bem, Marcelo?

Seu projeto de Q-Learning no FrozenLake ficou muito bem montado! A estrutura está clara, você configurou corretamente o ambiente, aplicou a política epsilon-greedy, atualizou a Q-table da forma certa e ainda separou a fase de avaliação, excelente organização!

Ótimo trabalho e excelente implementação!

Continue se dedicando aos estudos e qualquer dúvida, compartilhe.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!