# =========================================
# 1. INSTALAÇÃO E IMPORTAÇÃO
# =========================================
import numpy as np
import gymnasium as gym
# Inicializa o ambiente FrozenLake-v1
env = gym.make("FrozenLake-v1")
# =========================================
# 2. HIPERPARÂMETROS E Q-TABLE
# =========================================
# Número de estados e ações
n_states = env.observation_space.n
n_actions = env.action_space.n
# Inicializa a Q-table com zeros
q_table = np.zeros((n_states, n_actions))
# Hiperparâmetros
alpha = 0.8 # taxa de aprendizado
gamma = 0.95 # fator de desconto
epsilon = 1.0 # taxa de exploração inicial
epsilon_min = 0.01 # valor mínimo de exploração
epsilon_decay = 0.995
# Treinamento
n_episodes = 10000
max_steps = 100
# =========================================
# 3. TREINAR O AGENTE COM Q-LEARNING
# =========================================
for episode in range(n_episodes):
state, info = env.reset()
done = False
for step in range(max_steps):
# Política epsilon-greedy
if np.random.random() < epsilon:
action = env.action_space.sample()
else:
action = np.argmax(q_table[state])
next_state, reward, terminated, truncated, info = env.step(action)
done = terminated or truncated
# Atualização Q-Learning
best_next_action = np.argmax(q_table[next_state])
td_target = reward + gamma * q_table[next_state, best_next_action] * (not done)
td_error = td_target - q_table[state, action]
q_table[state, action] = q_table[state, action] + alpha * td_error
state = next_state
if done:
break
# Decaimento do epsilon
if epsilon > epsilon_min:
epsilon = max(epsilon_min, epsilon * epsilon_decay)
# =========================================
# 4. AVALIAR O DESEMPENHO
# =========================================
n_eval_episodes = 1000
successes = 0
for episode in range(n_eval_episodes):
state, info = env.reset()
done = False
for step in range(max_steps):
# Sem exploração: escolhe sempre a melhor ação aprendida
action = np.argmax(q_table[state])
next_state, reward, terminated, truncated, info = env.step(action)
done = terminated or truncated
state = next_state
if done:
if reward == 1:
successes += 1
break
print("Q-table treinada:")
print(q_table)
print(f"\nEpisódios bem-sucedidos: {successes} de {n_eval_episodes}")
print(f"Taxa de sucesso: {successes / n_eval_episodes:.2%}")
env.close()