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