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

[Dúvida] Q-Learning Fronzen Lake

Referente ao exercício proposto, fiz da seguinte forma:

# Instalação da Biblioteca Gymnasium
!pip install gymnasium

# ---- Importação de Bibliotecas ----- #
import gymnasium as gym
import numpy as np
import random

# ---- Configurando o ambiente para a execução ----#
env = gym.make("FrozenLake-v1", is_slippery=True)

states_number = env.observation_space.n
actions_number = env.action_space.n

# ----Inicialização da Q-table e hiperparâmetros
q_table = np.zeros((states_number, actions_number))

# Hiperparâmetros
alpha = 0.8  # Taxa de aprendizado
gamma = 0.95  # Fator de desconto
epsilon = 1.0  # Probabilidade inicial de explorar ações aleatórias
epsilon_decay = 0.999  # Reduz gradualmente a exploração conforme o aprendizado
epsilon_min = 0.01  # Limite mínimo de exploração
num_episodes = 10000  # Número total de episódios de aprendizado
max_steps = 150
rewards_per_episode = []

# ---- Iniciando o treinamento Q-Learning ---- #
for episode in range(num_episodes):
    # Reinicia o ambiente a cada episódio
    state, _ = env.reset()
    total_reward = 0

for step in range(max_steps):
  if np.random.rand() < epsilon:
      action = env.action_space.sample() # Explora uma ação aleatória
  else:
    action = np.argmax(q_table[state, :]) # Escolhe a ação com base na Q-table

  # Executando a ação que foi escolhida
  next_state, reward, done, _, _ = env.step(action)
  
  # Atualização da Q-table e melhor ação no próximo estado
  best_next_action = np.max(q_table[next_state])  
  q_table[state, action] += alpha * (reward + gamma * best_next_action - q_table[state, action])
  
  # Avanço ao próximo estado e reward
  state = next_state
  total_reward += reward

  if done:
    break

  # Decaimento da exploração
  if epsilon > epsilon_min:
    epsilon *= epsilon_decay
 
  rewards_per_episode.append(total_reward)
 
 # ---- Avaliando o Desempenho ---- #
success = 0
episodes_trial = 1000
for episode in range(episodes_trial):
  state, _ = env.reset()
  
  for step in range(max_steps):
    action = np.argmax(q_table[state, :])
    next_state, reward, done, truncated, _, _ = env.step(action)
    done = truncated
    state = next_state
    
    if done and reward == 1.0:
      success +=1
      break

print(f"Episódios com êxito: {success/episodes_trial}")
3 respostas

Oi, Anderson! Como vai?

Agradeço por compartilhar.

Gostei da sua abordagem no Q-Learning, importante como você organizou a Q-table e definiu os hiperparâmetros, isso mostra entendimento do funcionamento do aprendizado por reforço e da lógica de exploração e aproveitamento das ações. Seu cuidado em separar treino e avaliação também é um ponto importante.

Continue explorando esse tipo de implementação prática, pois ela ajuda muito a fixar conceitos teóricos de IA.

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

obrigado pelo suporte

Agradeço o compartilhamento de Q-Learning.
Pelo algoritmo de aprendizado por reforço (Reinforcement Learning)