Inteligência Artificial aplicada ao jogo PACMAN Ellen Borges Juliana Nader Maíra Menegas Universidade Federal de São Paulo Bacharelado em Ciência e Tecnologia São José dos Campos/SP [email protected] Universidade Federal de São Paulo Bacharelado em Ciência e Tecnologia São José dos Campos/SP [email protected] Universidade Federal de São Paulo Bacharelado em Ciência e Tecnologia São José dos Campos/SP [email protected] Abstract—The project implements the classical game Pacman making use of Artificial Intelligence techniques. The main reference for this project was University of California’s (Berkeley) Intro to Artificial Intelligence course, CS188. To make a comparison between some algorithms and define which one is better for this type of game, four algorithms were selected: Breadth First Search, Depth First Search, Uniform Cost Search and A Star. Minimax algorithm was used to implement a multi agent search algorithm and make pacman decide for himself. Two evaluation functions were analized: a basic one from UC Berkeley’s course and another created for this project. The one created was better but some improvements should be done in order to grant pacman more "intelligence". Keywords—pacman, DFS, BFS, Uniform Cost, A*, A star, Minimax. I. I NTRODUÇÃO A área de Inteligência Artificial (IA) não só tenta entender, mas também tenta construir entidades inteligentes. Ela engloba uma variedade grande de subáreas, desde áreas gerais até áreas específicas. IA é relevante para qualquer esfera da atividade intelectual humana, ou seja, é um campo universal [4]. Um dos primeiros desafios de IA foi baseado em jogos. Por volta de 1950, o xadrez foi estudado por Korad Zuse, Claude Shannon, Norbert Wiener e por Alan Turing. Desde então houve um progresso constante no padrão dos jogos, até o ponto em que as máquinas ultrapassaram os seres humanos nos jogos de damas e Othello, Xadrez e gamão (embora não todas as vezes). Os jogos são atraentes para os pesquisadores de I.A devido a sua natureza abstrata. Em geral, são complicados de serem resolvidos (e.g. xadrez) e, por isso, geraram inúmeras pesquisas e ideias interessantes em como fazer o melhor uso possível do tempo [4]. Ambientes competitivos, em que as metas dos agentes estão em conflito, dão origem a problemas de busca competitiva, frequentemente conhecidos como jogos [4]. Fig. 1. Exemplo do jogo tradicional de PACMAN conjunto de slides e vídeos conferência com o objetivo de ensinar os conceitos e aplicar as técnicas de IA ao jogo PACMAN, como por exemplo,a árvore de busca A*, Problemas de Satisfação de Restrições, Minimax, Aprendizagem por reforço, Inferência Bayesiana, entre outros. O curso disponibiliza aos alunos uma interface na linguagem Python para auxiliar os alunos na implementação e com isto obter um foco maior nos algoritmos referentes à IA. No presente trabalho, realizou-se uma comparação entre os principais algoritmos de IA, para analisar qual seria o melhor para o jogo Pacman, além de implementar o algoritmo Minimax para dar mais "inteligência" ao personagem Pacman, que joga por si só. II. MOTIVAÇÃO Utilizar as técnicas de Inteligência Artificial torna-se de maior interesse, por ser tratar de um jogo clássico, em que não só o aprendizado é conquistado, mas também é possível alcançar momentos de diversão. III. OBJETIVO O jogo escolhido como objeto de estudo foi o PACMAN. Trata-se de um jogo multiagentes, onde existem dois tipos de personagens, sendo eles: os fantasmas e o come-come. O come-come é controlado por um usuário e tem como objetivo comer todas as bolinhas que estão situadas no cenário. Quando terminar de comer as bolinhas, o usuário vence. Já os fantasmas tentam derrotar o come-come alcançando sua posição (figura 1) [1]. A. Algoritmos de Busca A principal referência utilizada foi o curso introdutório de Inteligência Artificial da Universidade da Califórnia de Berkeley CS188 [2]. Trata-se de um curso composto por um 1) Depth Fisrt Search (DFS): DFS seleciona o nó não expandido mais profundo na árvore de busca para expansão. Não é um algorismo completo nem ótimo, mas possui pouco O principal objetivo é aplicar técnicas de Inteligência Artificial ao jogo PACMAN. Posteriormente realizar um estudo comparativo entre as técnicas adotadas, avaliando o desempenho alcançado. IV. R EVISÃO B IBLIOGRÁFICA requerimento de memória.Ele só precisa guardar um caminho único entre a raíz e uma folha, juntamente com os irmãos não expandidos restantes para cada nó no caminho[4]. 2) Breadth First Search (BFS): BFS seleciona o nó mais superficial que não foi expandido ainda na árvore de busca para expansão. É um algorismo completo e ótimo quando o custo de cada passo é igual, mas sua complexidade espacial o faz impraticável na maioria dos casos[4]. Os algoritmos de busca em largura (bfs) e de busca em profundidade (dfs) (Breadth First Search e Depth Fisrt Search, respectivamente) são bastante semelhantes em código, a principal diferença é que o primeiro utiliza uma lista como estrutura de dados para armazenar os nós da árvore e o segundo utiliza uma pilha. Essa diferença faz com que bfs procure os nós do mesmo nível primeiro, enquanto a dfs expande o nó atual mais profundo (primeiro de profundidade 1, depois o primeiro de profundidade 2...) até encontrar um nó folha [4] 3) Uniform Cost Search (UCS): O algoritmo de busca de custo uniforme (Uniform Cost Search ou ucs) pode ser considerado o mesmo algoritmo de bfs se os passos para cada nó fossem os mesmos. Porém esse algoritmo expande o próximo nó com base no menor caminho existente entre eles[4]. 4) A Star (A*): O A* (A estrela) é um dos algoritmos path-finding mais utilizados em jogos. É útil devido às suas características, como por exemplo, pode-se alterar seu comportamento apenas modificando ou alterando heurísticas [3].A heurística utilizada para o cálculo da distância foi a Manhattan. B. Minimax Para a parte da busca com Multi-agentes, utilizou-se o algoritmo Minimax, visto que este tipo de jogo favorece a utilização deste algoritmo. Jogos com dois jogadores (no caso o pacman e os fantasmas, contados como um) podem ser definidos como um tipo de problema de busca, onde um jogador tenta obter o valor Máximo e o outro, o valor Mínimo, para assim competirem entre si. Alguns componentes a serem considerados: • O estado inicial, que inclui a posição no jogo e identifica o movimento do jogador; • Uma função sucessora, que retorna uma lista de pares (movimento, estado), indicando um movimento legal e o estado resultante; • Um teste terminal, que determina o fim do jogo (estado terminal); • Uma função utilidade, que identifica um valor numérico para os estados terminais. O estado inicial e os movimentos legais para cada lado definem a árvore do jogo. O algoritmo Minimax utiliza uma computação recursiva simples dos valores minimax de cada estado sucessor. A recursão procede até as folhas e então, os valores minimax são trazidos para cima quando a recursão se desenrola. O algoritmo realiza uma exploração Depth First completa da árvore. Este algoritmo se baseia no fato de que cada adversário faz suas escolhas através de decisões ótimas [4]. V. M ETODOLOGIA E XPERIMENTAL A. Materiais Utilizou-se Pyhton como linguagem de programação. Trata-se de uma linguagem de alto nível, que possui um modelo de desenvolvimento aberto e comunitário (OpenSource). Foram utilizados alguns softwares que ajudaram na realização deste projeto: Microsoft Excel, para comparações e gráficos; Software Eclipse com pyDev, IDE para o desenvolvimento dos algoritmos na linguagem python; Command Prompt do Windows para testar os códigos. O curso da UC Berkeley utilizado como referência para este projeto, proporcionou um guia para a implementação dos algoritmos selecionados, além de ter toda a base de códigos do jogo tradicional de pacman semi-pronta, em que só foram alterados alguns arquivos para a implementação dos códigos de IA: search.py e multiAgents.py. O restante dos arquivos foram retirados do site e não foram modificados. O arquivo search.py contém os algoritmos de busca que foram comparados: dfs, bfs, ucs e A*. O arquivo multiAgents.py contém o algoritmo de busca multi agentes utilizado pelos personagems do jogo, o Minimax. Este usa uma função de utilidade ou de avaliação para determinar qual o melhor passo que o personagem deve seguir. B. Métodos Os algoritmos de busca foram implementados com base na teoria do curso da UC Berkeley e do livro de Russel [4], além do que foi aprendido em sala de aula. Após a implementação dos algoritmos de busca, executouse cada algoritmo passando os parâmetros necessários de cada um. Os dados obtidos (pontuação e nós expandidos) foram salvos e na planilha do Excel, gerou-se as curvas para posterior análise e comparação de desempenho dos algoritmos. Após a implementação do algoritmo de busca multi agentes, o Minimax, comparações entre as funções de avaliação do algoritmo foram realizadas para identificar diferenças ou semelhanças entre elas, verificar qual a mais eficiente. Testes também foram feitos rodando o jogo para cada tipo de função e a análise dos dados foi coletada. VI. R ESULTADOS E D ISCUSSÃO Os dados obtidos após a execução de cada algoritmo de busca nos três diferentes tamanhos de labirintos, encontram-se representados nas figuras 2 e 3. A figura 2, representa a quantidade de nós expandidos por cada algoritmo (DFS, BFS, UCS, A*)de acordo com os tipos de labirintos: tiny (pequeno), medium (médio) e big (grande). Para o tiny, a quantidade de nós expandidos foram os mesmos, porém para o medium e big, observou-se que o algoritmo DFS, obteve uma quantidade menor de nós expandidos. Já a figura 3, refere-se ao score (pontuação), obtido por cada algoritmo também de acordo com os três tipos de labirintos. Para o labirinto big, não houve diferença entre todos os algoritmos,muito provavelmente devido a sua configuração, pois observou-se que este labirinto havia apenas um caminho correto que levava o pacman ao destino final. Fig. 2. Nós expandidos de cada algoritmo de acordo com o tipo de labirinto Fig. 5. Algortimo BFS para o labirinto medium maze. Fig. 6. Algortimo UCS para o labirinto medium maze. Fig. 7. Algortimo A* para o labirinto medium maze. Porém para o tiny e o medium, apenas o algoritmo DFS, obteve uma desvantagem em relação aos outros três, devido ao fato dele preferir seguir o caminho mais longo para chegar na bolinha (figura 4). Estes dois labirintos possuíam duas opções de caminhos que chegavam a bolinha. Fig. 3. Score de cada algoritmo de acordo com o tipo de labirinto para o pacman, diante dos resultados obtidos para este tipo de labirinto. Para um resultado mais fidedigno, ressalta-se a importância de gerar outros tipos de labirintos e realizar mais testes. Fig. 4. Algoritmo DFS para o labirinto medium maze. Os outros três algoritmos (BFS, UCS e A*) para o labirinto medium optaram seguir o mesmo caminho (figuras 5, 6 e 7). Pode-se observar que o algoritmo menos eficiente foi o dfs. No entanto, ele foi o que menos expandiu nós para alcançar o objetivo, ou seja, ocupou menos memória. Acabou ocorrendo um trade off entre memória e eficiência. Os outros três algoritmos obtiveram resultados semelhantes entre si, impossibilitando a escolha de um algoritmo somente como o melhor para o jogo. Isso quer dizer que qualquer um entre os três leva a um resultado ótimo para ser implementado Em relação ao algoritmo de busca multi agentes, Minimax, percebeu-se que ele funciona para o jogo. No entanto, nota-se que o personagem não é muito "inteligente", ocorrendo muitas vezes a estagnação do personagem até que algum fantasma o pressione para andar e, assim, voltar a se alimentar. Podese notar diferenças principalmente com o tipo de função de avaliação utilizada. Comparou-se a função criada com a básica já existente nos códigos obtidos, em que esta só analisava a pontuação do jogo. A função criada foi mais eficiente, causando maiores pontuações e menos jogos perdidos. A questão da estagnação do personagem pacmam foi frequente nas duas funções analisadas, mas notou-se uma melhora na performance (leia-se também agilidade do pacman e menos tempo de execução de jogo), em que o personagem pacman ficava menos parado ao adicionar uma "inteligência" a mais aos fantasmas, acrescentando o parâmetro "-g DirectionalGhost" ao rodar o programa. Isso acontece pois os fantasmas são "agentes perturbadores" do algoritmo, e isso obriga o pacmam a se mover e encontrar novos movimentos ao invés de ficar estagnado, a salvo dos fantasmas. O tempo de jogo com fantasmas inteligentes chega a ser menos do que a metade do tempo de jogo quando os fantasmas são menos inteligentes, porque o pacman fica muito tempo parado em algum pedaço do labirinto (figura 8). TABLE II. P ORCENTAGEM DE VITÓRIA DE CADA FUNÇÃO E SUA RESPECTIVA ORDEM DE RAPIDEZ . Funções Vitórias (%) evaluationFunction evaluationFunction com fantasmas scoreEvaluationFunction com fantasmas scoreEvaluationFunction 90 50 0 10 Ordem de rapidez 2 1 3 4 fantasmas mais inteligentes que pressionam mais o pacman e, com isso, o pacman fica mais suscetível a perder também. A porcentagem de vitórias para cada função diferente do Minimax pode ser observada na tabela II (table II), mostrando a eficiência de cada um. O algoritmo Minimax mostra-se basntante eficiente com a função criada, acertando 90% das vezes. VII. C ONCLUSÃO E T RABALHOS F UTUROS Diante dos resultados obtidos, conclui-se que em relação aos algoritmos de busca, os algoritmos bfs, A* ou UCS são os os mais indicados para este tipo de jogo, o qual envolve como ambiente, um labirinto. O que coincide com as referências encontradas, o qual citam o A* como um algoritmo ótimo. Fig. 8. Exemplo de estagnação do pacman em labirinto do tipo medium com vitória. A figura 8 mostra um exemplo em que o algoritmo Minimax estava sendo utilizado com a função de avaliação básica do código (scoreEvatluationFunction), sem a perseguição inteligente dos fantasmas, durante um tempo de execução extremamente alto pois o personagem pacman ficava estagnado no canto esquerdo, só alterando a posição quando um fantasma fosse em sua direçao. Apesar deste problema, o pacman conseguiu ter uma vitória neste caso e diminuiu a pontuação para -509, porque ganhou no final. Lembrando que a cada segundo que o pacman não come, a pontuação vai diminuindo. O total negativo da pontuação na figura dá um exemplo de como o tempo de execução foi longo neste caso. TABLE I. P ONTUAÇÕES OBTIDAS PARA CADA FUNÇÃO COM 10 REPETIÇÕES CADA . Funções evaluation scoreEvaluation evaluation scoreEvaluation Function Function Scores Function Function com fantasmas com fantasmas 1 1383 1470 409 376 2 1683 1599 105 56 3 1476 1603 384 -509 4 1640 83 1586 172 5 1403 1711 223 -291 6 478 576 115 56 7 1459 235 1648 -295 8 1672 366 248 257 9 1500 635 448 54 10 1143 1688 354 356 Média 1383,70 996,60 552,0 23,20 Obs: Pontuações em negrito representam partidas que obtiveram vitória. A tabela I mostra as pontuações (scores) de cada algoritmo em 10 execuções de cada. Nota-se que os algoritmos com pontuações mais altas e mais rápidos (table II) são aqueles com a função de avaliação criada. O mais rápido é o que contém A função de avaliação é uma das partes mais importantes do algoritmo Minimax, afetando diretamente na performance do algoritmo e no tempo de execução do jogo. No entanto, precisa ser melhorado ou acrescentado algum algoritmo de aprendizagem. Isto evitaria a estagnação do personagem e faria com que ele se movimentasse mais, a fim de terminar o jogo com a mais alta pontuação possível, ao invés de ficar parado. A função desenvolvida evita bastante este tipo de problema, mas não o soluciona. Para projetos futuros, a implementação da poda alfa-beta seria interessante para melhorar a resposta do Pacman, assim, a busca do melhor caminho em profundidades maiores não seria inviável. Além disso, outros métodos de aprendizagem podem ser implementados no jogo do Pacman, como a aprendizagem por reforço. AGRADECIMENTOS Agradecimentos aos criadores do curso da UC Berkeley pela criatividade de organizar um curso que chama a atenção dos alunos e, principalmente, ensina IA de maneira divertida. Além disso, ainda mantêm o conteúdo do curso disponível a todos. R EFERENCES [1] Appio, R.A.;Sistemas Multiagentes utilizando a linguagem AgentSpeak(L) para criar estratégias de armadilha e cooperação em um jogo tipo PACMAN. [Trabalho de conclusão de curso].Blumenau: Universidade Regional de Blumenau, Curso de Ciência da Computação, 2014. [2] DeNero, J.; Klein D.;Teaching Introductory Artificial Intelligence with Pac-Man. Computer Science Division. University of California Berkeley. 2010. Site da disciplina: http://ai.berkeley.edu/home.html [3] Osório, F.; Pessin, G.;Ferreira, S.;Nonnenmacher, V.; Inteligência Artificial para Jogos: Agentes especiais com permissão para matar... e raciocinar!. Universidade do Vale do Rios dos Sinos, Graduação em Jogos Digitais,São Leopoldo, RS. [4] Russell, S. and Norvig, P.;Inteligência Artificial, 2 ed. Campus, tradução da 2a edição , 2004.