Enunciado EP1
Enunciado EP1
Enunciado EP1
1 Introdução
Neste exercı́cio-programa estudaremos a abordagem de contrução de agentes inteligentes capazes de
resolver problemas através de uma busca no espaço de estados do jogo Pac-Man. Utilizaremos parte
do material/código livremente disponı́vel do curso UC Berkeley CS188 1 .
(ii) implementar algoritmos de busca informada e não-informada, bem como um algoritmo de busca
online, e comparar seus desempenhos.
O jogo Pac-Man é um jogo eletrônico em que um jogador, representado por um boca que se abre e fecha,
deve se mover em um labirinto repleto de comida e fantasmas que o perseguem. O objetivo é comer o
máximo possı́vel de comida sem ser alcançado pelos fantasmas, em ritmo progressivo de dificuldade.
Existem muitas variações do jogo Pac-Man, para esse exercı́cio-programa consideraremos alguns
1
http://ai.berkeley.edu/project_overview.html
1
cenários nos quais utilizaremos algoritmos de busca para guiar o Pac-Man no labirinto a
fim de atingir determinadas posições e coletar comida eficientemente.
1.1 Instalação
Para a realização deste EP será necessário ter instalado em sua máquina a versão 2.7 do Python 2 . Faça
o download dos arquivo ep1.zip disponı́vel na página da disciplina no e-Disciplinas. Descompacte o
arquivo ep1.zip e rode na raiz do diretório o seguinte comando para testar a instalação:
$ cd search/
$ python pacman.py
Após executar esta linha de comando uma nova janela deve ter sido aberta em seu desktop com o
simulador sendo executado e o agente do Pac-Man parado (pois chamamos a linha de comando sem
nenhum algoritmo especificado). Em exemplo da execução pode ser visto abaixo:
2
https://www.python.org/downloads/
2
2 Pac-Man como problema de busca
Nesse exercı́cio-programa você resolverá diversos problemas de busca. Independente da busca, a
interface que implementa a formulação do problema é definida pela classe abstrata e seu conjunto de
métodos abaixo (disponı́vel no arquivo search.py na pasta search/):
# arquivo search.py
class SearchProblem:
def getStartState(self):
""" Returns the start state for the search problem. """
# ...
Note que embora a formulação de busca seja sempre a mesma para cada cenário de busca, a repre-
sentação de estados varia de problema a problema. Por exemplo, veja a classe PositionSearchProblem
no arquivo searchAgents.py e entenda a representação de estados utilizada para esse problema. Isso
será importante pois você terá que implementar outra representação de estados para outro cenário de
busca em um dos exercı́cios.
3
3 Implementação
Arquivos que você precisará editar:
• search/searchAgents.py onde os agentes baseados em busca serão implementados, isto é, onde
formulamos os problemas que resolveremos nesse EP.
• pacman.py arquivo principal para executar o jogo. Descreve a representação de estado ac-
cessı́vel para acesso de informações dos agentes de busca.
4 Parte prática
Neste EP, você deverá resolver diferentes problemas de busca para dois ambientes diferentes do jogo
Pac-Man, que chamaremos de Cenário 1 e Cenário 2. No Cenário 1 o Pac-Man deve procurar a comida
que está localizada em uma única posição do labirinto. No Cenário 2, o Pac-Man deve procurar a
comida que está distribuida nos quatro cantos do labirinto. Você deverá implementar os seguintes
algoritmos de busca: Busca em Largura, Busca em profundidade, Busca de Custo Uniforme, Busca
Heurı́stica e um algoritmo de Busca Online chamado de LRTA∗ . Para isso, você deverá implementar
algumas funções nos arquivos search.py e searchAgents.py (sinalizadas pelo comentário ”*** ADD
YOUR CODE HERE ***”, contendo um exemplo de código que deverá ser eliminado, chamado de o
código util.raiseNotDefined().
4
Observação: note que o tabuleiro do jogo mostra os estados visitados pela busca por cor, isto é,
quanto mais vermelho escuro mais cedo na busca o estado foi visitado (o que serve para ilustrar e
visualizar a árvore de busca). Além disso, para todas essas buscas seu algoritmo DFS deve encontrar
uma solução rapidamente, isto é, se demorar mais que alguns milisegundos algo provavelmente está
errado no seu código!
Observação: se o Pac-Man se mover muito devagar tente usar a opção --frameTime 0 na linha de
comando.
Implemente busca em grafo A∗ no arquivo search.py na função aStarSearch. Para testar seu algoritmo
rode o comando:
Nesse item você deverá implementar o algoritmo LRTA∗ (Learning Real-Time A∗ ) (visto na Aula 6).
Você deverá se basear no algoritmo da Figura 2 na Seção 6.1. do artigo Learning in Real-Time
Search: A Unifying Framework, disponı́vel em http://www.aaai.org/Papers/JAIR/Vol25/
JAIR-2504.pdf. Implemente a busca (LRTA∗ ) no arquivo search.py na função learningRealTimeAStar.
Teste o algoritmo para cada tamanho de layout do Pac-Man com números de trials 10, 20 e 100. Use
lookahead de 1.
Reporte em uma tabela para cada configuração (layout, número de trials) os seguintes resultados:
5
1. custo total do caminho
Observação: Você pode passar a opção -q (ou --quietTextGraphics) para não iniciar a simulação
gráfica do algoritmo.
Nesse exercı́cio vamos implementar um novo problema de busca. Você deverá completar a imple-
mentação dos métodos da classe CornersProblem no arquivo searchAgents.py. Você deverá escolher
uma representação de estados que codifique somente a informação necessária para detectar se
todos os 4 cantos do labirinto foram visitados. Para testar a formulação do problema rode o comando:
Observação: Não utilize um objeto GameState como estado de busca! Se utilizar, seu código prova-
velmente ficará errado e muito lento.
Além da nova formulação de problema, você deverá implementar uma heurı́stica não trivial e consis-
tente na função cornersHeuristic. Para testar sua heurı́stica rode o comando:
Nesse exercı́cio consideramos heurı́sticas triviais aquelas que devolvem 0 (zero). A heurı́stica trivial
não ajuda muito do ponto de vista da eficiência do algoritmo. Você pode usar a heurı́stica trivial para
compará-la com a sua proposta de heurı́stica não-trivial.
O algoritmo LRTA∗ pode ser testado para esse problema rodando o comando:
6
$ python pacman.py -l mediumCorners -p LRTAStarCornersAgent -z 0.5
5 Relatório
Após o desenvolvimento da parte prática, você deverá testar seus algoritmos e redigir um relatório,
claro e sucinto (máximo de 4 páginas), fazendo uma análise comparativa de desempenho dos algoritmos
implementados nos dois ambientes de teste. Assim, você deverá:
(a) compilar em tabelas as estatı́sticas das buscas implementadas em termos de nós expandidos e
tamanho de plano;
(b) discutir as vantagens e desvantagens de cada método, no contexto dos dados obtidos;
5.1 Questões
Questão 2 - Busca em Largura A sua implementação de busca em largura encontra uma solução
de custo mı́nimo? Por quê?
Questão 4 - Busca Heurı́stica Você deve ter percebido que o algoritmo A* encontra uma solução
mais rapidamente que outras buscas. Por quê? Qual a razão para se implementar uma heurı́stica
consistente para sua implementação da busca A*?
Questão 5 - Busca Heurı́stica LRTA∗ Compare os resultados obtidos para os testes do LRTA∗ .
Quais caracterı́sticas diferenciam esse algoritmo dos demais algoritmos implementados? O que você
pode dizer sobre o valor estimado do estado inicial a medida que o número de trials aumenta? Com
base somente nos resultados obtidos como você pode verificar se o o algoritmo convergiu?
6 Entrega
Você deve entregar um arquivo EP1-NUSP-NOME-COMPLETO.zip contendo APENAS os arquivos:
7
(1) search.py e searchAgents.py com as implementações da parte prática;
(2) relatório em formato PDF com as questões e comparação e discussão dos resultados (máximo de
4 páginas).
Não esqueça de identificar cada arquivo com seu nome e número USP! No código coloque
um cabeçalho em forma de comentário.
7 Critério de avaliação
O critério de avaliação dependerá parcialmente dos resultados dos testes automatizados do autogra-
der.py. Dessa forma você terá como avaliar por si só parte da nota que receberá para a parte prática.
Note que para o algoritmo LRTA∗ não há testes automatizados no autograder. Avaliaremos
esse algoritmo separadamente. Para rodar os testes automatizados, execute o seguinte comando:
$ python autograder.py