Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
2
respostas

Mão na massa: Q Learning e FrozenLake

1. Configurando o ambiente

!pip install gymnasium

import gymnasium as gym
import numpy as np

# Criar o ambiente
env = gym.make(
    "FrozenLake-v1",
    is_slippery=True
)

2. Definindo os hiperparâmetros

# Inicializar a Q table
q_table = np.zeros(
    (env.observation_space.n,
     env.action_space.n)
)

# Hiperparâmetros
alpha = 0.1
gamma = 0.95
epsilon = 1.0

epsilon_min = 0.01

epsilon_decay = 0.995

episodios = 5000

3. Treinando o agente

for episodio in range(episodios):

    estado, _ = env.reset()

    terminado = False

    while not terminado:

        # Estratégia epsilon greedy
        if np.random.rand() < epsilon:

            acao = env.action_space.sample()

        else:

            acao = np.argmax(
                q_table[estado]
            )

        novo_estado, recompensa, terminado, truncado, _ = env.step(acao)

        # Atualizar a Q table
        q_table[estado, acao] = q_table[estado, acao] + alpha * (
            recompensa +
            gamma * np.max(q_table[novo_estado]) -
            q_table[estado, acao]
        )

        estado = novo_estado

    # Reduzir a exploração
    epsilon = max(
        epsilon_min,
        epsilon * epsilon_decay
    )

4. Avaliando o desempenho

sucessos = 0

for _ in range(100):

    estado, _ = env.reset()

    terminado = False

    while not terminado:

        acao = np.argmax(
            q_table[estado]
        )

        estado, recompensa, terminado, truncado, _ = env.step(acao)

    if recompensa == 1:

        sucessos += 1

print(
    f"Episódios bem sucedidos: {sucessos}/100"
)
2 respostas

Olá, Estudante! Como vai?

Parabéns pela resolução da atividade!

Vi que você explorou o FrozenLake-v1 para treinamento de agentes com Python, utilizou muito bem a Q-table para aprendizado por reforço e ainda compreendeu a importância da estratégia epsilon-greedy para balancear exploração e exploração.

Continue postando as suas soluções, com certeza isso ajudará outros estudantes e tem grande relevância para o fórum.

Uma dica interessante é implementar uma métrica de desempenho média ao longo dos episódios. Assim:

recompensas = []
for episodio in range(episodios):
    # ... código de treino ...
    recompensas.append(recompensa_total)

print(f"Recompensa média: {np.mean(recompensas)}")

Isso faz com que você acompanhe a evolução do agente de forma mais consistente.

Se quiser aprofundar ainda mais, algumas boas práticas são:

  • Normalizar recompensas: ajuda a estabilizar o aprendizado.
  • Experimentar ambientes diferentes: amplia a compreensão dos limites da Q-learning.
  • Testar diferentes taxas de aprendizado (alpha): pode acelerar ou estabilizar a convergência.

Ah, uma pergunta: você acha mais interessante treinar o agente em ambientes simples como FrozenLake para consolidar conceitos, ou prefere ambientes complexos para desafiar o aprendizado desde o início?

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

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

Obrigado pelo feedback e pela dica.