4) { while ($ads2 == $ads1) { $ads2 = rand(1, $slides); } } $ads3 = rand(1, $slides); if ($slides > 4) { while (($ads3 == $ads2) || ($ads3 == $ads1)) { $ads3 = rand(1, $slides); } } ?>
INF1771 - INTELIGÊNCIA ARTIFICIAL  
TRABALHO 2 LÓGICA  
Descrição:  
A sua cidade foi dominada por zumbis e você é o único sobrevivente! Mas os seus  
problemas estão apenas começando. Todas as saídas da cidade estão bloqueadas, a única  
forma de conseguir escapar é chegando até o único prédio da cidade que possui um  
heliporto com um helicóptero que você pode utilizar para sair em segurança da cidade.  
Porém as ruas da cidade estão repletas de zumbis famintos. E para piorar ainda mais,  
um denso nevoeiro está sobre a cidade e você consegue enxergar poucos metros a sua  
frente. Por sorte os zumbis fazem bastante barulho e é possível reconhecer quando eles  
estão se aproximando. Você também tem uma arma que pode utilizar para matar os  
zumbis, mas cuidado para a sua munição não acabar. Se ficar sem munição, você pode  
tentar chegar a alguma das delegacias abandonadas que existem na cidade. Se você for  
ferido por um zumbi, você deve correr o mais rápido possível até um dos hospitais da  
cidade para pegar um antídoto antes que você também seja transformado em um zumbi.  
Lembre-se de levar com você a maior quantidade possível de antídotos, talvez o resto  
do mundo também tenha sido contaminado. Boa sorte!”  
1
2
3
4
5
6
7
8
9
10 11 12 13 14 15 16 17 18 19 20  
1
2
3
4
5
6
7
8
9
H
M
H
1
0
1
2
3
4
5
6
7
8
9
0
1
1
1
1
1
1
1
1
1
2
M
E
H
Figura 1. Mapa da Cidade.  
O Trabalho 2 consiste em implementar um agente capaz de raciocinar nesse ambiente  
hostil e desconhecido. Você deve implementar uma interface em C ou C++ para  
representar visualmente esse ambiente e utilizar a linguagem Prolog para representar o  
conhecimento do agente.  
Informações Adicionais:  
A cidade deve ser representada por uma matriz 20 x 20 (igual à mostrada na  
Figura 1).  
O agente sempre inicia a jornada na casa dele (posição [3, 3]).  
A posição [18,17] sempre representa o heliporto que permite que o agente  
escape em segurança da cidade.  
O agente pode executar as seguintes ações:  
o Mover_para_frente;  
o Virar_a_direita (rotação de 90°);  
o Pegar_objetoPara pegar munição ou antidoto, se eles existirem no  
local onde o agente se encontra;  
o AtirarPara dar um tiro em linha reta na direção que o agente está  
olhando;  
o Usar_Antídoto Para usar um antídoto e ser curado.  
o Ligar_Helicóptero Para ligar o helicóptero e sair da cidade (a ação  
somente pode ser executada na sala [18,17]);  
Cada ação executada pelo agente possui um custo:  
o Andar = -1;  
o Virar em uma direção = -1;  
o Pegar objeto = -1;  
o Atirar = -10;  
o Ligar o helicóptero = -1;  
o Ser mordido por um zumbi = -100;  
o Matar um zumbi com um tiro = +20;  
Se o agente for mordido por um zumbi ele ficará contaminado e o custo de  
todas as ações que ele executar enquanto estiver contaminado será multiplicado  
por 2. Se ele for mordido por dois zumbis, o custo das ações será multiplicado  
por 3. Toda vez que ele for mordido por mais zumbis o fator de multiplicação  
dos custos será aumentado em +1.  
Por sorte o agente sabe lutar. Toda vez que é atacado por um zumbi, ele  
consegue matar o zumbi que o atacou automaticamente. Mas ele sempre é  
mordido antes de conseguir deter o zumbi.  
Devido ao nevoeiro o agente não consegue ver o que existe a sua frente, mas ele  
possui alguns sensores para perceber o ambiente. O agente possui os seguintes  
sensores:  
o Em locais adjacentes a zumbis, exceto diagonal, o agente ouve os  
gemidos dos zumbis;  
o Em locais adjacentes a hospitais, exceto diagonal, o agente ouve as  
sirenes de ambulâncias que foram deixadas no local;  
o Em locais adjacentes a delegacias, exceto diagonal, o agente ouve as  
sirenes dos carros de policia que foram deixados no local;  
o Ao caminhar contra uma parede o agente sente um impacto;  
o Quando um zumbi morre o agente ouve um grito;  
O sensor que capta os gemidos dos zumbis também é capaz de detectar a  
intensidade de gemidos. Podendo identificar a quantidade de zumbis que estão  
próximos. A intensidade de gemidos é incrementada em +1 para cada zumbi que  
estiver nos locais adjacentes à posição do agente.  
A cidade tem a estrutura de ruas ilustrada na Figura 1. Mas é desconhecida a  
localização dos hospitais, delegacias e agrupamentos de zumbis. Sabe-se apenas  
que a cidade tem:  
o 4 Hospitais;  
o 4 Delegacias;  
o 60 Agrupamentos de Zumbis;  
A posição dos hospitais, delegacias e agrupamentos de zumbis deve ser sorteada  
aleatoriamente no inicio do programa. Mas o agente NÃO PODE ter acesso  
direto a essas informações.  
A localização dos hospitais e delegacias deve estar sempre dentro de um prédio  
e acessível da rua. Assim como ilustrado na Figura 1 (letra H e M).  
Os agrupamentos de zumbis devem sempre estar localizados nas ruas.  
Cada agrupamento de zumbis pode possuir uma quantidade de N de zumbis  
(
entre 1 e 10). O número de zumbis em cada agrupamento também deve ser  
sorteado aleatoriamente na inicialização do programa.  
Cada delegacia possui uma quantidade de N munições (entre 30 e 100). O  
número de munições em cada delegacia deve ser sorteado aleatoriamente na  
inicialização do programa.  
Cada hospital possui uma quantidade de N antídotos (entre 0 e 10). O número de  
antídotos em cada hospital deve ser sorteado aleatoriamente na inicialização do  
programa.  
Inicialmente o agente possui 30 munições e 1 antídoto.  
Se o agente entrar em um local e encontrar um agrupamento de zumbis, ele é  
atacado por todos os zumbis que estiverem naquele local.  
O jogo acaba quando o agente conseguir sair da cidade ou quando ele for  
mordido consecutivamente por mais de 20 zumbis sem ter tomado nenhum  
antídoto.  
Ao conseguir sair da cidade, o agente ganha um bônus de +200 para cada  
antídoto que ele ainda estiver carregando.  
Requisitos:  
O programa deve ser implementado em C ou C++ utilizando a biblioteca do  
SWI-Prolog que permite acessar diretamente o Prolog. Também é permitido  
utilizar outras linguagens, mas antes você deve verificar se ela é compatível com  
o SWI-Prolog (existe uma interface Java, mas eu nunca testei).  
O Prolog deve ser utilizado somente para representar o conhecimento do  
agente, a interface visual e demais controles devem ser implementados em  
C/C++.  
Não é permitido realizar nenhum processo de tomada de decisão em C/C++, a  
decisão de quais ações o agente vai realizar deve ser feita exclusivamente pelo  
Prolog.  
Deve existir uma maneira de visualizar os movimentos do agente, mesmo que a  
interface seja bem simples. Podendo até mesmo ser uma matriz desenhada e  
atualizada no console.  
O programa deve exibir um log das consultas e inserções realizadas na base de  
conhecimento Prolog.  
O programa também deve exibir a pontuação do agente enquanto ele executa as  
ações. Assim como a pontuação final.  
Bônus:  
O trabalho que apresentar o agente com a melhor pontuação final em uma  
determinada cidade receberá 2 pontos extras na nota. Podendo tirar até 12 no  
trabalho. Em caso de empate ambos receberam a nota extra.  
Para isso é necessário que o trabalho tenha algum método para adicionar  
manualmente as posições dos grupos de zumbis, hospitais e delegacias.  
Programa Base (Projeto do Visual Studio 2010):  
O programa base fornecido é um exemplo de como realizar consultas ao Prolog a partir  
de um programa feito em C++. O exemplo pode ser acessado no seguinte link:  
https://edirlei.com/aulas/ia_2012_1/Trabalho2ProgramaBase.zip  
Forma de Avaliação:  
Será avaliado se o trabalho atendeu a todos os requisitos especificados anteriormente. O  
trabalho que atender a todos os requisitos receberá nota 10.  
Data de Entrega:  
7/05  
0
Forma de Entrega:  
O programa deve ser apresentado na aula do dia 07/05 (segunda) e enviando até o dia  
0
7/05 para o email edirlei.slima@gmail.com.