A implementação dos códigos que geram as janelas tornaram a utilização do código muito mais intuitiva, não sendo necessário definir os parâmetros diretamente no terminal do python, o que torna sua utilização mais agradável. A janela inicial indica o objetivo principal do projeto, assim como já leva o usuário a definir a dimensão da matriz:
Janela inicial
A próxima janela orienta e permite que o usuário configure a quantidade de épocas pelas quais o agente irá treinar, assim como, configure a taxa de exploração que será adotada pelo agente.
Janela de configuração de parâmetros
Após os parâmetros configurados é apresentado para o usuário o labirinto que foi gerado, com o usuário ciente do labirinto em que ocorrerá o treinamento, são disponibilizadas três possibilidades na próxima janela: a possibilidade de utilizar o labirinto gerado (caso opte o treinamento se inicia), não utilizar o labirinto gerado e assim voltar para a janela inicial para gerar um novo labirinto, e sair, onde o programa simplesmente fecha.
Janela de confirmação
Com a confirmação o treinamento passa a ocorrer, ao final do treinamento o software apresenta uma imagem animada do caminho escolhido pelo agente na penúltima época de treinamento, posterior a esta apresentação se situa a última janela, onde se tem a opção de visualizar os resultados numéricos, o mapa de calor e o mapa de política, assim como se tem a possibilidade de sair do software, abaixo estão representadas a janela de escolha e a janela de resultados numéricos. O mapa de calor e o mapa de política estão representados no decorrer do trabalho.
Janela de resultados
Janela de resultados numéricos
Para a realização dos testes, foi idealizado um comparativo entre diferentes parâmetros, para um mesmo labirinto, desta forma podendo observar o impacto dos parâmetros variáveis dentro do treinamento, inicialmente foi feito o treinamento de 1000 épocas de um agente em um labirinto de dimensão 21X21, onde imagem 1 representa o resultado no mapa de calor do agente que foi configurado para agir com uma taxa de exploração de 10% e a segunda imagem representa o agente que foi configurado para agir com uma taxa de exploração de 70%.
Imagem 1
Imagem 2
É possível ver claramente que o agente que foi configurado para uma taxa de exploração de 70% andou muito mais pelo labirinto, portanto ele adquiriu um conhecimento muito maior sobre a área do labirinto, tendo assim mais certeza sobre o caminho que ele escolheu como ótimo, neste teste ambos convergiram para a melhor saída, entretendo o mapa de calor possibilita visualizar que uma taxa de exploração baixa pode levar o agente achar uma saída que não seja a ótima, já que podemos ver que há regiões em que o agente quase não passou. Entretanto fazer uso de uma taxa de exploração alta, possibilitando que o agente encontre o caminho ótimo até a saída, tem um custo, esse custo se mostra quando comparamos os tempos de treinamento de ambos os agente, o agente que TE (taxa de exploração) foi configurado em 10% terminou o treinamento em 106,11 segundos, enquanto o agente configurado para TE = 70% levou 296,06 segundos, gastando quase três vezes mais tempo para finalizar o treinamento, se provando assim muito mais custoso computacionalmente.
Deste mesmo labirinto foram retiradas também os mapas de política, onde podemos ver claramente os impactos da TE no conhecimento que o agente adquiriu sobre o labirinto. A imagem 3 representa o mapa de política adquirido pelo agente que treinou com TE = 10% e a imagem 4 representa o mapa de política do agente que treinou com TE = 70%.
Imagem 3
Imagem 4
Podemos ver claramente que o agente com TE = 10% teve vários erros em locais que não são o caminho escolhido como ótimo, o agente se mostrou confuso e fazendo movimentos redundantes várias vezes no labirinto (algumas delas estão salientadas em vermelho), enquanto o agente que foi treinado com te = 70% convergiu para a política de fato ótima, onde de qualquer ponto do labirinto ele é capaz de achar a saída com o mínimo de passos necessários, se provando mais uma vez como tendo uma ciência muito maior sobre a área do labirinto.
Outro teste realizado foi o de custo computacional relacionado com o tamanho da matriz gerada, assim como a eficácia do treinamento, este teste teve por objetivo observar o comportamento do treinamento conforme as dimensões das matrizes foram aumentando, foram geradas 5 matrizes quadradas com dimensões: 9x9, 15x15, 21x21, 29x29 e 49x49, todas estas matrizes foram treinadas por 1000 épocas e com TE em 70% para que encontrassem o caminho ótimo até a saída. Foram utilizadas as métricas de tempo, número de passos até a saída obtidas pelo agente (Pπ ), e número de passos ideais até a saída (contados manualmente PI). Deste teste se resultou a seguinte tabela:
Tabela comparativa
Podemos observar que o tempo de treinamento sobe muito conforme o crescimento da dimensão da matriz, chegando a durar 2 horas e 11 minutos no labirinto de 49x49, o que representa um custo computacional muito maior do que para matrizes menores que no caso da 9x9 durou apenas 1 minuto e 40 segundos. As quatro primeiras matrizes conseguiram convergir para o caminho ótimo esperado, entretanto a maior matriz não conseguiu este feito, encontrando um caminho com 221 passos a mais do que o ideal, isso ocorreu pela limitação no número de épocas, onde caso esta mesma matriz fosse treinada por mais épocas o agente certamente convergiria para a saída ótima.
De forma complementar foi observado o efeito que as épocas têm sobre o treinamento, inicialmente foi gerado um labirinto de 15X15, onde foram treinados dois agentes, ambos com TE = 70%. Para realizar este teste o primeiro agente foi configurado para treinar no labirinto por apenas 8 épocas (agente da animação 1) enquanto o segundo agente (agente da animação 2) foi treinado por 100 épocas, a seguir seguem as duas representações de forma animada do caminho que os agentes percorreram até encontrar a saída.
Animação 1
Animação 2
Podemos ver claramente que o agente que treinou por apenas 8 épocas não teve a capacidade de encontrar o caminho até a saída de forma eficiente, pois não teve tentativas o suficiente para refinar seus conhecimentos sobre o labirinto, o agente está visivelmente perdido e andando de forma quase aleatória até que encontra a saída, enquanto o agente que teve 100 épocas de treinamento já tem ciência sobre o labirinto e é capaz de sair dele pelo melhor caminho possível. O agente da animação 1 precisou de 198 passos até encontrar a saída enquanto o agente da animação 2 precisou de apenas 20 passos para encontrar a saída.
Durante a criação do algoritmo alguns códigos foram feitos de forma redundante, assim como alguns códigos foram feitos de forma muito mais complexa do que precisariam ser feitos, pela falta do conhecimento das ferramentas disponibilizadas pela linguagem. O algoritmo ficou com algumas impurezas e poderia ter sido feito de forma mais segmentada e organizada, sendo pontos a serem observados em projetos futuros.
O projeto trouxe um prospecção muito maior sobre a área de programação, fazendo com que um certo nível de habilidade na linguagem python fosse obtido, especialmente vinculado as bibliotecas utilizadas, dentre elas numpy e matplotlib, que são bibliotecas voltadas para o uso matemático, portanto se tornando ferramentas para serem utilizadas posteriormente no curso.
O projeto deixou claro o impacto que cada parâmetro do algoritmo Q-learning tem dentro do treinamento do agente, facilitando o entendimento deste nível de aprendizado de máquina por aqueles que não possuem conhecimento sobre a área, o projeto também torna mais intuitiva a forma como o treinamento é feito, dado que os resultados que costumeiramente se dão por apenas números no terminal da linguagem, foram dados de forma visual, tornando assim o aprendizado de máquina mais atrativo para leigos.
Resolução de labirintos utilizando algoritmo genético
Resolução de labirintos utilizando redes neurais
Implementação de visualização 3D do agente
Implementação do algoritmo de resolução de labirintos em robô físico
Para finalizar foi constatado a eficiência do algoritmo na problemática proposta, apontando as diferenças nos parâmetros utilizados no algoritmo de aprendizado por reforço Q-learning, podendo se observar a eficiência do agente em encontrar a saída ótima do labirinto, desde que esteja munido de parâmetros condizentes com as dificuldades propostas. Este trabalho representa a porta de entrada para a inteligência artificial, área da programação que vem ganhando muito destaque nos últimos anos, e futuramente, irá gerar uma alta demanda de trabalhadores qualificados. Este trabalho foi feito utilizando um dos mais básicos meios de aprendizagem por reforço, o que permite a geração de outros trabalhos posteriores, utilizando métodos mais complexos, ou mesmo aplicando os métodos aqui abordados em problemas reais.