Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

RESULTADO DE : Mão na massa: identificando objetos com MobileNetV2

import numpy as np
import gymnasium as gym

Inicializar o ambiente FrozenLake

O agente precisa atravessar um lago congelado sem cair nos buracos

env = gym.make("FrozenLake-v1", is_slippery=True)

Definir os hiperparâmetros do Q-Learning

- alpha = 0.8  # Taxa de aprendizado: o quanto o agente aprende de novas informações
- gamma = 0.95  # Fator de desconto: quão importante são as recompensas futuras em comparação com as imediatas
- epsilon = 1.0  # Probabilidade inicial de explorar ações aleatórias
- epsilon_decay = 0.999  # Reduz gradualmente a exploração conforme o agente aprende
- epsilon_min = 0.01  # Limite mínimo de exploração para garantir que o agente ainda explore um pouco
- num_episodes = 20000  # Número total de tentativas de aprendizado (episódios)

Criar a tabela Q (Q-table) com zeros

As linhas representam os estados e as colunas representam as ações

q_table = np.zeros((env.observation_space.n, env.action_space.n))

Iniciar o treinamento do agente

for episode in range(num_episodes):
    # Reiniciar o ambiente a cada episódio
    state, _ = env.reset()
    done = False
while not done:
    # Escolher uma ação usando a estratégia epsilon-greedy
    if np.random.rand() < epsilon:
        action = env.action_space.sample()  # Explorar uma ação aleatória
    else:
        action = np.argmax(q_table[state])  # Explorar a ação com maior valor na Q-table

    # Executar a ação escolhida no ambiente
    next_state, reward, done, truncated, _ = env.step(action)

    # Atualizar a Q-table com a fórmula de aprendizado por reforço
    best_next_action = np.max(q_table[next_state])
    q_table[state, action] += alpha * (reward + gamma * best_next_action - q_table[state, action])

    # Avançar para o próximo estado
    state = next_state

# Reduzir a taxa de exploração gradualmente
if epsilon > epsilon_min:
    epsilon *= epsilon_decay

Avaliar o desempenho do agente treinado

successes = 0
for episode in range(1000):
    state, _ = env.reset()
    done = False
    while not done:
        action = np.argmax(q_table[state])
        state, reward, done, truncated, _ = env.step(action)
        if done and reward == 1.0:
            successes += 1

Exibir o resultado final

print(f"O agente conseguiu atravessar o lago com sucesso em {successes} de 1000 episódios.")

O código está correto e bem estruturado para implementar o Q-Learning no ambiente FrozenLake do Gymnasium. Ele cobre os principais conceitos:

  • Inicialização e configuração do ambiente.
  • Definição dos hiperparâmetros.
  • Implementação do loop de aprendizado com a política epsilon-greedy.
  • Atualização da Q-table com base na equação de Bellman.
  • Avaliação do agente após o treinamento.

Resposta

O agente conseguiu atravessar o lago com sucesso em 780 de 1000 episódios.

2 respostas
solução!

Oi, Ricardo! Como vai?

Agradeço por compartilhar seu código com a comunidade Alura.

Seu código está muito bem estruturado e é ótimo ver como você aplicou os conceitos do Q-Learning no ambiente FrozenLake. O uso da política epsilon-greedy e a forma como configurou os hiperparâmetros mostram que você compreendeu bem o funcionamento do algoritmo.

Continue assim!

Uma dica interessante para o futuro é testar o impacto de diferentes valores para gamma ou alpha e observar como isso afeta o desempenho do agente.Veja este exemplo onde alpha é mais conservador:


alpha = 0.1  # Menor taxa de aprendizado
gamma = 0.99  # Maior foco nas recompensas futuras

Esse ajuste faz com que o agente aprenda mais devagar, mas valorize mais os caminhos que levam a recompensas duradouras.

Qualquer dúvida que surgir, compartilhe no fórum. Abraços e bons estudos!

Alura

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

Agradecido, Monalisa. Farei como sugeriu.