# ==========================================================
# Ambiente: FrozenLake-v1
# ==========================================================
# -----------------------------
# Importação das bibliotecas
# -----------------------------
import numpy as np
import gymnasium as gym
# -----------------------------
# Criação do ambiente
# -----------------------------
# O objetivo é fazer o agente sair do ponto inicial
# e chegar ao destino sem cair nos buracos.
ambiente = gym.make("FrozenLake-v1", is_slippery=True)
# -----------------------------
# Configuração dos hiperparâmetros
# -----------------------------
taxa_aprendizado = 0.75 # Alpha
fator_desconto = 0.95 # Gamma
exploracao = 1.0 # Epsilon inicial
exploracao_minima = 0.02
decaimento = 0.9995
episodios = 18000
# -----------------------------
# Criação da Q-Table
# -----------------------------
# Cada linha representa um estado.
# Cada coluna representa uma ação possível.
q_table = np.zeros(
(ambiente.observation_space.n,
ambiente.action_space.n)
)
# ==========================================================
# Treinamento
# ==========================================================
for episodio in range(episodios):
estado, _ = ambiente.reset()
terminou = False
while not terminou:
# Estratégia epsilon-greedy
if np.random.random() < exploracao:
acao = ambiente.action_space.sample()
else:
acao = np.argmax(q_table[estado])
# Executa a ação escolhida
novo_estado, recompensa, terminou, truncado, _ = ambiente.step(acao)
# Melhor valor futuro encontrado
melhor_valor = np.max(q_table[novo_estado])
# Atualização da Q-Table
q_table[estado, acao] = q_table[estado, acao] + taxa_aprendizado * (
recompensa +
fator_desconto * melhor_valor -
q_table[estado, acao]
)
# Atualiza o estado atual
estado = novo_estado
# Redução gradual da exploração
exploracao = max(exploracao_minima, exploracao * decaimento)
# ==========================================================
# Avaliação do agente
# ==========================================================
testes = 1000
vitorias = 0
for _ in range(testes):
estado, _ = ambiente.reset()
terminou = False
while not terminou:
# Durante o teste o agente utiliza apenas
# a melhor ação aprendida.
acao = np.argmax(q_table[estado])
estado, recompensa, terminou, truncado, _ = ambiente.step(acao)
if recompensa == 1:
vitorias += 1
# ==========================================================
# Resultado Final
# ==========================================================
print("=" * 50)
print("Treinamento concluído!")
print("=" * 50)
print(f"Episódios de treinamento : {episodios}")
print(f"Episódios de teste : {testes}")
print(f"Sucessos obtidos : {vitorias}")
print(f"Taxa de sucesso : {(vitorias/testes)*100:.2f}%")
print("=" * 50)
Atendendo a 5º etapa do desafio, registramos alguns testes dos experimentos com hiperparâmetros:
Teste 1 • Alpha: 0.75 • Gamma: 0.95 • Epsilon Inicial: 1.00 • Resultado esperado: Bom equilíbrio entre aprendizado e exploração.
Teste 2 • Alpha: 0.90 • Gamma: 0.99 • Epsilon Inicial: 1.00 • Resultado esperado: Aprende mais rápido, mas pode oscilar mais.
Teste 3 • Alpha: 0.50 • Gamma: 0.90 • Epsilon Inicial: 0.80 • Resultado esperado: Aprendizado mais lento, porém mais estável.