UNIVERSIDADE REGIONAL DO NOROESTE DO ESTADO DO RIO GRANDE DO SUL DEPARTAMENTO DE CIÊNCIAS EXATAS E ENGENHARIAS CIÊNCIA DA COMPUTAÇÃO JANIEL CERETTA FOLETTO PROGRAMAÇÃO GENÉTICA RECORRENTE APLICADA AO PROBLEMA PRESA-PREDADOR Ijuí 2015 JANIEL CERETTA FOLETTO PROGRAMAÇÃO GENÉTICA RECORRENTE APLICADA AO PROBLEMA PRESA-PREDADOR Trabalho apresentado ao curso de Ciência da Computação da Universidade Regional do Noroeste do Estado do Rio Grande do Sul , como requisito para a obtenção do título de Bacharel em Ciência da Computação. Orientador: Edson Luiz Padoin Ijuí 2015 JANIEL CERETTA FOLETTO PROGRAMAÇÃO GENÉTICA RECORRENTE APLICADA AO PROBLEMA PRESA-PREDADOR Trabalho apresentado ao curso de Ciência da Computação da Universidade Regional do Noroeste do Estado do Rio Grande do Sul , como requisito para a obtenção do título de Bacharel em Ciência da Computação. Trabalho aprovado. Ijuí, 14 de dezembro de 2015: Edson Luiz Padoin Orientador Romário Lopes Alcântara Banca Ijuí 2015 Dedico este trabalho aos meus pais Gilberto Foletto e Gerlise Foletto, que sempre me apoiaram em toda a caminhada durante a realização do Trabalho de Conclusão de Curso, bem como para superar todas as dificuldades durante a graduação. AGRADECIMENTOS Agradeço primeiramente Deus, que nos dá a vida e a saúde para que consigamos desenvolver a determinação e o foco para alcançar os objetivos. Agradeço também aos meus pais, Gilberto Foletto e Gerlise Foletto que sempre me deram força e coragem para superar as dificuldades e superar cada etapa. Também agradeço ao professor Rogério Martins que me apresentou a ideia para realizar este projeto. Também agradeço ao professor Edson Padoin que foi meu orientador durante o desenvolvimento do projeto, trazendo muitos benefícios devido as trocas de ideias e as correções que aumentaram a credibilidade do projeto. Por fim, agradeço a todos os meus colegas que estiveram comigo no processo de desenvolvimento desse projeto. Tanto por me auxiliar em dúvidas técnicas, como também me proporcionar motivação para que conseguisse finalizá-lo. "Sentir é criar. Sentir é pensar sem ideias, e por isso sentir é compreender, visto que o Universo não tem ideias" (Fernando Pessoa) RESUMO A programação genética possui um papel muito importante quando necessita-se resolver problemas com campo de possibilidades muito grandes. Mesmo que a solução não seja ótima, o tempo para a solução, comparado com uma técnica de força bruta, é um dos fatores que tornam a sua utilização interessante. Como utiliza-se informações de campo global e não apenas local, as soluções encontradas podem ser as mais diversas possíveis, até podendo encontrar respostas que um ser humano dificilmente obteria. O presente trabalho realiza a modelagem e a implementação da técnica de programação genética recorrente, para a partir da evolução do agente realizar testes dentro do ambiente denominado presa-predador. Após os testes serão apresentados os resultados, buscando analisar a eficácia da técnica de programação genética recorrente. Palavras-chaves: Inteligência Artificial, Programação Genética Recorrente, PresaPredador. ABSTRACT Genetic programming has a very important part when you need to resolve issues with field of very great possibilities. Even if the solution is not great, the time for the solution, compared to a brute-force technique, is one of the factors that make your interesting use. As is used global field of information and not only local, the solutions found can be the most diverse possible until being able to find answers that a human being hardly would get. The present work makes the modeling and implementation of recurrent genetic programming technique for from the evolution of the agent conduct tests into the environment called predator-prey. After testing the results will be presented, trying to analyze the effectiveness of recurring genetic programming technique. Keywords: Artificial Intelligence, Genetic Programming Recurring, Prey-Predator LISTA DE ILUSTRAÇÕES Figura 1 – Representação de Uma Expressão Matemática Utilizando Árvore Sintática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Figura 2 – Estrutura Básica do Algoritmo de Programação Genética . . . . . . Figura 3 – Representação da Seleção Através do Método da Roleta Viciada . . Figura 4 – Exemplo de uma Representação onde o PBIL é Combinado à Programação Genética . . . . . . . . . . . . . . . . . . . . . . . . . . . Figura 5 – Cenário do Problema Presa-Predador . . . . . . . . . . . . . . . . . Figura 6 – Ações Possíveis para a Presa e para o Predador . . . . . . . . . . . Figura 7 – Tela para Realizar a Evolução do Predador . . . . . . . . . . . . . . Figura 8 – Tela para Realizar os Testes da Evolução do Predador . . . . . . . . Figura 9 – Comparativo da Evolução das Percepções Absoluta, Relativa e Relativa com Memória com População de 100 Indivíduos . . . . . . . . . Figura 10 – Comparativo da Evolução das Percepções Absoluta, Relativa e Relativa com Memória com População de 200 Indivíduos . . . . . . . . . 16 18 20 30 33 35 38 39 46 48 LISTA DE TABELAS Tabela 1 – Percepção Absoluta com 100 Indivíduos . . . . . . . . . . . . . . . . Tabela 2 – Percepção Relativa com 100 Indivíduos . . . . . . . . . . . . . . . . Tabela 3 – Percepção Relativa Utilizando Variáveis de Memória com 100 Indivíduos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tabela 4 – Percepção Absoluta com 200 Indivíduos . . . . . . . . . . . . . . . . Tabela 5 – Percepção Relativa com 200 Indivíduos . . . . . . . . . . . . . . . . Tabela 6 – Percepção Relativa Utilizando Variáveis de Memória com 200 Indivíduos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 43 43 44 45 45 LISTA DE ABREVIATURAS E SIGLAS AG Algoritmo Genético ERC Ephemeral Random Constants IDE Integrated Development Environment PBIL Population-Based Incremental Learning PG Programação Genética SUMÁRIO 1 INTRODUÇÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2 2.1 2.1.1 2.1.2 2.1.3 2.1.4 2.2 2.2.1 2.2.2 15 15 19 19 21 22 22 23 23 2.4.4 ESTADO DA ARTE . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programação Genética . . . . . . . . . . . . . . . . . . . . . . . . . Avaliação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Seleção . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Módulo de População . . . . . . . . . . . . . . . . . . . . . . . . . . . Agentes Inteligentes . . . . . . . . . . . . . . . . . . . . . . . . . . Ambientes Parcialmente Observáveis . . . . . . . . . . . . . . . . . . Agentes Inteligentes Reativos com Estado Interno . . . . . . . . . . . Agentes Reativos Simples . . . . . . . . . . . . . . . . . . . . . . . . . . . Agentes Baseados em Modelos . . . . . . . . . . . . . . . . . . . . . . . . Agentes Baseados em Objetivos . . . . . . . . . . . . . . . . . . . . . . . . Agentes Baseados em Utilidades . . . . . . . . . . . . . . . . . . . . . . . Sistemas Dinâmicos . . . . . . . . . . . . . . . . . . . . . . . . . . . Trabalhos Relacionados . . . . . . . . . . . . . . . . . . . . . . . . Programação Genética Aplicada ao Problema Presa-Predador . . . . Implementação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aplicação de Redes Neurais Recorrentes em Ambientes Parcialmente Observáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Implementação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Híbrido de Programação Genética com Variante de PBIL . . . . . . . Implementação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comparação Entre os Trabalhos Apresentados e o Projeto Proposto 3 3.1 3.2 3.2.1 3.2.2 3.2.3 MODELAGEM E IMPLEMENTAÇÃO Problema Presa-Predador . . . . . Ambiente de Simulação . . . . . . . Mapa . . . . . . . . . . . . . . . . . . Coordenada . . . . . . . . . . . . . . Ação . . . . . . . . . . . . . . . . . . 2.2.2.1 2.2.2.2 2.2.2.3 2.2.2.4 2.3 2.4 2.4.1 2.4.1.1 2.4.1.2 2.4.2 2.4.2.1 2.4.2.2 2.4.3 2.4.3.1 2.4.3.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 24 24 24 25 25 25 25 26 27 28 28 29 29 30 30 32 32 33 34 34 34 3.2.4 3.2.5 3.2.6 . . . . . . . . . 34 35 35 41 4.3 4.4 RESULTADOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resultados da Evolução do Predador com População de 100 Indivíduos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Predador com Percepção Absoluta do Ambiente . . . . . . . . . . . . Predador com Percepção Relativa do Ambiente . . . . . . . . . . . . Predador com Percepção Relativa do Ambiente Utilizando Variáveis de Memória . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resultados da Evolução do Predador com População de 200 Indivíduos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Predador com Percepção Absoluta do Ambiente . . . . . . . . . . . . Predador com Percepção Relativa do Ambiente . . . . . . . . . . . . Predador com Percepção Relativa do Ambiente com Variáveis de Memória . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Análise dos Resultados Obtidos . . . . . . . . . . . . . . . . . . . Considerações Sobre os Resultados . . . . . . . . . . . . . . . . . 5 5.1 CONCLUSÕES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Trabalhos Futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 50 Referências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 3.2.6.1 3.2.6.2 3.2.6.3 3.2.6.4 3.2.7 3.3 4 4.1 4.1.1 4.1.2 4.1.3 4.2 4.2.1 4.2.2 4.2.3 Personagem . . . . . . Arbusto . . . . . . . . . Presa . . . . . . . . . . Classe PresaArbusto . . . Classe PresaFoge . . . . Classe PresaParada . . . Classe PresaRandom . . . Predador . . . . . . . . Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 36 36 36 36 37 42 42 43 43 44 44 44 45 46 47 1 INTRODUÇÃO A programação genética é uma técnica pertencente ao grupo dos algoritmos evolucionários, e é uma evolução dos algoritmos genéticos. Ela consiste em aplicar a teoria da evolução das espécies de Darwin (1959). A programação genética realiza a busca de soluções para problemas através de etapas, onde são aplicados os operadores genéticos à uma determinada população. Essas etapas são repetidas até que seja encontrada uma solução próxima a ótima. A implementação de um agente reativo simples utilizando programação genética é muito eficiente quando este agente está inserido em um ambiente completamente observável. Porém, quando se trata de um ambiente parcialmente observável, este agente seria falho, porque não conseguiria resolver parte dos problemas desse ambiente. Para o caso citado, o agente deve possuir um estado interno, ou seja, além das percepções atuais do ambiente, ele também possuiria um histórico das ações efetuadas anteriormente. Com isso, quando as percepções do estado atual do ambiente não forem suficientes para resolver o problema, o agente utilizaria os dados das percepções anteriores. A implementação do agente inteligente utilizando programação genética possui uma vantagem muito interessante. A estrutura do agente pode ser adaptada a muitos problemas com alta complexidade. Isso é proveniente da simplicidade que essa técnica possui. Este trabalho tem o objetivo de aplicar a técnica de programação genética recorrente para solucionar problemas em ambientes parcialmente observáveis. O qual será representado pelo ambiente do problema presa-predador. O presente trabalho irá apresentar a modelagem e implementação de um agente inteligente utilizando programação genética recorrente. Esse trabalho será desenvolvido para atender as especificações do problema presa-predador. Este será encarregado de encontrar as soluções próximas as ótimas, para realizar a captura da presa. Conforme Friske (2013, p. 15), o problema presa-predador é um ambiente de simulação muito utilizado em inteligência artificial, pois é capaz de testar a qualidade dos agentes inteligentes criados. Sendo que quanto mais rápido é realizada a captura da presa, mas eficiente é o agente implementado no predador. 14 O trabalho está organizado em 5 capítulos. Inicialmente, no Capítulo 2 será apresentado o estado da arte, trazendo conceitos envolvendo inteligencia artificial, principalmente no que diz respeito à programação genética, ambientes parcialmente observáveis, agentes inteligentes e os trabalhos que estão relacionados ao presente trabalho. No Capítulo 3 será apresento a modelagem e a implementação do ambiente e dos personagens do problema presa-predador. Neste capítulo serão descritas as etapas do desenvolvimento da aplicação. Posteriormente no Capítulo 4 serão apresentados os resultados obtidos, bem como uma análise do desempenho da técnica de programação genética recorrente. Por fim, no Capítulo 5 serão apresentadas as considerações finais acerca dos resultados obtidos, bem como a sugestão para trabalhos futuros. 2 ESTADO DA ARTE Quando encontramos cenários pequenos, onde temos a percepção de todas as ações possíveis, ao aplicar um algoritmo que irá analisar todas as situações possíveis, obtém-se um resultado ótimo. Porém nesses algoritmos, junto com o aumento das possibilidades, há também o aumento do tempo do processamento e também do espaço utilizado. Sendo que muitas vezes não contamos com esse tempo. Uma das solução para este problema, pode ser por exemplo a busca de uma rota dentro de um mapa. Calcular todas as rotas possíveis tentando buscar a melhor não seria algo viável. Dependendo do mapa, o algoritmo ficaria nessa busca por anos. Com isso, busca-se outra solução para esses problemas. Para eles então podem ser aplicadas heurísticas, que são métodos que buscam soluções para problemas complexos de forma simplificada (FRISKE, 2013, p. 17). Com elas obtêm-se respostas próximas a ótima, não necessariamente sendo a melhor solução. Porém o tempo para encontrar a solução é muito menor do que o utilizado por um método de força bruta, tornando sua solução viável. Ao implementar soluções para problemas, busca-se sempre otimizar este processo. Para Martínez (1998, p. 01) a otimização consiste em encontrar os mínimos ou máximos de uma função de várias variáveis, com valores dentro de uma determinada região do espaço multidimensional. Nada mais é do que diminuir os fatores como tempo, espaço e processamento, para obter melhores resultados. As heurísticas são constituídas de regras assentadas na experiência e planejamento. Elas utilizam estratégias e métodos de aproximação sempre com o intuito de chegar ao fim com a melhor solução possível. Segundo (FRISKE, 2013 apud BECCENERI, 2013), as heurísticas buscam assemelhar-se com a forma em que o ser humano raciocina, garantindo assim soluções rápidas e cabíveis, o que torna as heurísticas muito eficientes. 2.1 Programação Genética Os algoritmos evolucionários são métodos de otimização baseados nos mecanismos de evolução das espécies. Os mais conhecidos são os algoritmos genéticos e a programação genética. Conforme Pacheco (1999, p. 01) os AG são algoritmos probabilísticos que fornecem um mecanismo de busca paralela e adaptativa baseado no princípio de sobrevivência dos mais aptos e na reprodução. Assim, os mais aptos 16 compõem as próximas populações, através de processos de seleção, recombinação e mutação. Os algoritmos genéticos são uma técnica de busca extremamente eficiente no seu objetivo de varrer o espaço de soluções e encontrar soluções próximas da solução ótima, quase sem necessitar interferência humana. Uma das características positivas dos AG é o fato do seu algoritmo utilizar informações globais e não apenas locais (LINDEN, 2011, p. 05). O AG cria uma população de respostas possíveis para um determinado problema, após isso, ele submete essa população aos processos de evolução. Esse processo é formado basicamente pela avaliação, que calcula a aptidão de cada indivíduo da população. Outro processo é a evolução, no qual os indivíduos da população serão selecionados, levando em consideração os valores obtidos na avaliação. Após selecionar os indivíduos eles são submetidos ao processo de cruzamento, no qual eles são recombinados e com isso geram novos indivíduos (RODRIGUES, 2002, p. 22). Os indivíduos são compostos por uma árvore sintática que possui a representação do programa para a possível solução do problema. Essa árvore possui um nó raiz e dele derivam os nós filhos. Estes nós filhos possuem outros nós filhos e assim segue até chegar aos nós folhas, que são os últimos nós de cada ramificação da árvore (RODRIGUES, 2002, p. 08). Na Figura 1 é apresentado um exemplo de árvore sintática. Ela está representando uma expressão matemática. Nela pode ser visualizado o nó raiz, os nós intermediários e os nós folhas que foram citados anteriormente. Figura 1 – Representação de Uma Expressão Matemática Utilizando Árvore Sintática Fonte: Friske (2013, p. 22) A população é um conjunto de indivíduos. Para ser uma boa população, ela deve possuir a diversidade entre os indivíduos. A primeira geração (primeiros indivíduos gerados) devem ser simples. Eles são gerados aleatoriamente, para que a solução não fique presa a uma fração do espaço. A aleatoriedade faz com que haja uma 17 melhor distribuição da solução pelo espaço. Com essa simplicidade a evolução irá ser direcionada para a melhor solução (SOUZA, 2006, p. 27). Depois da recombinação os indivíduos passam pela mutação, que altera as características dos indivíduos para adicionar variedade à população. Por fim, a população é atualizada, ou seja, os novos indivíduos gerados são inseridos a nova população. Após isso ocorre o processo de finalização, onde é avaliado se os objetivos foram atingidos. Caso foram atingidos a execução é encerrada, caso contrário a população retorna para um novo processo de avaliação. A PG é um aprimoramento do algoritmo genético. A principal diferença nos processos de cada um deles é o fato de que nos AG ocorre a evolução de cromossomos simples. Estes são representados por números binários, já na PG ocorre a evolução de funções. A programação genética é uma técnica em que os indivíduos são programas computacionais (SOUZA, 2006, p. 27). Sendo que a sobrevivência se dá com um percentual maior dos indivíduos mais aptos e as características são passadas de geração em geração. Conforme Rodrigues (2002, p. 01) o paradigma da programação genética foi desenvolvido por John Koza. Ele desenvolveu programas baseados em AG, e chamou sua técnica de programação genética. Inicialmente foi utilizado LISP para desenvolver os programas, devido ao fato de que nessa linguagem pode ser utilizado a estrutura de árvore, a qual é utilizada na PG. O mesmo autor fala que, A técnica se baseia na combinação de ideias da teoria da evolução (seleção natural), genética (reprodução, cruzamento e mutação), inteligência artificial (busca heurística) e teoria de compiladores (representação de programas como árvores sintáticas) (RODRIGUES, 2002, p. 08). E cita que, A programação genética é um algoritmo que busca, dentre um espaço relativamente grande porém restrito de programas de computador, uma solução ou, pelo menos, uma boa aproximação para resolver determinado problema (RODRIGUES, 2002 apud BRUCE, 1995). A programação genética é uma técnica muito interessante porque o seu desempenho pode superar o resultado obtido por uma pessoa. Isso pode ocorrer devido ao fato de não se prender a paradigmas existentes. A variação nas suas respostas é muito grande, podendo encontrar soluções para problemas que uma pessoa dificilmente encontraria. 18 Figura 2 – Estrutura Básica do Algoritmo de Programação Genética Fonte: Rodrigues (2002, p. 11) A Figura 2 mostra que o algoritmo genético inicia com a criação da população inicial e passa pelos critérios de avaliação, seleção e evolução. Na avaliação os indivíduos recebem o fitness e então é analisado se a condição de parada já foi atingida. Já na seleção, são escolhidos alguns indivíduos dentro da população e por fim são aplicados os operadores para evoluir o indivíduo. O algoritmo é repetido até o momento em que o critério de término for atingido, e então é retornado a melhor solução encontrada. O algoritmo da PG segue basicamente a mesma ideia do algoritmo genético. Inicialmente é criada uma população de forma aleatória, isso porque ela deve possuir a maior diversidade possível. Depois disso a população é analisada para verificar o quão próximo da solução ela se encontra. Após isso cada indivíduo da população é avaliado, aos mais aptos são aplicados os operadores genéticos, sendo eles a reprodução, mutação e cruzamento. Os indivíduos resultantes formam a próxima população. Essas 19 etapas são repetidas até o momento em que a aptidão dos indivíduos satisfizerem a condição de parada. Ou seja, são aptos para resolverem o problema. 2.1.1 Avaliação A função fitness, realiza a avaliação dos indivíduos da população para resolver um determinado problema. Ela pode retornar o maior valor para a melhor avaliação ou o menor valor para a melhor avaliação. Essa função deve estar bem definida pois ela é muito importante para que o algoritmo chegue a uma boa solução. Para isso ela deve possuir o máximo possível de conhecimento sobre o problema, pois dessa forma ela avaliará com maior exatidão os indivíduos mais aptos a resolver o problema (GALASTRI, 2003, p. 20). 2.1.2 Seleção Independente da avaliação que cada indivíduo obteve, sendo ela alta ou baixa, nenhum deles será desprezado. A diferença é que os mais aptos terão maior chance de se reproduzirem, da mesma forma do que foi descrito por Darwin (1959) em sua teoria (SOUZA, 2006, p. 27). Se houvesse a retirada dos indivíduos menos aptos, a população tenderia a ter indivíduos cada vez mais semelhantes. Isso restringiria a diversidade da população, caracterizando com isso a convergência genética. Assim a população ficaria presa a um espaço restrito de soluções, tendo então uma busca local e não a global. Dessa forma uma técnica comum de busca seria capaz de resolver o problema (GALASTRI, 2003, p. 22). Dos métodos de seleção natural pode-se citar a roleta viciada, o método de classificação ou ranking e o método de torneio. Os quais serão descritos na sequência. O método da roleta viciada funciona da seguinte forma: primeiramente os indivíduos são evoluídos e avaliados. A partir dos dados obtidos na avaliação, é criada uma roleta virtual. Ela é dividida entre os indivíduos da população de forma proporcional a aptidão obtida. Sendo assim, o indivíduo que possuir o melhor resultado terá a maior fatia da roleta, e o que possuir a menor aptidão possuirá a menor fatia. Na Figura 3 está representada essa divisão, ela mostra o percentual que cada indivíduo recebe, proporcionalmente ao valor do fitness. Na sequência é iniciado o processo de seleção, que é executado rodando a roleta. A fatia, correspondente a cada indivíduo, em que a roleta parar será selecionado. Com isso os indivíduos que possuem melhor avaliação tem as maiores chances de 20 Figura 3 – Representação da Seleção Através do Método da Roleta Viciada Fonte: Galastri (2003, p. 23) serem selecionados. O que não impede os indivíduos pior classificados de serem selecionados. O maior problema da roleta viciada é o fato de que quando a avaliação possui grande disparidade, esses indivíduos muito bem classificados terão uma chance muito grande de serem selecionados, levando a solução a ficar presa a apenas uma fração do espaço e não uma solução global (FRISKE, 2013, p. 23). Já o método de classificação ou ranking, classifica a população a partir do seu fitness e após atribui um valor de adequação. Por exemplo, o indivíduo menos apto recebe classificação 1, o segundo menos avaliado recebe 2 e assim por diante. Com isso as chances dos indivíduos piores avaliados estão mais próximas aos indivíduos melhores avaliados, tornando as chances de seleção de indivíduos menos aptos maior (FRISKE, 2013, p. 23). 21 Assim o problema que existia na roleta viciada é solucionado, porque não haverá diferenças gritantes entre cada avaliação. Porém com isso o aproveitamento dos indivíduos com fitness mais alto é menor. Dessa forma os indivíduos selecionados não necessariamente serão os melhores, podendo sua maioria possuir classificação baixa. O método de torneio utiliza a disputa direta entre os indivíduos. Essa disputa recebe um valor k, que representa o número de participantes. Os participantes de cada rodada são sorteados aleatoriamente. Ganha a “batalha” o indivíduo que possuir o maior fitness. O valor de k deve ser maior do que 2, isso para que haja disputa, mas também não deve ser muito alto, pois isso faria com que ele ficasse semelhante ao método da roleta viciada. Com esse método, os indivíduos melhores avaliados, sempre que entrarem em uma disputa vencerão. O seja, a cada disputa o melhor indivíduo será selecionado, com isso o método fica mais eficaz. Porque com essa abordagem, o método favorece tando os indivíduos melhores avaliados, quanto os de menor avaliação, diminuindo assim o risco de uma convergência genética. 2.1.3 Operadores Depois que os indivíduos são avaliados e selecionados, eles passam pelos operadores genéticos, sendo eles a mutação e o crossover, os quais serão descritos na sequência. Para manter uma variabilidade genética dentro da população, utiliza-se o método de mutação. Este nada mais é do que atribuir aos indivíduos características extras das recebidas dos pais e antecessores. Com isso os indivíduos podem possuir características que não existem em seus antecessores. Esse processo busca simular a mutação genética dos indivíduos. São alterados alguns nós da árvore de expressões. Essas alterações ocorrem de forma aleatória, a mutação não deve ser aplicada a todos os indivíduos, assim como ocorre na vida real, onde não ocorre com ampla frequência. Com isso a probabilidade de cada indivíduo passar pela mutação deve ser pequena, até mesmo para não perder a essência da programação genética. Mesmo com a mutação, os indivíduos devem manter predominantemente as características dos seus antecessores. Assim a população irá possuir variabilidade sem perder as suas características básicas. Se a mutação fosse frequente, a população seria construída com uma aleatoriedade muito grande, diminuindo a precisão na resolução de determinado problema. 22 Já no operador crossover ocorre a troca das informações entre os indivíduos, gerando com isso dois novos indivíduos. Isso faz com que os novos indivíduos gerados possuam as características semelhantes aos “pais” e seus antecessores. Esse processo busca simular a reprodução sexuada natural entre os indivíduos . Os indivíduos da população são formados por árvores sintáticas, o crossover seleciona de forma aleatória um nó de cada um dos indivíduos e faz um corte no mesmo, gerando assim uma subárvore. Estas são fundidas umas as outras pelo ponto de corte de cada uma. Assim ocorre uma troca de informações uniforme entre os indivíduos. 2.1.4 Módulo de População Para manter a simplicidade da população, esta não deve ter o aumento no número de indivíduos. Com isso os processos descritos anteriormente serão aplicados a população até o momento em que o número de indivíduos gerados atingirem o tamanho da população. Após isso a população atual é substituída pela nova população. Outros métodos também são utilizados para a criação da nova população, sendo eles o método Steady State, o Elitismo e também o de Populações de Tamanhos Diferentes. No caso do método Steady State a população antiga não é totalmente descartada, novos indivíduos são criados aos poucos e os piores pais são descartados (FRISKE, 2013, p. 27). No método de Elitismo os melhores indivíduos são mantidos para a próxima geração. Isso acaba fazendo com que haja a garantia que os indivíduos mais aptos não se percam. Já no método de Populações de Tamanhos Diferentes o indivíduo apenas é descartado quando atinge seu tempo limite de vida, ou seja mesmo que ele possua avaliação ruim, só sairia da população quando ficasse “velho” (FRISKE, 2013, p. 27). 2.2 Agentes Inteligentes Segundo Russel e Norvig (2004, p. 33) um agente é tudo o que pode ser considerado capaz de perceber seu ambiente por meio de sensores e de agir sobre esse meio por intermédio de atuadores. Ou seja, o agente a partir das percepções obtidas do ambiente, realiza ações sobre esse meio. O comportamento do agente é dado pela função de agente. Conforme Russel e Norvig (2004, p. 34) ela mapeia qualquer sequência de percepções específica para uma ação. Esta função de agente será implementada em um agente artificial por um 23 programa de agente. Para Russel e Norvig (2004, p. 34) a função de agente é uma descrição matemática abstrata; o programa de agente é uma implementação concreta, relacionada à arquitetura do agente. 2.2.1 Ambientes Parcialmente Observáveis Conforme Russel e Norvig (2004, p. 41) um ambiente de tarefa é de fato completamente observável se os sensores destacam todos os aspectos que são relevantes para a escolha da ação. Em outras palavras, o agente possui conhecimento sobre todo o ambiente ou mundo em que está inserido. Russel e Norvig (2004, p. 41) dizem ainda que ambientes completamente observáveis são convenientes porque o agente não precisa manter qualquer estado interno para controlar o mundo. Isso decorre do fato de o agente possuir conhecimento total sobre o ambiente. Quando o agente não possui conhecimento completo sobre o ambiente, este é parcialmente observável. Segundo Russel e Norvig (2004, p. 41) um ambiente poderia ser parcialmente observável devido ao ruído e a sensores imprecisos ou porque partes do estado estão simplesmente ausentes nos dados do sensor. Com isso, ao contrário dos ambientes completamente observáveis, o agente necessita de estado interno para controlar o mundo. 2.2.2 Agentes Inteligentes Reativos com Estado Interno Os programas de agente implementam a função de agente. Eles podem ser divididos em quatro tipos. Sendo eles agentes reativos simples, agentes reativos baseados em modelo, agentes baseados em objetivos e agentes baseados em utilidades (RUSSEL; NORVIG, 2004, p. 54). Estes agentes serão descritos com maior profundidade nos itens que seguem. 2.2.2.1 Agentes Reativos Simples Para um ambiente completamente observável, a implementação de um agente reativo simples consegue resolver os problemas desse meio. Ele é o tipo mais simples de agente. O histórico das percepções é ignorado, ele apenas leva em conta a percepção atual. Com isso, a sua inteligência é limitada, só podendo ser aplicado em determinados ambientes, sendo estes simples. 24 2.2.2.2 Agentes Baseados em Modelos Os agentes reativos baseados em modelos partem do pressuposto de conseguir reagir dentro de um ambiente em que não possui conhecimento total. Este tipo deve manter estado interno. Com isso, o agente consegue obter os aspectos que não podem ser observados. Nesse tipo de agente é importante a atualização das informações internas, sendo necessário que dois tipos de conhecimento sejam implementados ao agente. Conforme Russel e Norvig (2004, p. 48), inicialmente é necessário que sejam guardadas informações sobre o modo que o mundo evolui independente do agente. Ou seja, o que está sendo modificado no mundo. Os mesmos autores citam que precisa-se também de algumas informações sobre como as ações do próprio agente afetam o mundo (RUSSEL; NORVIG, 2004, p. 48). 2.2.2.3 Agentes Baseados em Objetivos Os agentes baseados em objetivos, além de possuírem a informação sobre o estado atual do ambiente, também contém informações sobre os objetivos, que são as descrições das situações desejáveis. Segundo Russel e Norvig (2004, p. 49), O programa do agente pode combinar isso com informações sobre os resultados de ações possíveis (as mesmas informações que foram usadas para atualizar o estado interno no agente reativo), a fim de escolher ações que busquem o objetivo. Esse agente tem a característica de ser flexível, o fato de ter a base em objetivos, faz com que a representação deste seja dada de forma explícita. Com isso, quando essa informação precisar ser modificada, todos os comportamentos relevantes seriam alterados. O que não ocorre com agentes reativos, em que teriam que ser modificadas muitas regras. 2.2.2.4 Agentes Baseados em Utilidades Os agentes baseados em utilidades, basicamente verificam qual ação terá maior utilidade. Para as ações é associado um grau de felicidade. Conforme Russel e Norvig (2004, p. 50), uma especificação completa da função de utilidade permite decisões racionais em dois tipos de casos que os objetivos são inadequados. Esses casos seriam, quando existem objetivos contraditórios e quando existem vários objetivos 25 que se deseja alcançar e nenhum deles pode ser atingido (RUSSEL; NORVIG, 2004, p. 50). 2.3 Sistemas Dinâmicos Sistemas dinâmicos são basicamente processos que mudam no tempo e no espaço. Esses sistemas possuem um comportamento imprevisível, sendo que podem modificar-se de forma quase que aleatória no tempo ou no espaço. Sendo assim, a modelagem desses ambientes tem sua aplicação muito interessante em simulação e otimização. Conforme Medeiros (2006, p. 47), o modelo matemático é a forma convencional para estudar um sistema físico e consiste em uma representação matemática deste sistema. Segundo o mesmo autor, ela é normalmente representada através de um conjunto de equações diferenciais. A partir de um modelo matemático é possível construir as etapas da resolução do sistema dinâmico (MEDEIROS, 2006, p. 47). 2.4 Trabalhos Relacionados Nesta seção serão apresentados os trabalhos relacionados à inteligência artificial e a programação genética. Inicialmente será apresentado um trabalho referente à programação genética aplicada ao mesmo problema do presente trabalho, com a variação do agente não possuir memória. 2.4.1 Programação Genética Aplicada ao Problema Presa-Predador Este é um Trabalho de Conclusão de Curso desenvolvido por Friske (2013). Ele apresenta a construção de agentes inteligentes utilizando a programação genética. O agente foi evoluído para ser utilizado no problema presa-predador, buscando soluções próximas às ótimas. No caso desse problema as melhores soluções envolvem a captura da presa. 2.4.1.1 Implementação O ambiente de simulação que aplica o problema presa-predador possui os subgrupos Ambiente e Simulação. O ambiente define as características do plano onde a presa e os predadores irão atuar. A simulação é a responsável por realizar a interação entre os personagens dentro do plano. 26 O ambiente possui quatro predadores, eles são programados através da evolução realizada pela programação genética. Os predadores recebem por parâmetro uma árvore de expressões gerada pela programação genética. Todos os predadores recebem a mesma inteligência, ou seja todos os predadores possuem um mesmo nível de evolução. A simulação é composta por rodadas, a cada rodada todos os personagem são processados e recebem novas posições, ou também se mantém na mesma posição. Antes do início da simulação deve ser informado o número de rodadas. Com isso os predadores possuem determinado limite de rodadas para capturar a presa. Em cada simulação, caso os predadores capturem a presa, ela é encerrada e retorna que a presa foi capturada. Dessa forma os predadores alcançaram seu objetivo. Caso o número de rodadas seja finalizado ou os predadores fiquem parados, é retornado que a presa não foi capturada. Nesse caso os predadores não alcançaram seu objetivo. A Evolução é iniciada com a criação de n indivíduos. A população inicial é composta por indivíduos simples, sendo que foram gerados de forma aleatória. O indivíduo é criado utilizando a expressão inicial CASE. Esta condição contém apenas uma condição e uma alternativa. 2.4.1.2 Resultados Para a realização dos testes foi utilizando um notebook com processador Intel Core i7 (2, 20 GHz) e 8GB de memória). A evolução demorou aproximadamente 24 horas. Para o teste foram utilizadas 500 rodadas de simulação, o tamanho do mapa era 10 x 10, o máximo de gerações foi de 10000, o tamanho da população de 100 indivíduos e a taxa de mutação em 0, 5% (FRISKE, 2013, p. 51). Na primeira simulação o tipo de presa estática obteve resultados de captura inferiores. Para Friske (2013, p. 52), isso ocorre devido ao fato de que quando a presa é definida como estática. Em determinado momento da simulação, os predadores serão orientados a não moverem-se ou realizar movimentos inúteis em looping. Conforme Friske (2013, p. 53), ao existir uma presa aleatória ou dotada de inteligência, o movimento da mesma proporcionará mais possibilidades de movimentos dos predadores, facilitando a captura. O próximo resultado a ser analisado tem por base a utilização de um mundo com percepção relativa, nesse caso os predadores não tinham a localização total da presa. Nessa simulação, a presa estática possuiu taxa de captura menor, assim como no resultado com posição absoluta do mundo. No tipo de presa aleatória foi onde a 27 taxa de captura foi menor que no ambiente anterior, de acordo com Friske (2013, p. 53), isso ocorre porque o valor final do fitness nessa avaliação apresentou-se maior. O próximo resultado foi obtido com base em um mundo toroidal com a percepção de posição absoluta da presa. Os testes também foram realizados para os três tipos de presa. Diferentemente dos resultados anteriores, nesse caso a presa estática foi quem teve maior taxa de captura. Para Friske (2013, p. 55) tal situação ocorre porque no mundo toroidal os predadores nunca encontrarão um obstáculo (limite do mundo) para a captura da presa. Essa característica pesou mais sobre a qualidade do programa gerado. A última análise a ser realizada é sobre um mundo toroidal com a percepção relativa da presa. Nessa simulação houve grande taxa de captura nas presas estática e aleatória. Para Friske (2013, p. 56, 57) a taxa de captura para todos os tipos de presa é superior ao cenário anterior, sendo que, a captura é feita facilmente com um número de rodadas inferior a 250. O motivo para a posição relativa ser mais eficiente conforme Friske (2013, p. 56, 57), é o fato de haver uma troca abrupta de posições dos personagens, tanto da presa quanto dos predadores (caso do cenário anterior), facilitando as buscas por resultados próximos ao ótimo. Friske (2013, p. 57) conclui que a presa aleatória é a mais fácil de ser capturada. Ele ainda fala que o mundo toroidal possibilita uma diversidade maior de movimentos dos predadores, facilitando a captura da presa. Para o autor, a percepção de posição relativa à presa auxilia na convergência mais eficiente na busca pela solução. Por fim Friske (2013, p. 57) cita que na programação genética, a convergência do valor do fitness tende a ser muito eficiente, apresentando sua maior variação entre a primeira e a milésima geração. 2.4.2 Aplicação de Redes Neurais Recorrentes em Ambientes Parcialmente Observáveis Este trabalho foi desenvolvido por Eldair Fabrício Dornelles, Henrique Augusto Richter e Márcia Da Silva, todos alunos do Curso de Graduação em Ciência da Computação da UNIJUÍ. Também participaram do trabalho os professores orientadores Rogério Samuel, Sandro Sawicki e Edson Luiz Padoin. Este projeto tem como objetivo a modelagem e a implementação de um agente inteligente para atuar em um ambiente parcialmente observável e analisar o desempenho da estrutura computacional especificada para o mesmo (DORNELLES et al., 2014, 28 p. 03). O agente inteligente foi estruturado utilizado redes neurais recorrentes, e utilizou o algoritmo genéticos para fornecer os pesos sinápticos da rede neural. 2.4.2.1 Implementação Com base na metodologia e implementação, será descrito o ambiente e a estrutura do agente inteligente. O ambiente de tarefa utilizado para modelagem do agente foi o jogo Mundo de Wumpus. O jogo consiste em uma caverna que possui salas conectadas por passagens, e nessas existe um monstro (Wumpus) que emite “fedor”. Apenas a sala onde está posicionado o agente não está conectada. Cada sala possui 20% de chances de conter um poço, os quais emitem brisa às salas adjacentes e em uma das salas tem ouro que emite brilho apenas na sala em que se encontra (DORNELLES et al., 2014, p. 02). Este ambiente pode ser representado em um ambiente 4 x 4, sendo que cada posição da matriz corresponde a uma sala. Para otimizar o agente, para cada indivíduo da população do algoritmo genético são definidos os pesos na rede neural (DORNELLES et al., 2014, p. 04). Isso configura a inteligência do agente a ser testado. Para cada um dos agentes é inicializado o jogo do Mundo de Wumpus, de modo que o jogo é finalizado se o agente desistir, encontrar o ouro ou morrer (DORNELLES et al., 2014, p. 04). Foram realizados 100 execuções do jogo para cada agente, com o objetivo de obter uma melhor precisão do desempenho (DORNELLES et al., 2014, p. 04). Quando a execução termina é retornada a pontuação média para o indivíduo do algoritmo genético. Essa pontuação serve de base para definir a eficiência deste indivíduo. Após isso, o algoritmo genético se encarrega da otimização dos pesos, seguindo os seus critérios de evolução. Após serem realizados alguns treinamentos do agente, variando as quantidades de neurônios entre 10 e 500, foi adotado o número de 200 neurônios para a estrutura do mesmo (DORNELLES et al., 2014, p. 04). O objetivo disso é proporcionar ao agente certo nível de memorização, possibilitando ao mesmo aumentar sua capacidade de aprendizado. 2.4.2.2 Resultados Ao realizar os testes e analisar o desempenho do agente, observou-se que o fato de o agente se mover pelo Mundo de Wumpus em busca do ouro, a probabilidade de ser morto pelo Wumpus ou cair em algum poço, eram maiores do que encontrar e agarrar o ouro (DORNELLES et al., 2014, p. 04). Isso acaba dificultando o aprendizado 29 do agente, devido ao fato do agente perceber que desistindo do jogo as chances de obter maiores pontuações são maiores. Dornelles et al. (2014, p. 05) afirma que as novas definições de medidas de desempenho embora tenham proporcionado para o agente uma maior exploração da caverna e a captura do ouro em alguns testes. Para o autor, tais alterações não contribuíram para uma melhora significativa em seu desempenho. E ainda conclui que a estrutura de rede neural utilizada nesse projeto dificultou a evolução do agente. 2.4.3 Híbrido de Programação Genética com Variante de PBIL Este trabalho é um artigo desenvolvido por Gustavo Henrique Flores Caldas e Roberto Schirru. Nele será combinado a programação genética com uma variante do algoritmo PBIL. Segundo Caldas e Schirru (2005, p. 01), a programação genética será combinada com o PBIL em um processo conhecido como co-evolução, onde uma população de árvores evolui paralelamente com um vetor de probabilidades de PBIL. 2.4.3.1 Implementação A evolução ocorre da seguinte forma: um vetor binário é gerado tendo por base um vetor de probabilidades, depois disso as constantes codificadas no vetor binário são adicionados na árvore. Na avaliação a aptidão é calculada com base apenas na árvore. Conforme Caldas e Schirru (2005, p. 04), o valor da aptidão obtido dessa forma é utilizado independentemente para se calcular as novas gerações de árvores e vetores de probabilidades. A Figura 4 mostra como os indivíduos serão representados. Como explica Caldas e Schirru (2005, p. 04), a linha tracejada indica que associada a cada árvore existe um vetor binário de tamanho fixo, ele será responsável pela codificação das constantes. De acordo com Caldas e Schirru (2005, p. 05), O algoritmo será comparado com a técnica tradicional (ERC), utilizando apenas a programação genética. Com ERC (Ephemeral Random Constants) substituem-se as constantes a, b e c por um gerador aleatório de constantes no intervalo [−1, 1]. Com isso será possível fazer uma análise de qual dos métodos será mais eficaz. Para os testes foram realizadas evoluções com uma população de 4000 indivíduos durante 1000 gerações (CALDAS; SCHIRRU, 2005, p. 05). Na sequência serão apresentados os resultados obtidos com a realização dos teste. 30 Figura 4 – Exemplo de uma Representação onde o PBIL é Combinado à Programação Genética Fonte: Caldas e Schirru (2005, p. 04) 2.4.3.2 Resultados A evolução da aptidão obtida pelo método PG com PBIL foi superior a obtida pelo método ERC. Os valores foram obtidos com médias de 10 tentativas independentes. Caldas e Schirru (2005, p. 05) ressaltam que para a combinação PG/PBIL, todas as tentativas são bem sucedidas por volta da geração 300. Os resultados obtidos pelo trabalho foram melhores em comparação com o método tradicional. Conforme Caldas e Schirru (2005, p. 06), foram encontradas soluções melhores e mais compactas, o que favorece a interpretação. Caldas e Schirru (2005, p. 06) ainda ressaltam que as soluções encontradas com o emprego da nova técnica são todas exatas, e não meras aproximações como de costume. 2.4.4 Comparação Entre os Trabalhos Apresentados e o Projeto Proposto Tanto no trabalho apresentado sobre programação genética com variante de PBIL quanto no trabalho sobre a aplicação de redes neurais recorrentes em ambientes parcialmente observáveis, foram aplicadas a técnica de PG combinada com outro método. Neles os algoritmos evolucionários foram utilizados para obter um pedaço da solução. O trabalho que trata de redes neurais buscou resolver o problema para ambientes parcialmente observáveis, assim como é proposto no presente trabalho. Porém nele o algoritmo genético foi utilizada apenas para obter os pesos na rede neural. No trabalho sobre PG combinada com PBIL, é utilizado um vetor de probabilidades que é utilizado para gerar a árvore. Isso para depois obter a aptidão a partir da 31 evolução da população. O trabalho que apresenta a utilização de programação genética aplicada ao problema presa-predador é o que mais se aproxima com o método proposto por esse trabalho. Nele apenas não existe recorrência. O ambiente de simulação também é muito semelhante, apesar de levar o mesmo nome, existem variações com o cenário modelado no presente trabalho. O problema presa-predador utilizado por Friske (2013) possui quatro predadores, que tem o objetivo de cercar a presa. No caso do problema presa-predador utilizado no presente trabalho, existe apenas um predador, e ainda o cenário possuí arbustos, em que a presa pode se esconder. No Capítulo 3 será apresentada a modelagem e a implementação do cenário e do método de programação genética recorrente. Também serão descritos os personagens e as formas com que eles interagem com o ambiente. 3 MODELAGEM E IMPLEMENTAÇÃO Este capítulo irá descrever a modelagem e implementação do projeto apresentado neste trabalho. Serão apresentados o ambiente de simulação presa-predador e o modelo de programação genética utilizada para evoluir o predador. O projeto será desenvolvido utilizando a linguagem JAVA na versão 1.8, utilizando o ambiente de desenvolvimento NetBeans IDE na versão 8.0.2. O projeto está dividido em evolução e simulação. Na evolução são aplicados os operadores genéticos ao predador a fim de torná-lo capaz de capturar a presa. Na simulação são realizados testes a partir do predador evoluído com a finalidade de obter o seu desempenho em diferentes ambientes de simulação gerados aleatoriamente. 3.1 Problema Presa-Predador O problema presa predador é um modelo proposto por Miroslav Benda (SCHüLER, 2002 apud KORF, 1992), ele é composto pelo ambiente e os personagens presa predador. Este problema possui muitas variação, sendo implementado da forma que melhor se encaixa a situação que se deseja simular. Para Schüler (2002, p. 84), O termo “Predador e Presa” também referenciado como problema da perseguição (do inglês, Pursuit Problem) é usado para designar diferentes problemas que normalmente envolvem agentes do tipo predador que perseguem ou comem os agentes do tipo presa. O que frequentemente muda de um modelo de “Predador e Presa” para o outro é a forma como os agentes agem e percebem o seu ambiente assim como o próprio ambiente. Dessa forma dependendo do problema os agentes são criados mantendo o conceito básico de um agente que tenta capturar, denominado predador, e um agente que tenta fugir, denominado presa. Para o presente trabalho será utilizada a seguinte abordagem: O problema possui um ambiente que é um mapa de coordenadas x e y sendo elas finitas. O tamanho desse mapa pode variar dependendo do teste a ser realizado. 33 3.2 Ambiente de Simulação O ambiente de simulação é composto pelo mapa, que guarda as informações do ambiente, pela coordenada e pela ação. Também existem os personagens, que são a presa, o predador e os arbustos. Para os testes desse projeto será utilizado um mapa com a dimensão 10 x 10. Na Figura 5 é representado um exemplo de mapa e os personagens envolvidos. Os principais personagens são a presa e o predador, representados pelo coelho e pela onça respectivamente. Tanto a presa como o predador podem movimentar-se no mapa de coordenadas até a presa ser capturada, ou o predador morrer devido a um arbusto venenoso ou por exceder o número máximo de rodadas. Além deles existem os arbustos, eles possuem posição fixa durante a simulação. O objetivo dos arbustos é impedir o movimento do predador, que no caso está perseguindo a presa. Figura 5 – Cenário do Problema Presa-Predador Fonte: próprio autor 34 3.2.1 Mapa O Mapa é responsável por guardar as informações do ambiente. Sendo essas informações, o tamanho, a lista dos personagens, bem como os métodos que controlam o ambiente. Nela é realizada a verificação de quando a presa for capturada, ou o predador passar por um arbusto venenoso. Referente ao mapa ainda existe a interface ListenerMapa, contendo a assinatura dos métodos atualizarMapa e personagemMoveu, sendo invocados quando o mapa é atualizado, no caso do primeiro método, e quando algum personagem movimenta-se, sendo o caso do segundo método. 3.2.2 Coordenada A classe Coord guarda a posição x e y do mapa. Nela estão contidos os método para mover os personagens. Ela também contém o método que verifica a distância da posição atual até outra posição. Possui também o método responsável por comparar a posição entre duas coordenadas. 3.2.3 Ação A classe Acao, possui a informação de qual será o próximo passo do personagem. Ele pode ir para o NORTE, SUL, LESTE e OESTE, além de ter a opção NADA, em que nenhuma ação é realizada. Isso define para qual direção o personagem irá em cada rodada da simulação. A Figura 6 representa graficamente quais ações o personagem pode realizar. Elas apenas são válidas para a presa e para o predador, já que os arbustos possuem posição fixa. 3.2.4 Personagem A classe Personagem é abstrata que implementa Cloneable, ela possui os atributos responsáveis por guardar a coordenada e o mapa completo da simulação. Nela também estão definidos os métodos pensar e clone, que serão implementados nas classes que herdam de Personagem. Na classe Personagem também está localizado o método agir, que vai designar a ação dos personagens dentro to mapa. 35 Figura 6 – Ações Possíveis para a Presa e para o Predador Fonte: próprio autor 3.2.5 Arbusto Os arbustos são personagens que possuem sua posição fixa, ou seja, não terão movimentação durante a simulação. Cada arbusto pode ser ou não venenoso, para cada simulação são adicionados três arbustos. Desses três, dois são definidos como venenosos e um como não venenoso. A posição inicial dos arbustos é definida no início da simulação de forma aleatória, sendo a mesma até o final. Os arbustos não podem receber a mesma posição, devem ficar em três locais diferentes. Estes arbustos tem por objetivo dificultar a atuação do predador, sendo que o predador não sabe qual dos arbustos é venenoso. A classe Arbusto herda de personagem, esta classe possui um atributo boleano que indica TRUE se o arbusto é venenoso e FALSE se o arbusto não é venenoso. No método responsável por determinar a movimentação do personagem é retornado o tipo nada, já que o arbusto não possui movimento. 3.2.6 Presa A presa tem por objetivo fugir do predador, cada simulação terá uma presa apenas. Esta recebe a posição inicial aleatoriamente, sendo que a cada rodada a presa busca se esconder na posição do arbusto não venenoso. A presa possui a informação de qual arbusto não é venenoso. No momento em que a presa chega no arbusto que não é venenoso, ela permanece nessa posição até o fim da simulação. 36 A presa é definida pela classe Presa, ela herda da classe Personagem. A presa ainda possui outras derivações. As seguintes classes herdam de Presa: PresaArbusto, PresaFoge, PresaParada e PresaRandom. 3.2.6.1 Classe PresaArbusto Esta será a presa utilizada no modelo final do projeto. Durante a simulação ela busca esconder-se atrás do arbusto não venenoso. Ela possui a informação da posição absoluta do arbusto não venenoso, e a cada iteração ela tenta ficar mais próxima do arbusto. 3.2.6.2 Classe PresaFoge Esta presa é utilizada principalmente em simulações com mais de um predador, podendo ser utilizada também para esse modelo. A diferença é que o objetivo dela é apenas fugir do predador e não esconder-se como no caso da PresaArbusto. 3.2.6.3 Classe PresaParada Diferentemente das duas presas citadas anteriormente, esta recebe uma posição inicial e permanece nela até o final. Isso diminui a dificuldade que o predador tem de encontrar e capturar a presa. Porém, em alguns casos quando utiliza-se posições estáticas, os resultados são menores quando são utilizadas posições dinâmicas. Isso ocorre porque, em determinado momento da simulação, os predadores serão orientados a não moverem-se ou realizar movimentos inúteis em looping (FRISKE, 2013). 3.2.6.4 Classe PresaRandom Essa presa troca de posição de forma aleatória. Sendo assim, ela pode tornase uma presa fácil de ser capturada. Levando em conta que com essa presa não existe a preocupação de saber em qual posição o presador está, sua movimentação pode levá-la ao predador, aumentando as chances de ser capturada. 3.2.7 Predador O predador tem por objetivo capturar a presa. Cada simulação terá um predador, sendo sua posição inicial obtida de forma aleatória. A cada rodada o predador busca 37 aproximar-se da presa para capturá-la. Quando ele atinge a posição em que a presa se encontra a simulação termina, sendo que a presa foi capturada. O predador possui as informações sobre a posição da presa até o momento em que ela esconde-se no arbusto não venenoso. Desse momento em diante o predador não possui mais a informação da posição atual da presa. Ele também não possui a informação de qual dos arbustos é venenoso, sendo que ao atingir um arbusto venenoso a simulação acaba com o predador não capturando a presa. O predador é representado pela classe Predador, que herda de personagem. Ele obtém seus movimentos através da árvore de expressões. 3.3 Interface A aplicação possui duas tela. A primeira é utilizada para escolher os parâmetros que serão utilizados na evolução do agente. A segunda é utilizada para a partir do agente evoluído, realizar os testes de desempenho do agente, simulando as ações do agente para diferentes cenários. A Figura 7 refere-se a tela utilizada na evolução do agente. Nela podem ser selecionados os parâmetros que definem o ambiente bem como a forma que os personagens interagem dentro do ambiente. No campo população, deve ser informado o tamanho da população. Ele representa qual o número de indivíduos que compõe a população. Sendo assim, se for definido o valor 100 para esse campo, será gerada uma população inicial de 100 indivíduos, e a cada evolução após aplicar os operadores genéticos, deve ser gerado uma nova população com o mesmo número de indivíduos. O campo gerações é utilizado para definir o número máximo de gerações que serão evoluídas. Sendo que essa quantidade pode não ser totalmente utilizada, devido ao fato de que a evolução para no momento em que a evolução atual atinge uma solução que satisfaça o problema. O campo mutação, define qual será a taxa de mutação aplicada a cada indivíduo. Isso define o percentual de características que serão alteradas em cada evolução do agente. Isso permite que a população mantenha diversidade, sendo que a solução não fica presa à um solução local. No campo tamanho, será definido qual é o tamanho do mapa, nele podem ser informadas a posição x e y, que definem a quantidade de linhas e colunas do mapa. Para obter resultados fidedignos, é importante que todas as evoluções possuam um 38 Figura 7 – Tela para Realizar a Evolução do Predador Fonte: próprio autor mapa de mesmo tamanho. No campo percepção é definido se o predador irá possuir percepção absoluta ou percepção relativa. Também pode ser selecionada a opção percepção relativa com a utilização de variáveis de memória. Sendo que na percepção absoluta esta disponível ao predador a posição exata da presa. Já na percepção relativa, o predador possui a informação da presa até o momento em que ela se esconde no arbusto. Com a utilização da percepção relativa com variáveis de memória, são utilizadas variáveis que guardam estados anteriores em que a presa percorreu para ajudar na captura por parte do predador. No campo tipo da presa pode ser escolhido a forma que a presa interage com o ambiente. Sendo que pode ser selecionada a opção de posição fixa para a presa, a forma de movimentação aleatória dentro do mapa. Também existe a possibilidade de adicionar inteligência para ela fugir do predador, e por fim a presa utilizada para realizar 39 os teste, em que ela nasce em uma posição aleatória do mapa e a cada movimento ela converge para a direção do arbusto que não é venenoso, com o objetivo de esconder-se do predador. Figura 8 – Tela para Realizar os Testes da Evolução do Predador Fonte: próprio autor A Figura 8 é utilizada para realizar os testes do problema. O bloco de dados denominado controle apenas apresenta as opções escolhidas na evolução representada na Figura 7. Sendo que o campo cenário define o tamanho do mapa, o campo presa define o tipo de presa e o campo percepção define a percepção que o predador terá sobre o ambiente. No bloco simulação deve ser informado o número de simulações que serão realizadas. Cada simulação gera posições aleatória para cada personagem, isso permite que tenha-se uma gama grande de testes. Além disso, cada simulação é repetida 10 vezes, e ao fim é informada a média de capturas da simulação. Ao fim dos testes, pode ser visualizado a quantidade de vezes em que a presa foi capturada e a quantidade de vezes em que o predador foi morto. No caso do 40 predador morrer, também são apresentados os valores de quantas vezes o predador morreu por encostar em um predador venenoso e a quantidade de vezes em que a simulação acabou por exceder o número máximo de passos. Para essa aplicação a quantia máxima de passos foi definida em 1000. No próximo capítulo serão apresentados os resultados que foram obtidos com a execução dos testes na aplicação que foi modelada e implementada. Com a inserção do predador evoluído em diversos ambientes de simulação será possível verificar eficácia da técnica de programação genética recorrente. 4 RESULTADOS Um conjunto de testes foram executados para analisar o desempenho do predador dentro do mapa. Os resultados são apresentados utilizando diferentes características do cenário. Primeiramente, Na Seção 4.1 serão apresentados os resultados obtidos com população de 100 indivíduos e, na Seção 4.2 será apresentado o desempenho do predador quando a evolução possuí população com 200 indivíduos. Já na Seção 4.3 será realizado um comparativo entre os resultados obtidos na Seção 4.1 e na Seção 4.2, e posteriormente na Seção 4.4 serão apresentadas considerações a respeito dos resultados obtidos. Os resultados são analisados com: a) Predador com Percepção Absoluta do Ambiente; b)Predador com Percepção Relativa do Ambiente e c) Predador com Percepção Relativa do Ambiente Utilizando variáveis de Memória. Isso nos permite comparar em que situações o predador obteve melhores taxas de captura, bem como verificar se a técnica abordada pelo projeto obteve bons resultados. A taxa de mutação foi definida em 5%, isso permitirá que a população mantenha diversidade durante as evoluções. Com isso o predador conseguirá capturar a presa em diferentes cenários que forem gerados aleatoriamente. Isso porque não ficará preso em uma solução local. Essa taxa de mutação foi escolhida após a realização de testes iniciais. Com esse percentual de mutação foram obtidos os melhores resultados. A partir dessa análise foi obtido a taxa que melhor se encaixou ao problema, a qual foi utilizada no restante dos testes. Ao utilizar taxas de mutação menores do que 5% o predador não conseguia solucionar problemas em que o mapa variava muito. Isso acontece porque a variação entre os indivíduos da população foi muito baixa. Com taxa de mutação muito baixa, a população teve pouca diversidade, isso tornou o predador incapaz de resolver problemas que fugiam muito do normal. Já quando foram utilizadas taxas de mutação acima de 5%, o predador obteve menor taxa de captura do que quando eram utilizadas taxas de 1%. O predador acabava percorrendo o mapa com muita aleatoriedade, e na maioria das vezes acabava morrendo por exceder o número máximo de rodadas. Para a realização dos testes para obtenção dos resultados foi utilizado um notebook com processador Intel Core i5 (2, 50GHz) e memória de 4 GB. O tempo utilizado para cada evolução variou de 1 hora, nas evoluções de 1000 gerações, a 12 42 horas, nas evoluções com 5000 gerações. Foram realizadas evoluções de 1000 gerações até 5000 gerações. Em cada evolução foram aplicados 5000 testes com cenários gerados aleatoriamente. Foi determinado 1000 rodadas como sendo o número máximo para o predador capturar a presa. Como existem variações entre cada simulação, a grande quantidade de repetições nos teste garante maior precisão no percentual de capturas. 4.1 Resultados da Evolução do Predador com População de 100 Indivíduos Neste teste foram realizadas evoluções do predador com população de 100 indivíduos. Na Seção 4.1.1 serão apresentados os resultados com a percepção absoluta, percepção relativa e percepção relativa utilizando variáveis de memória. 4.1.1 Predador com Percepção Absoluta do Ambiente Nos testes utilizando a percepção absoluta da presa o predador obteve alta taxa de captura. Na Tabela 1 estão apresentados os percentuais de captura, de morte do predador por um arbusto venenoso e também o percentual de mortes por tempo máximo. Tabela 1 – Percepção Absoluta com 100 Indivíduos Gerações 1000 2000 3000 4000 5000 Capturas Mortes Por Arbusto Venenoso Mortes Por Tempo Máximo 85,20% 87,60% 89,10% 91,50% 95,10% 14,80% 12,40% 10,90% 8,50% 4,90% 0,00% 0,00% 0,00% 0,00% 0,00% Fonte: próprio autor A taxa de captura variou entre 85, 20%, com a evolução de 1000 gerações e chegou a uma taxa de 95, 10% com a evolução de 5000 gerações. Isso deixa visível que com o aumento no número de gerações o predador acabou sendo melhor direcionado para a posição da presa. Sendo que nesse exemplo não ocorreram mortes por exceder a quantidade máxima de rodadas. Isso porque o predador não ficou perdido no mapa em nenhuma das simulações. 43 4.1.2 Predador com Percepção Relativa do Ambiente Ao utilizar percepção relativa da ambiente os resultados obtidos foram bem piores do que com percepção absoluta. A Tabela 2 mostra que a taxa de captura ficou abaixo de 35%. As mortes por arbusto venenoso não variaram tanto em comparação com os da tabela 1. Já as mortes por exceder o número máximo de rodadas chegou a ultrapassar 60%. Tabela 2 – Percepção Relativa com 100 Indivíduos Gerações 1000 2000 3000 4000 5000 Capturas Mortes Por Arbusto Venenoso Mortes Por Tempo Máximo 21,40% 23,40% 27,10% 33,70% 34,10% 17,40% 17,20% 16,20% 11,40% 10,80% 61,20% 59,40% 56,70% 54,90% 55,10% Fonte: próprio autor A alta taxa de mortes por exceder o número máximo de rodadas deixa claro que o predador acabou ficando perdido dentro do mapa entre 55, 10% e 61, 20% das simulações. Mesmo assim o predador conseguiu obter a captura da presa em até 34, 10% das simulações. 4.1.3 Predador com Percepção Relativa do Ambiente Utilizando Variáveis de Memória Utilizando percepção relativa com variáveis de memória os resultados ficaram próximos aos dos obtidos com percepção absoluta. A Tabela 3 mostra que o percentual de captura variou entre 86, 70% e 92, 00%. As mortes por arbusto venenoso estiveram nos mesmos patamares da simulação com percepção absoluta. Tabela 3 – Percepção Relativa Utilizando Variáveis de Memória com 100 Indivíduos Gerações 1000 2000 3000 4000 5000 Capturas Mortes Por Arbusto Venenoso Mortes Por Tempo Máximo 86,70% 87,00% 87,40% 89,00% 92,00% 11,00% 12,00% 12,10% 11,00% 8,00% 2,30% 1,00% 0,50% 0,00% 0,00% Fonte: próprio autor No caso das mortes por exceder o número máximo de rodadas, as taxas foram baixas. Com 1000 gerações ela ficou em 2, 30%, sendo que com o aumento no número 44 de gerações esse número foi diminuindo. Ao chegar a 3000 gerações esse valor chegou 0, 50%, e passou a ser 0% a partir de 4000 gerações. 4.2 Resultados da Evolução do Predador com População de 200 Indivíduos Nesta simulação foram realizadas evoluções do predador com população de 200 indivíduos. Na Sessão 4.2.1 serão apresentados os resultados com a percepção absoluta, percepção relativa e percepção relativa utilizando variáveis de memória. 4.2.1 Predador com Percepção Absoluta do Ambiente Nos testes utilizando percepção absoluta os resultado mantiveram alto percentual de captura. A Figura 4 mostra que a taxa de captura alcançou 96, 70%, um resultado muito bom, ou seja o predador morreu apenas 3, 30% das vezes em decorrência de um arbusto venenoso. Tabela 4 – Percepção Absoluta com 200 Indivíduos Gerações 1000 2000 3000 4000 5000 Capturas Mortes Por Arbusto Venenoso Mortes Por Tempo Máximo 87,30% 88,20% 89,00% 92,30% 96,70% 12,70% 11,80% 11,00% 7,70% 3,30% 0,00% 0,00% 0,00% 0,00% 0,00% Fonte: próprio autor As mortes por tempo máximo ficaram em 0%, isso mostra que o predador não ficou perdido nenhuma vez no mapa. Sendo que ele apenas não conseguiu capturar a presa quando morreu por encostar em um arbusto venenoso. 4.2.2 Predador com Percepção Relativa do Ambiente Ao utilizar percepção relativa nos testes com populações de 200 indivíduos os resultados foram um pouco melhores dos utilizando 100 indivíduos. A Figura 5 mostra que com 1000 gerações o resultado foi baixo, porém com 5000 gerações foi atingido 51, 40% de capturas. As taxas de mortes por exceder o número de rodadas continuou alto, ficando sempre acima de 40%. Já as mortes por encostar em um arbusto venenoso chegaram 45 Tabela 5 – Percepção Relativa com 200 Indivíduos Gerações 1000 2000 3000 4000 5000 Capturas Mortes Por Arbusto Venenoso Mortes Por Tempo Máximo 15,80% 25,80% 32,00% 44,60% 51,40% 23,90% 17,00% 12,70% 11,20% 7,20% 60,30% 57,20% 55,30% 44,20% 41,40% Fonte: próprio autor a ficar próximas dos obtidos com percepção absoluta. Porque Nota-se que com o aumento do número de gerações o percentual de capturas vai aumentando, porém a variação entre a quantidade de gerações vai diminuindo. 4.2.3 Predador com Percepção Relativa do Ambiente com Variáveis de Memória Nos testes utilizando percepção relativa com variáveis de memória os resultados continuaram bons. A Figura 6 mostra que com 1000 gerações a taxa de captura ficou em 83, 10%, abaixo do que quando a população era de 100 indivíduos. Porém com 5000 gerações a taxa de captura foi maior em comparação a taxa obtida com a população de 100 indivíduos. Tabela 6 – Percepção Relativa Utilizando Variáveis de Memória com 200 Indivíduos Gerações 1000 2000 3000 4000 5000 Capturas Mortes Por Arbusto Venenoso Mortes Por Tempo Máximo 83,10% 88,70% 91,40% 91,70% 92,80% 2,10% 1,00% 0,00% 0,00% 0,00% 14,80% 10,30% 8,60% 8,30% 7,20% Fonte: próprio autor As mortes em decorrência de encostar em um arbusto venenoso ficaram em 0% a partir de 3000 gerações. Já As mortes por exceder o número máximo de rodadas ficou maior em comparação com a população de 100 indivíduos. Isso em decorrência do fato de que como existem mais indivíduos, os resultados ficariam melhores com o aumento no número de gerações. Como é apresentado na Tabela 6, com o aumento das gerações as mortes por exceder o número máximo de rodadas vai diminuindo com o aumento do número de gerações. 46 4.3 Análise dos Resultados Obtidos Os resultados utilizando o predador evoluído utilizando percepção absoluta e percepção relativa obtiveram resultados semelhantes. A Figura 9 mostra que os resultados dessas percepções se manteve estável, com uma pequena taxa de crescimento. A variação entre a evolução de 1000 gerações e 5000 ficou em 5, 30%, sendo que predador já estava com alto índice de captura com 1000 gerações. Já com a utilização de percepção relativa os resultados foram bem piores. O índice de captura iniciou em 21, 40% e obteve crescimento pequeno até a geração 3000. Já da 3000 ate a 4000 o resultado melhorou em 6, 60%. Depois o percentual de capturas estabilizou e chegou na geração 5000 sem muita variação. O percentual de capturas utilizando percepção relativa com memória obteve mais capturas do que com a utilização de percepção absoluta com 1000 gerações. Porém a partir da geração 2000 a percepção absoluta se manteve sempre a frente. Esse fato mostra que com 1000 gerações as duas percepções citadas estavam com o nível de adaptação ao ambiente baixa. Com o aumento das gerações, a percepção absoluta obteve melhores resultados em decorrência de possuir uma visão mais ampla sobre o mapa. Figura 9 – Comparativo da Evolução das Percepções Absoluta, Relativa e Relativa com Memória com População de 100 Indivíduos Fonte: próprio autor 47 Os resultados obtidos obtidos com percepção absoluta e percepção relativa com memória são idênticos. Isso mostra que o armazenamento dos estados em que a presa esteve antes de se esconder fizeram que o predador conseguisse capturá-la em proporções muito semelhantes de quando o predador possui informações completas sobre o ambiente. Ao analisar os resultados das evoluções com população de 200 indivíduos nota-se um pequeno aumento na taxa de captura em comparação com evoluções de populações de 100 indivíduos. Na Figura 10 os resultados da percepção absoluta e da percepção relativa com memória ficaram próximos. Com 2000 e 3000 gerações as capturas com percepção absoluta ficaram abaixo do que utilizando percepção relativa com memória. Mas com 5000 gerações foi a percepção absoluta que obteve melhor desempenho. Já com a utilização de percepção relativa, os resultados ainda foram baixos, porém acabaram ficando melhores do que com população de 100 indivíduos. Na Figura 10 pode-se perceber que com 1000 gerações a taxa de captura foi baixíssima, atingindo apenas 15, 80% de capturas. Porém com o aumento no número de gerações, foi atingido 51, 40% de capturas. Uma variação de 35, 60% de aumento entre 100 e 5000 gerações. Mas mesmo com esse grande aumento, com 5000 gerações obteve-se captura em apenas pouco mais da metade das simulações. 4.4 Considerações Sobre os Resultados Ao adicionar variáveis de memória quando se tinha apenas percepção relativa, os resultados ficaram muito próximos de quando tinha-se o conhecimento total do mapa. Notou-se que com percepção relativa, em muitas vezes o predador ficou perdido no mapa, e acabou morrendo por exceder o número máximo de rodadas. Os arbustos venenosos também tiveram um papel importante para que o predador não obtivesse mais capturas. Com o aumento das gerações o predador foi aprendendo a desviar desses arbustos, e na maior parte dos testes o percentual de mortes por causa de um arbusto venenoso foi diminuindo com o aumento das gerações. Os resultados obtidos com a utilização da técnica de programação genética recorrente foram bons comparando com os resultados em ambientes parcialmente observáveis sem variáveis de memória. Os resultados mostraram que a técnica utilizada para guardar as percepções antes da presa se esconder proporcionaram que o agente obtivesse resultados semelhantes em ambientes completamente observáveis e em ambientes parcialmente observáveis. 48 Figura 10 – Comparativo da Evolução das Percepções Absoluta, Relativa e Relativa com Memória com População de 200 Indivíduos Fonte: próprio autor A técnica proposta pelo presente trabalho conseguiu praticamente a mesma taxa de captura obtida em ambientes com percepções completas. Isso mostra que a aplicação de programação genética recorrente foi bem sucedida em ambientes parcialmente observáveis. Sendo capaz de obter altas taxas de capturas no ambiente do problema presa-predador. 5 CONCLUSÕES A técnica de programação genética é muito eficiente dentro de ambientes completamente observáveis. Porém seu desempenho diminui drasticamente quando trata-se de ambientes parcialmente observáveis. Sendo assim é necessário adaptar essa técnica para conseguir guardar as percepções obtidas para usá-las nos momentos em que o ambiente não oferece percepções exatas. Este trabalho apresentou o estudo, a modelagem e a implementação da técnica de programação genética recorrente, que foi aplicada ao problema presa-predador. Onde foi evoluído o personagem denominado predador, visando capturar outro personagem denominado presa. Com a aplicação da programação genética em ambientes completamente observáveis, foram obtidos bons resultados. As taxas de captura superaram 90% nos testes com evolução de 5000 gerações, mostrando que essa técnica é muito eficaz na resolução de problemas complexos, em que o cenário possui alta variação. Porém, quando a programação genética foi aplicada em ambientes parcialmente observáveis, onde o predador não possuía percepções completas sobre o ambiente, as taxas de capturas foram baixas. Percebeu-se que o agente muitas vezes ficou perdido no ambiente. As melhores taxas de captura ficaram em torno de 50%. Isso mostrou que apenas a técnica de programação genética é ineficaz para a resolução de problemas em ambientes parcialmente observáveis. A partir disso, nota-se a importância de trabalhar em cima desses casos, onde o agente possui percepção parcial sobre o ambiente. Com isso, poderiam ser obtidas soluções mais próximas ao resultado ótimo. Isso porque o agente teria melhor adaptação sobre ambientes que possuem muita variação. Quando foi adicionado variáveis de memória, guardando percepções de ações realizadas no ambiente, obteve-se grande melhoras nos resultados. Ao aplicar a técnica em que se baseia esse trabalho, os resultados foram semelhantes aos obtidos em ambientes completamente observáveis. Isso mostra que essa técnica é muito eficaz. Analisando que sem a utilização de memória, no mesmo tipo de ambiente, foram obtidos cerca de 50% de capturas, e com memória ultrapassou 90% de capturas. Nota-se que a técnica proposta nesse trabalhou conseguiu obter exito na resolução do problema presa-predador, podendo também ser eficaz para variados problemas, como por exemplo, aplicá-la em mineração de dados e otimização de rotas. 50 Este trabalho demostrou que com a técnica apresentada, é possível evoluir agentes inteligentes capazes de adaptar-se a ambientes parcialmente observáveis e obter sucesso na resolução de problemas em que o agente tem percepção relativa do ambiente, tornando assim essa técnica aplicável a problemas complexos, devido a alta adaptabilidade demonstrada pelo agente nos testes realizados. 5.1 Trabalhos Futuros Como trabalhos futuros, podem ser desenvolvidas pesquisas em torno da programação genética, devido ao grande campo que ainda existe a ser explorado na área de inteligência artificial. Uma proposta é a aplicação da técnica de programação genética recorrente a outros problemas, como por exemplo o mundo de Wumpus, visando obter o desempenho dessa técnica para outros problemas. Outra proposta nessa área é a aplicação de programação genética recorrente combinada com outras técnicas de programação genética. Ela poderia ser implementada junto com redes neurais, em busca de paralelizar a evolução do agente, utilizando redes neurais para obter o fitness do indivíduo, bem como a aplicação da seleção dos indivíduos. Também pode ser proposto a utilização algoritmos genéticos com memória. Com isso, poderia ser realizado o comparativo entre as duas técnicas que pertencem aos algoritmos evolucionários. Dessa forma seria possível analisar qual das técnicas possui mais eficácia nesse tipo de problema. REFERÊNCIAS BECCENERI, J. C. Meta-heurísticas e otimização combinatória: Aplicações em problemas ambientais. Escola de Verão do Laboratório Associado de Computação e Matemática Aplicada - São José dos Campos, 2013. BRUCE, W. S. The application of genetic programming to the automatic generation of object-oriented programs. PhD thesis. School of Computer and Information Sciences, New Southeastern University, 1995. CALDAS, G. H. F.; SCHIRRU, R. Híbrido de programação genética com variante de pbil. International Nuclear Atlantic Conference - INAC - Santos - São Paulo, 2005. DARWIN, C. A origem das Espécies e a Seleção Natural. [S.l.: s.n.], 1959. DORNELLES, E. F. et al. Aplicação de redes neurais recorrentes em ambientes parcialmente observáveis. Salão do Conhecimento volume 2, 2014. FRISKE, M. W. Programação genética aplicada ao problema presa-predador. Ijuí, 2013. GALASTRI, A. L. O uso de programação genética na tomada de decisões em jogos. Universidade Regional de Blumenau – Centro de Ciências Exatas e Naturais – Curso de Ciências da Computação - Blumenau, 2003. KORF, R. E. A simple solution to pursuit games. International WorkShop on Distribuited Artificial Inteligence, 1992. LINDEN, R. Algoritmos Genéticos. [S.l.]: ed. Rio de Janeiro: Ciência Moderna, 2011. MARTíNEZ, J. M. Métodos computacionais de otimização. Departamento de Matemática Aplicada - IMECC-UNICAMP - São Paulo, 1998. MEDEIROS, F. L. L. Métodos computacionais de otimização. Algoritmo Genético Híbrido Como um Método de Busca de Estados Estacionários de Sistemas Dinâmicos São José dos Campos - São Paulo, 2006. RODRIGUES, E. L. M. Evolução de funções em programação genética orientada a gramáticas. Curitiba, 2002. RUSSEL, S.; NORVIG, P. Inteligência Artificial: Tradução da Segunda Edição. Tradução de PubliCare Consultoria. [S.l.: s.n.], 2004. SCHüLER, J. P. S. Inteligência artificial popperiana. Porto Alegre, 2002. SOUZA, L. V. d. Programação genética e combinação de preditores para previsão de séries temporais. Universidade Federal do Paraná - Curitiba, 2006.