• Nenhum resultado encontrado

Programação genética aplicada ao problema da presa-predador

N/A
N/A
Protected

Academic year: 2021

Share "Programação genética aplicada ao problema da presa-predador"

Copied!
64
0
0

Texto

(1)

UNIVERSIDADE REGIONAL DO NOROESTE DO ESTADO DO RIO GRANDE DO SUL – UNIJUÍ

DCEEng – DEPARTAMENTO DE CIÊNCIAS EXATAS E ENGENHARIAS

MARCELO WUTTIG FRISKE

PROGRAMAÇÃO GENÉTICA APLICADA AO PROBLEMA DA PRESA-PREDADOR

Ijuí, 2013

(2)

2

MARCELO WUTTIG FRISKE

PROGRAMAÇÃO GENÉTICA APLICADA AO PROBLEMA DA PRESA-PREDADOR

Trabalho de Conclusão de Curso apresentado ao Curso de Graduação de Ciência da Computação do Departamento de Ciências Exatas e Engenharias (DCEEng) da Universidade Regional do Noroeste do Estado do Rio Grande do Sul (Unijuí), como requisito para obtenção do título de Bacharel em Ciência da Computação.

Orientador: Prof. Me. Rogério Samuel de Moura Martins

Ijuí, 2013

(3)

3

PROGRAMAÇÃO GENÉTICA APLICADA AO PROBLEMA DA PRESA-PREDADOR

MARCELO WUTTIG FRISKE

Trabalho de Conclusão de Curso apresentado ao Curso de Graduação de Ciência da Computação do Departamento de Ciências Exatas e Engenharias (DCEEng) da Universidade Regional do Noroeste do Estado do Rio Grande do Sul (Unijuí), como requisito para obtenção do título de Bacharel em Ciência da Computação.

__________________________________________ Orientador: Prof. Me. Rogério Samuel de Moura

Martins

BANCA EXAMINADORA

__________________________________________ Prof. Dr. Sandro Sawicki

Ijuí, 2013

(4)

4

Dedico este trabalho a todos os pesquisadores e estudantes, que assim como eu, tiveram uma quebra de paradigma ao conhecer a Inteligência Artificial e perceber o quão útil e prática pode ser essa área para a vida humana.

(5)

5

AGRADECIMENTOS

Agradeço primeiramente à Deus por prover a vida e a liberdade ao ser humano, e que tal liberdade foi guiada por Ele para chegar aonde estou hoje.

Agradeço aos meus pais Eldevir e Rosane, que me incentivaram sempre nos estudos, estando sempre presente na horas alegres, mas nas mais difíceis também.

Ao Professor Rogério, por acreditar em meu potencial na elaboração deste trabalho, confiando em minha capacidade e ainda pelo incentivo ao estudo na área de inteligência artificial, o qual pretendo seguir daqui para frente.

Ao colega Tales Panke, que contribuiu significativamente para implementação da aplicação.

Por fim mas não por último, agradeço à minha namorada Mariana Rick, a qual me auxiliou muito na elaboração textual desse trabalho. Obrigado por ser uma companheira fiel e atenciosa.

(6)

6

RESUMO

A resolução de problemas da classe NP (tempo polinomial não determinístico) desafia até hoje pesquisadores a buscar técnicas que obtenham resultados cada vez melhores em detrimento de um menor tempo. A Programação Genética (PG) é uma Técnica de Aproximação pertencente a um ramo da Ciência da Computação denominada Inteligência Artificial, que busca potencializar a capacidade racional humana. A PG procura construir de forma automatizada programas de computador para obter bons resultados na resolução de problemas complexos. O presente trabalho propõem uma linguagem de programação específica para a resolução de problemas utilizando a Programação Genética e realiza testes em um ambiente de simulação denominado Presa-Predador. Essa condição permitiu a geração de resultados e sua comparação a outras técnicas de inteligência artificial, utilizando o mesmo ambiente de simulação.

(7)

7

ABSTRACT

The resolution of NP class (Non-Deterministic Polynomial time) problems even today challenges researches to seek techniques that obtain better to the detriment of a shortest time. The Genetic Programming (PG) is a Approximation Technique belonging to a branch of Computer Science called Artificial Intelligence, which aims to enhance the rational human capacity. The PG seeks to build computer programs in automated form to obtain good results in resolution of complex problems. This paper proposes a specific programming language to solve problems using the Genetic Programming technique and it carries out tests in a simulation environment called Prey-Predator. This condition allowed to generate results and their comparison to other techniques of artificial intelligence, using the same simulation environment.

(8)

8

LISTA DE ILUSTRAÇÕES

Figura 2.1 - Esquema de um algoritmo genético ... 20

Figura 2.2 - Representação de um algoritmo básico de programação genética ... 21

Figura 2.3 - Representação de uma expressão matemática em árvore sintática ... 22

Figura 2.4 - Exemplo de operação de crossover ... 25

Figura 2.5 - Exemplo de Mutação em árvore ... 26

Figura 3.1 - Diagrama da escolha da ação ... 29

Figura 3.2 - Processos da abordagem evolucionária ... 32

Figura 3.3 - Codificação do neurônio do modelo proposto ... 33

Figura 3.4 - Algoritmo Evolucionário proposto ... 34

Figura 4.1 - Representação de um indivíduo através da gramática BNF. ... 41

Figura 4.2 - Individuo gerado inicialmente de forma aleatória ... 42

Figura 4.3 - Crossover sugerido para a aplicação. ... 44

Figura 4.4 - Representação de uma mutação com adição do termo AND ... 45

Figura 4.5 - Tela inicial para configuração dos parâmetros da evolução. ... 47

Figura 4.6 - Interface da Simulação... 48

(9)

9

LISTA DE GRÁFICOS

Gráfico 5.1 - Evolução em um ambiente limitado e percepção dos personagens sendo posição absoluta. ... 51 Gráfico 5.2 - Evolução em um ambiente limitado e percepção dos personagens sendo posição

relativa... 53 Gráfico 5.3 - Evolução em um ambiente toroidal e percepção dos personagens sendo posição

absoluta. ... 54 Gráfico 5.4 - Evolução em um ambiente toroidal e percepção dos personagens sendo posição

(10)

10

LISTA DE TABELAS

Tabela 3.1 - Resultados obtidos com o predador popperiano ... 31 Tabela 4.1 - Representação das ações possíveis de um personagem no mapa. ... 39 Tabela 4.2 - Parâmetros de inicialização para Simulação e Evolução ... 47 Tabela 5.1 - Parâmetros utilizados na evolução e na simulação para obtenção de resultados. 50 Tabela 5.2 - Porcentagem de capturas pelos predadores em um mundo limitado e percepção de

posição absoluta. ... 52 Tabela 5.3 - Porcentagem de capturas pelos predadores em um mundo limitado e percepção de

posição relativa. ... 53 Tabela 5.4 - Porcentagem de capturas pelos predadores em um mundo toroidal e percepção de

posição absoluta. ... 55 Tabela 5.5 - Porcentagem de capturas pelos predadores em um mundo toroidal e percepção de

posição relativa. ... 56 Tabela 5.6 - Comparação entre o Predador Popperiano e o Predador da Programação Genética. ... 57 Tabela 5.7 - Comparação de características das aplicações de modelo Neuro-Evolutivo e de

(11)

11

LISTA DE ABREVIATURAS E SIGLAS

AG Algoritmo Genético BNF Backus-Naur Form

ESP Enforced Sub-Populations

IA Inteligência Artificial

NP Tempo Polinomial não determinístico PG Programação Genética

(12)

12 SUMÁRIO 1 INTRODUÇÃO ... 13 2 REFERENCIAL TEÓRICO ... 17 2.1 HEURÍSTICAS E METAHEURÍSTICAS ... 17 2.2 PROGRAMAÇÃO GENÉTICA ... 18 2.2.1 Indivíduo e População ... 22 2.2.2 Função de avaliação ... 22 2.2.3 Seleção ... 23 2.2.4 Operadores Genéticos ... 24 2.2.4.1CROSSOVER ... 25 2.2.4.2MUTAÇÃO ... 25 2.2.5 Módulo de População ... 26 3 TRABALHOS RELACIONADOS ... 28

3.1 INTELIGÊNCIA ARTIFICIAL POPPERIANA ... 28

3.1.1 Implementação ... 29

3.1.2 Resultados ... 30

3.2 MODELO NEURO-EVOLUTIVO DE COORDENAÇÃO ADAPTATIVA EM AMBIENTES DINÂMICOS ... 31

3.2.1 Implementação ... 31

3.2.2 Experimentos e resultados ... 34

4 MODELAGEM E IMPLEMENTAÇÃO ... 38

4.1 AMBIENTE DE SIMULAÇÃO PRESA-PREDADOR ... 38

4.2 EVOLUÇÃO ... 40 4.2.1 Indivíduos ... 40 4.2.2 Avaliação ... 42 4.2.3 Seleção ... 43 4.2.4 Crossover ... 43 4.2.5 Mutação ... 44 4.2.6 Módulo de população ... 46 4.3 INTERFACE ... 46 4.4 DIAGRAMA DE CLASSES ... 49 5 RESULTADOS ... 50

5.1 RESULTADOS OBTIDOS COM A APLICAÇÃO ... 50

5.2 COMPARAÇÃO COM TRABALHOS RELACIONADOS ... 57

5.2.1 Inteligência Artificial Popperiana ... 57

5.2.2 Modelo Neuro-Evolutivo de Coordenação Adaptativa em Ambientes Dinâmico 58 6 CONCLUSÃO ... 59

REFERÊNCIAS ... 60

ANEXO A – RESUMO EXPANDIDO APRESENTADO AO XXI seminário de iniciação científica (2013), premiado como trabalho destaque ... 62

(13)

13

1 INTRODUÇÃO

Existem classes de problemas muito complexos (GARAY, 1979 apud LUGER, 2004) onde é praticamente impossível que um programador encontre, em um pequeno espaço de tempo, soluções que sejam consideradas próximas à uma solução ótima. Isso ocorre porque, a partir da adição de apenas uma instância, o problema sofre um crescimento exponencial de possíveis combinações de soluções, gerando um tempo de resolução que cresce de mesma forma. Tais problemas são conhecidos como NP (polinomial não determinístico). Esse conceito de problema é recente, sendo formalizado por Steven Cook em 1971 pela teoria da NP-Completude (GRONER, 2006). Essa teoria define que um problema é pertencente a NP quando é possível verificar em tempo polinomial uma solução correta. Contudo, não há garantias de que a mesma seja ótima.

No caso de problemas NP, soluções do tipo “busca exaustiva” podem até conseguir o resultado para pequenas instâncias, mas quando estas excedem determinado valor, demorariam anos, décadas, séculos e até milênios para resolver esse tipo de problema. Somente a figura do programador na busca de soluções para problemas, não pode ser considerada suficiente.

Conforme Russel (2004) existem algoritmos de busca utilizados na resolução de problemas NP, que não se importam com o caminho percorrido para chegar ao resultado, pois o caminho não fará parte dele. Como exemplo, temos a resolução de layouts de instalações industriais, escalonamento de horários, etc. Um algoritmo assim é denominado de busca local ou heurística, que opera usando somente um estado corrente e tendo como vantagem o uso de pouca memória e grande frequência para apresentar soluções razoáveis em grandes espaços de estados. As heurísticas são muito usadas para resolver problemas de otimização que segundo Martinez (1998, p. 5) 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”. O autor ainda complementa que tomadas de decisões em vários campos de atividades humanas dependem desses mínimos e máximos.

Há ainda um tipo de heurística denominada de metaheurística, que também é utilizada para encontrar mínimos e máximos de uma função, porém de uma forma mais eficaz, buscando gerenciar outras heurísticas mais simples a fim de convergir para uma solução ótima. Tanto a

(14)

14

heurística como a metaheurística fazem parte de um grupo denominado Técnica (ou Algoritmo) de Aproximação, o qual “(...)são algoritmos que não necessariamente produzem uma solução ótima, mas soluções que estão dentro de um certo fator da solução ótima.” (MIYAZAWA, [200?])

Mas como construir um algoritmo/programa capaz de distinguir se uma solução pode ser ótima ou não? Seria possível a construção de um programa utilizando uma heurística ou metaheurística, onde o computador seria responsável por “pensar”? A resposta está atrelada às Técnicas de Aproximação, pois elas fazem parte de uma ciência muito recente: A Inteligência Artificial (IA ou AI – Artificial Intelligence), que assim como a otimização, busca soluções para problemas complexos.

Segundo Russel (2004, p. 03), “a IA sistematiza e automatiza tarefas intelectuais e, portanto, é potencialmente relevante para qualquer esfera da atividade intelectual humana”. Outra definição dentre as várias existentes é de que a Inteligência Artificial é o estudo de agentes inteligentes (POOLE, 1998). Mas o que são agentes inteligentes? Russel(2004) cita que eles podem ser comparados a um ser humano, ou seja, são capazes de perceber e atuar sob o ambiente, através de sensores (no caso dos humanos, os olhos, por exemplo) e de atuadores (mãos, pés, etc.).

Sendo assim, é possível a criação de agentes inteligentes que serão responsáveis pela busca de soluções próximas à solução ótima em um determinado problema. Uma técnica de aproximação utilizada neste caso é denominada de Programação Genética (GP – Genetic

Programming). Ela foi desenvolvida por John Koza em 1989 e é considerada uma das técnicas

de computação evolucionária presentes na IA, pois é baseada em conceitos da teoria da evolução das Espécies, de Charles Darwin, onde busca evoluir programas de forma a resolver o problema em questão (LINDEN, 2012). Cita ainda o autor que, ao final de 2007, o site http://www.genetic-programming.org informava que já existiam 36 problemas em que a programação genética produziu um resultado competitivo com o desempenho humano.

Outra vantagem da utilização de programação genética é que a sua estrutura básica pode ser adaptável a diversos problemas de grande complexidade. Ou seja, depois de adquirido um bom conhecimento dos conceitos básicos da PG, é possível implementá-la e fazer a transição para a resolução de outros problemas de forma mais simples e direta (LINDEN, 2012). Isso ocorre pela abstração e simplicidade possibilitada pela PG.

(15)

15

Existe um problema caracterizado por pertencer à classe NP denominado Presa-Predador. Ele foi proposto por Miroslav Benda (KORF, 1992 apud SCHÜLER, 2002), onde há um plano de coordenadas x e y finito, um personagem chamado presa e quatro personagens denominados predadores. Os personagens movem-se vertical e horizontalmente, não podendo ocupar a mesma posição. O plano (ou mundo) é limitado ou toroidal, este último define que, ao atingir a última célula do plano, o personagem passa para a primeira célula de posição contrária. O objetivo é de que os predadores, dotados de uma mesma inteligência, cerquem a presa de modo que ela não possa se mover. Tal problema é caracterizado como NP, sendo que para cada movimento de um dos personagens, há um crescimento exponencial de possíveis movimentos para os demais. Além de que, um movimento poderá ser útil para um predador, porém prejudicial a outro para o alcance do objetivo.

O presente trabalho irá apresentar a construção de agentes inteligentes através da

Programação Genética. Para isso será criada uma linguagem específica capaz de atender ao

escopo do problema presa-predador. A PG será então encarregada de utilizar os recursos oferecidos por tal linguagem, combinando e aplicando-os para coordenar os predadores, buscando assim, soluções próximas à solução ótima, que neste caso é a captura da presa.

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, ou seja, quanto mais rápido os predadores cercarem a presa, mais eficiente será o agente que os coordenaram. Além disso, existem problemas reais o qual possuem características de complexidade semelhantes à ele e que podem de mesma forma serem resolvidos com Programação Genética. Dentre eles podemos citar o problema de roteamento de veículos, programação de robôs, construção de softwares, dentre muitos outros.

Diante ao exposto, o presente trabalho tem por objetivo a busca de conhecimento em torno da Inteligência Artificial através da implementação da técnica de Programação Genética na busca de soluções ao problema Presa-Predador. O trabalho está estruturado da seguinte forma: primeiramente serão apresentados conceitos e referências que envolvam os objetivos do trabalho. Após serão apresentados resumidamente dois trabalhos publicados na área de IA. Posteriormente serão descritas as etapas da construção de toda a aplicação, tanto a Programação Genética quanto o ambiente de simulação Presa-Predador. Os resultados obtidos serão apresentados e posteriormente comparados aos trabalhos que utilizaram o mesmo ambiente de

(16)

16

simulação, porém com técnicas de IA diferentes. Ao final, será relatada a conclusão e projeção para trabalhos futuros.

(17)

17

2 REFERENCIAL TEÓRICO

Esta seção do trabalho busca a compreensão dos principais assuntos que o abrangem. Primeiramente será apresentado conceitos sobre técnicas heurísticas e metaheurísticas. E posteriormente será explanado sobre a Programação Genética, que faz parte do grupo de metaheurísticas.

2.1 HEURÍSTICAS E METAHEURÍSTICAS

A palavra heurística é derivada do grego e significa “encontrar” ou “descobrir”, tendo origem em outra palavra grega, conhecida como “eureca”, a qual significa “encontrei”. De forma mais abrangente, a heurística é um método que busca soluções de problemas difíceis através da simplificação destes, tornando a resolução mais fácil e com uma resposta viável, mas não necessariamente a melhor. A heurística é uma capacidade humana e na maioria das vezes inconsciente, pois ela pode ser caracterizada pela tomada de decisões a partir de determinadas experiências e conhecimento prévio. Sendo assim, ela tem aplicabilidade em diversas áreas onde o conhecimento humano é necessário (BACCENERI, 2013).

A heurística pode ser utilizada para resolver problemas de otimização, que consistem “(...) 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 dentro do espaço multidimensional” (MARTINEZ, 1998, p. 01).

Na área da Ciência da Computação, definem-se heurísticas como sendo algoritmos polinomiais que podem ser utilizados para resolver problemas da classe NP. Tais algoritmos não possuem uma garantia de qualidade na solução encontrada, mas tendem a obter soluções ótimas ou próximas a elas (LINDEN, 2012). Logo se conclui que uma heurística não é um método de força bruta (pois este garante a solução ótima). Por possuir técnicas mais sofisticadas, ela encontra uma solução factível em um tempo razoavelmente curto (o que a força bruta nunca fará).

As heurísticas possuem diversas classificações, com diferentes níveis de complexidade. Dentre elas encontramos um tipo em especial denominado de metaheurística, que “(...) pode ser vista como uma ferramenta algorítmica geral que pode ser aplicada a diferentes problemas de

(18)

18

otimização, com modificações relativamente pequenas para torná-la adaptável a um problema específico” (METAHEURISTICS NETWORK, 2007 apud BECCENERI, 2013).

Segundo Martins (2010) as metaheurísticas são técnicas usadas para resolução de problemas do tipo NP-Difíceis, pois elas oferecem soluções ao mesmo tempo melhores e com um tempo de processamento menor que outras técnicas. Ainda afirma que de modo geral elas trabalham a partir de buscas aleatórias e de histórico de aprendizado, ou seja, a partir de outros resultados gerados pela utilização do método.

Conforme cita CHAVES(2005), as heurísticas em sua maioria buscam o ótimo global a partir de um ótimo local, contudo tal situação não pode ser garantida. Já as metaheurísticas são aprimoramentos de heurísticas, constituindo-se de uma estrutura algorítmica geral que pode ser gerenciada e adaptada a outros problemas específicos com poucas modificações, onde “O grande desafio é produzir, em tempo razoável, soluções tão próximas quanto possíveis do ótimo global” (METAHEURISTICS NETWORK, 2012).

Dentre as metaheurísticas mais bem sucedidas atualmente podemos citar a Tempera Simulada, Busca Tabu, Algoritmos Genéticos e Redes Neurais Artificiais (VÉLEZ et. al., 2007). Neste trabalho será focado um tipo específico, da mesma família dos Algoritmos Genéticos, denominado de Programação Genética, que será descrito posteriormente.

2.2 PROGRAMAÇÃO GENÉTICA

Antes de se falar sobre a programação genética, é necessário conhecer um pouco sobre a técnica que a influenciou: os Algoritmos Genéticos (GAs – Genetic Algorithm).

Os AGs possuem uma semelhança ao processo denominado Teoria da Evolução das Espécies, o qual foi detalhado no livro de Charles Darwin em 1859 (LINDEN, 2008). Essa teoria diz que as espécies competem entre si por recursos, sendo que a mais adaptada ao habitat é a que terá maior probabilidade de sobreviver, pois conseguirá se reproduzir com maior facilidade. Dentre os seres da espécie, a combinação de genes entre eles tende a produzir um novo indivíduo muito melhor adaptado ao habitat em que vive.

Já na década de 40, cientistas buscaram soluções inspiradas na natureza para criar uma ramificação da inteligência artificial. Porém, só na década de 1960 John Holland inventa o Algoritmo Genético. Linden(2008) cita que os AGs são uma técnica de busca extremamente

(19)

19

eficiente, onde o seu objetivo é varrer o espaço de soluções e encontrar aquelas próximas à ótima, isso quase sem necessitar de interferência humana.

Sendo uma técnica de computação evolucionária, os AGs funcionam mantendo um conjunto (população) de estruturas, as quais são denominadas de indivíduos ou cromossomos. Eles são compostos por características (genes) geralmente denotadas por uma sequência de números binários. A população passa então por um processo de avaliação, onde se busca dentre os indivíduos verificar qual é o mais adaptado ao ambiente, ou seja, qual a sua qualidade para solucionar o problema em questão. Após a avaliação, os indivíduos serão submetidos aos

operadores genéticos como a seleção, a recombinação (crossover) e a mutação, para que seja

simulada a sobrevivência do mais (ou dos mais) apto(s), gerando então o módulo de

população. Este módulo definirá a nova população a partir da anterior e dos filhos gerados pela

mesma.

A partir desse funcionamento, o algoritmo genético irá simular uma evolução, ou seja, o processo de avaliação, a atuação dos operadores genéticos sobre os indivíduos e o módulo de população se repetirão quantas vezes for necessário, para que se obtenha uma solução considerada boa ou algum outro critério previamente definido seja alcançado. Cada repetição é conhecida como uma geração, onde uma nova população de indivíduos com diferentes características é gerada pela ação dos operadores genéticos sobre a população anterior.

A partir do explicitado nos dois parágrafos anteriores, podemos ilustrar a estrutura de um algoritmo genético da seguinte forma:

(20)

20

Figura 2.1 - Esquema de um algoritmo genético

Como pode ser observado na Figura 2.1, diferentes gerações não convivem entre si, sendo que ao gerar uma nova população, a anterior é descartada. Contudo, existem métodos que buscam preservar o(s) indivíduo(s) mais apto(s) de uma população já extinta. Esse assunto será detalhado mais adiante.

A partir dessa pequena introdução aos Algoritmos Genéticos, será dado início ao conceito da Programação Genética e suas características de forma mais detalhada por se tratar da técnica utilizada neste trabalho.

A Programação Genética é uma das técnicas de Computação Evolucionária na qual os indivíduos são programas computacionais que variam de forma e tamanho (SOUZA, 2006). Ela foi desenvolvida por John Koza em 1989, com o objetivo de aprimorar a técnica de Algoritmos Genéticos. A diferença substancial entre o Algoritmo Genético e a Programação Genética é de que o primeiro evolui cromossomos simples (que no caso são denotados por sequências de números binários) enquanto o segundo evolui funções ou programas (LINDEN, 2012). Uma definição sucinta pode ser descrita por Zbigniew Michalewicz (2010): “Genetic Algorithms +

Data Structures = Evolution Programs”, ou seja, a PG nada mais é do que um Algoritmo

Genético aprimorado, o qual se utiliza de uma estrutura de dados. A partir disso, as funções de avaliação, crossover e mutação terão algumas diferenças, as quais poderão ser observadas no decorrer deste trabalho.

(21)

21

John Koza(2003) afirma que a programação genética possui várias vantagens, e por isso deve ser dada a devida atenção à ela. Os motivos para isso seriam de que a PG muitas vezes produz inteligência de máquina além de testes, ou seja, em nível humano, sendo que tal inteligência pode superar o desempenho de algum resultado obtido por uma pessoa. Além disso, a PG pode ser considerada uma máquina automática de invenções, afinal, ela não se prende a paradigmas existentes, muitas vezes encontrando soluções inimagináveis por uma pessoa.

A Figura 2.2, conforme Souza (2006) mostra o algoritmo básico da Programação Genética: Primeiramente cria-se uma população aleatoriamente e que possua grande diversidade para que sejam encontrados indivíduos com todas as capacidades necessárias solucionando determinado problema. Posteriormente a população será avaliada, recebendo cada indivíduo um valor de aptidão que mostra o quão próximo a solução este se encontra. Após a avaliação de toda população, os indivíduos com melhor aptidão serão selecionados para que a eles sejam aplicados operadores genéticos (reprodução, mutação, cruzamento). Esses indivíduos serão a nova população que irá passar por todas as etapas novamente até que seja(m) encontrado(s) o(s) indivíduo(s) com aptidão suficiente para resolver o problema ou até atingir-se um critério de parada.

Figura 2.2 - Representação de um algoritmo básico de programação genética

(22)

22

2.2.1 Indivíduo e População

Como já citado, a PG irá trabalhar com estrutura de dados, onde os indivíduos serão compostos por uma árvore sintática que descreve o programa para a possível solução do problema. Uma árvore sintática é uma estrutura onde os dados são apresentados de forma hierárquica (GOODRICH, 2010 apud LINDEN, 2012). As árvores utilizadas para a representação dos indivíduos em programação genética geralmente possuem um nó raiz (que não possui nenhum pai e com isso iniciam a árvore), o qual derivam-se nós filhos, que por sua vez poderão possuir outros nós filhos e assim sucessivamente até que se chegue aos nós folhas (que não possuem nenhum filho). Os nós entre o nó raiz e os nós folhas são denominados de intermediários. A Figura 2.3 ilustra a representação de uma árvore sintática para uma simples expressão matemática.

Figura 2.3 - Representação de uma expressão matemática em árvore sintática

Vale lembrar também, que árvores sintáticas podem ser definidas de forma recursiva, ou seja, o nó de uma árvore pode ser outra árvore e assim sucessivamente. Isso ocorre na operação de mutação que será explanada no próximo capítulo.

Em algoritmos genéticos e programação genética, os indivíduos iniciais (pertencentes à primeira geração) têm de ser o mais simples possível, sendo gerados de forma aleatória. Através da simplicidade, haverá maior garantia de que a evolução irá convergir para uma melhor solução no decorrer das gerações e que a geração aleatória de forma geral gera uma boa distribuição de soluções no espaço de busca de um problema.

2.2.2 Função de avaliação

Assim como nos algoritmos genéticos, a função de avaliação (ou aptidão), mais conhecida nessa área como simplesmente função fitness, avalia a qualidade de um indivíduo para a resolução de determinado problema. Ela é a parte da PG que tem de possuir o máximo

(23)

23

de conhecimento acerca do problema, a fim de tornar-se válida e garantir que os indivíduos que possuam melhor satisfatibilidade para a solução do problema sejam melhores avaliados por tal função. De nada adiantará possuir uma programação genética bem estruturada se a função

fitness não estiver bem definida para o escopo do problema.

A função fitness pode ser definida de duas maneiras: quanto maior o valor retornado por ela, melhor será a avaliação do indivíduo, ou o contrário, onde quanto menor o valor retornado pela função, melhor será a avaliação do indivíduo. Outro ponto importante na função é de que cada indivíduo (programa) executa várias instâncias diferentes de entradas, e provavelmente irá consumir mais tempo durante a execução de uma PG (LINDEN, 2012).

2.2.3 Seleção

Assim como a seleção natural descrita por Darwin, a seleção dos indivíduos que se reproduzirão tem de abranger toda a população, onde os melhores adaptados (com melhor avaliação) terão mais chance de reproduzir-se do que aqueles indivíduos com uma avaliação inferior. Sendo assim, nenhum indivíduo será desprezado no momento da seleção. O que ocorre é que os mais adaptados (e que tecnicamente apresentam uma melhor solução ao problema) tendem a se reproduzir mais vezes que os menos adaptados. Isso ocorre pelo fato de que se os indivíduos abaixo (ou acima, conforme for a função de fitness) de uma determinada avaliação forem descartados da seleção, no decorrer das gerações a população tenderá a possuir indivíduos cada vez mais semelhantes, restringindo a diversidade da população, caracterizando a convergência genética, onde a população estará em um espaço restrito de soluções, não caracterizando uma busca global, e sim local que pode ser feita por uma heurística convencional.

Existem diversos métodos de seleção que podem ser utilizados, tanto para programação genética quanto para algoritmos genéticos, dentre os mais conhecidos podemos citar:

 Método da roleta viciada: É criada uma roleta virtual dividida em pedaços de tamanhos diferentes, onde cada indivíduo receberá um desses pedaços de forma proporcional à sua avaliação, ou seja, quanto melhor a avaliação do indivíduo, maior será o pedaço que receberá da roleta. A soma de todos os pedaços não poderá ultrapassar o tamanho total da roleta, que poderá ser a soma de todas as avaliações, ou um valor escolhido arbitrariamente. A seleção será feita “rodando” a roleta (de forma aleatória), e o indivíduo selecionado será aquele onde a roleta parar;

(24)

24  Método de classificação ou ranking: Segundo Obitko (1998), o método da roleta viciada possui problemas quando há grande diferença entre as avaliações dos indivíduos. Por exemplo, se um indivíduo melhor avaliado possuir 95% das da soma das avaliações dos demais indivíduos, logo haverá indivíduos com pouquíssimas chances de serem selecionados. O método de classificação, como o próprio nome diz, primeiramente classifica a população pelo seu fitness, e posteriormente atribui um valor de adequação determinado por sua classificação. Sendo assim, o prior indivíduo poderá ter adequação igual a 1, o segundo igual a 2, e assim por diante, de forma que o último tenha classificação n. Esse método pode ser caracterizado como mais benevolente ao anterior, por aumentar as chances de um indivíduo com um fitness considerado baixo ser selecionado. Contudo, pode resultar em um menor aproveitamento dos indivíduos considerados melhores, pois a distinção entre esses e os piores não será tão grande;  Método de torneio: Esse método é assim conhecido, pois os indivíduos competem

diretamente entre si pelo direito de gerar descendentes (seja por crossover ou mutação) utilizando como arma o seu valor de fitness. O torneio recebe como parâmetro um número k que representa a quantidade de competidores da “rodada” (LINDEN, 2012), onde os indivíduos serão escolhidos aleatoriamente dentre a população atual. O vencedor do torneio será o competidor que apresentar o melhor fitness. O valor mínimo para k é de 2, pois do contrário não haveria competição, contudo ele não deve ser muito alto, pois o método se assemelharia a roleta viciada, favorecendo sempre os indivíduos de melhor fitness. Sendo assim a única vantagem dos indivíduos com melhor fitness é de que ao serem sorteados para o torneio, sempre irão ganhar. Nota-se então que esse método é mais elaborado e eficaz do que a roleta viciada e classificação, pois tenta favorecer tanto os indivíduos com boa quanto os com avaliação ruim, e ao mesmo tempo sem correr o risco de uma convergência genética.

2.2.4 Operadores Genéticos

Após a seleção, os indivíduos serão submetidos aos operadores genéticos de crossover e mutação. É válido constar que existem muitas variações e tipos de operadores genéticos, contudo nesse trabalho será explanado sobre as versões mais simples dos mesmos, dentre as quais algumas foram utilizadas para a aplicação.

(25)

25

2.2.4.1 Crossover

O operador crossover busca simular a reprodução sexuada natural entre dois indivíduos, onde ocorre a troca de informações entre os mesmos e gerando dois novos indivíduos com características semelhantes aos seus antecessores.

Como os indivíduos são compostos por árvores sintáticas, o operador de crossover irá escolher aleatoriamente um nó de cada indivíduo e realizará um corte no mesmo, gerando uma subárvore, que será intercambiada com o ponto de corte da outra árvore.

Figura 2.4 - Exemplo de operação de crossover

Na figura anterior, a parte superior mostra as árvores (a) e (b) que representam os indivíduos escolhidos através do método de seleção para reproduzirem-se. O elemento corrente sinaliza onde haverá o ponto de corte das árvores para a troca de informações. Logo abaixo são ilustrados os novos indivíduos gerados após o intercâmbio das subárvores dos pais (a) e (b). 2.2.4.2 Mutação

Esse operador busca simular a mutação genética dos indivíduos, isso porque um filho dificilmente irá herdar de seus pais somente as características deles e dos seus antecessores, mas poderá apresentar (com uma pequena possibilidade) características nunca vistas antes em seus antecessores. Além disso, a mutação ocorre para que sempre haja uma boa variabilidade genética na população que está sendo evoluída.

(26)

26

Na programação genética, a mutação ocorre com a alteração aleatória de um ou mais nós da árvore de expressões, sendo recebido como parâmetro a probabilidade dessa mutação. A mutação pode ser caracterizada por troca de operadores, alteração de uma variável, exclusão ou adição de uma subárvore criada aleatoriamente e outras transformações que o programador achar importante.

A probabilidade de um indivíduo sofrer mutação, assim como na vida real, tem de ser muito baixa, pois do contrário, a programação genética se parecerá com uma técnica denominada Randon Walk, onde a solução é determinada aleatoriamente sorteando elementos e sem usar informações correntes ou passadas (LINDEN, 2012). Sendo assim, mesmo que a mutação ocorra para haver variabilidade genética, é necessário que as gerações tenham características semelhantes, pois de nada adiantará criar uma evolução se cada geração for totalmente diferente de outra.

A Figura 2.5 ilustra como ocorre a mutação de um indivíduo, onde uma subárvore caracterizando uma operação exponencial é excluída e substituída por outra, gerada aleatoriamente:

Figura 2.5 - Exemplo de Mutação em árvore

2.2.5 Módulo de População

Essa operação é necessária para controlar a população, pois por questões de simplicidade, a população não pode crescer e deve manter sempre um número constante de indivíduos. Os operadores genéticos irão atuar sobre a população, gerando os filhos até que o número destes atinja o tamanho da população. Quando isso ocorrer, a população atual é

(27)

27

substituída pela nova população. Percebe-se então que ao gerar os dois filhos que farão parte da nova população, os pais são descartados. É algo que não se assemelha à vida real, pois não é regra que ao nascer uma criança, outra pessoa tem de morrer instantaneamente. Pensando nisso, foram criados outros tipos de módulo de população:

 Steady State: Esse método busca representar uma característica natural das populações biológicas, onde indivíduos nascem aos poucos e os mais velhos morrem gradativamente, possibilitando que diferentes gerações se relacionem e gerem novos indivíduos (LINDEN, 2012). Ao invés de criar uma nova população de uma só vez e substituir a anterior, o método steady state cria os filhos aos poucos, na medida em que vai descartando os piores pais (ou faz esse descarte aleatoriamente);

 Elitismo: Esse processo, embora muito simples, gera uma grande diferença na programação genética. Isso ocorre porque ele seleciona alguns dos melhores indivíduos da população e os copia para a próxima geração sem alterá-los. Garantindo assim que a população sempre irá evoluir e os bons indivíduos gerados não irão se perder, pois no pior caso, a nova população terá como melhor indivíduo, o mesmo que foi “eleito” na geração anterior.

 Populações de tamanhos diferentes: A ideia desse método é controlar a vida dos indivíduos por sua idade. Ou seja, mesmo um indivíduo tendo uma avaliação ruim, ele não será descartado se não atingiu a sua idade limite (no caso do elitismo, ele seria). Somente após alcançar a “velhice” ele morrerá. Contudo, essa técnica tem de possuir certos ajustes na criação de processos estocásticos de morte associados a avaliação do indivíduo para que não ocorra a criação de populações extremamente grandes ou a extinção da mesma (FERNANDES, 2000 apud LINDEN, 2012).

(28)

28

3 TRABALHOS RELACIONADOS

O estudo na área de inteligência artificial está cada vez mais presente nas universidades e comunidade científica. Isso porque as vantagens que tal técnica traz tem se mostrado muito presentes, e tem-se clareza de que muitas ainda estão por vir. Conforme Russel (2004, p. 03) “a IA é citada regularmente como ‘o campo em que eu mais gostaria de estar’ por cientistas de outras disciplinas”.

A seguir, serão apresentados de forma resumida dois trabalhos na área de IA, os quais servirão para comparação à aplicação aqui criada. Ambos utilizaram como um dos ambientes de simulação o problema presa-predador, porém as técnicas utilizadas para a resolução deste são diferentes. Além disso, é apresentado um terceiro trabalho, o qual utiliza a PG para programar robôs jogadores de futebol.

3.1 INTELIGÊNCIA ARTIFICIAL POPPERIANA

Elaborado por Schüler(2002), o trabalho buscou reproduzir agentes inteligentes através da simulação da mente popperiana, a qual aprende as regras do ambiente e tem capacidade de planejar futuros estados, permitindo sua adaptação à diversas situações.

A aplicação criada apresenta o desenvolvimento de um sistema de planejamento em que os agentes inteligentes induzem ou aprendem as regras do ambiente, para posteriormente planejar uma série de ações onde o seu resultado é previsto para que haja a satisfação desses agentes em relação ao seu objetivo.

Como ambiente de simulção foi proposto um modelo de agente Minerador Popperiano e Predador Popperiano, sendo este último o objeto de comparação para o trabalho aqui descrito. O agente Predador Poperiano inicia seu trabalho primeiramente aprendendo as regras do ambiente Presa-Predador através dos sistemas de indução e planejamento. Esses sistemas tem de ser genéricos o suficiente para atuar em ambientes onde não haja nenhuma informação prévia. Posteriormente ele passa a planejar as suas ações no ambiente (planos) onde é utilizada a busca cega pela satisfação, ou seja, o plano é construído com sucesso por prever que o

(29)

29

predador esteja mais perto da presa, ou que este leve a um segundo plano o qual traga satisfação para o agente. A Figura 3.1 ilustra o comportamento geral na criação e otimização dos planos.

Figura 3.1 - Diagrama da escolha da ação

3.1.1 Implementação

O sistema de planejamento foi construído em uma classe Object Pascal, sendo a estrutura de dados definida por: um vetor Planos, onde cada célula é outro vetor do tipo Plano, que por sua vez constitui-se de uma ação e o estado a ser atingido por essa ação. Os métodos principais são:

 PodeAgir: Recebe como parâmetro o estado atual do ambiente. O método retorna verdadeiro quando encontra dentro do vetor Planos valores correspondentes ao parâmetro informado;

 PlanejarCegamente: Função que a partir do parâmetro de estado atual, retorna um plano que deve apresentar os passos para alcançar a satisfação;

 OtimizarCegamente: Como o próprio nome diz, trata-se um método de otimizar um planejamento, em que é recebido um plano (fornecido pelo método anterior). A

(30)

30

otimização consiste na tentativa de substituir trechos do vetor recebido por outro de menor tamanho, chegando mais rapidamente à satisfação.

Na utilização do agente popperiano para resolução do problema presa-predador, o autor considerou as seguintes características:

 O ambiente é toroidal;

 Existem quatro agentes predadores e um agente presa;

 Os movimentos são horizontais e verticais, além de poder ficar parado;  Nenhum agente pode ocupar a posição de outro;

 A captura ocorre quando os quatro predadores cercam a presa;

 O movimento da presa é linear, onde é sorteada uma direção a qual será o único movimento da presa;

 A percepção dos predadores é a posição relativa à presa, além de perceber o estado de ocupação das 4 posições vizinhas à presa;

 A satisfação ocorre quando o predador ocupa uma posição vizinha à da presa.

3.1.2 Resultados

Os resultados considerados pelo autor foram o número médio de ciclos que os predadores necessitavam para captura da presa linear. Schüler (2002) informa que inicialmente o agente popperiano leva desvantagem em relação à um agente do tipo darwiniano1. Isso corre pelo primeiro ter de percorrer um longo caminho de aprendizado antes de chegar a um estado inicial. Passado o aprendizado, o agente popperiano leva vantagem pelo fato de ele ser adaptável, possuindo memória e planejando o futuro.

Na primeira fase, descrita pelo autor como “infância”, a regra de comportamento para o predador é de que se for possível alcançar satisfação em apenas um passo, tal ação deve ser tomada. Claro que tal situação dificilmente irá ocorrer. Para isso, o parâmetro de randomicidade é ajustado em 100%, ou seja, troca-se o movimento encontrado em Planos por outro escolhido aleatoriamente. Nesta fase não ocorre o processo de otimização do plano.

Após terminada a fase de infância, o predador passa a fase adulta, tendo uma taxa de randomicidade alterada para 5% e a otimização passa a ser de 1%.

(31)

31

Os resultados apresentados pelo autor são resumidos conforme a Tabela 3.1. Para melhor compreensão, é necessário saber que uma rodada concluída é definida quando todos os personagens efetuaram o seu movimento no ambiente.

Tabela 3.1 - Resultados obtidos com o predador popperiano

Fase Nº de experimentos Média de rodadas para captura Desvio Padrão Infância 31 2473 1608 Adulta 28 313 572

3.2 MODELO NEURO-EVOLUTIVO DE COORDENAÇÃO ADAPTATIVA EM AMBIENTES DINÂMICOS

Elaborado por Côrtes (2005), o trabalho buscou propor um modelo de coordenação baseado em neuro-evolução, combinando duas técnicas de busca: redes neurais e algoritmos genéticos, onde a primeira é responsável pelo comportamento de cada personagem e a segunda será responsável por aprimorar suas partes.

Redes neurais artificiais são técnicas computacionais que simulam a estrutura neural de um ser humano, onde existem pequenas e simples unidades paralelas de processamento, denominados neurônios. Elas são interconectadas total ou parcialmente, onde cada interconexão possui um peso resultante de alguma operação aritmética. Ao decorrer da rede, esses valores tendem a convergir a uma solução útil. No modelo descrito tal conversão ocorre através da atuação dos algoritmos genéticos sobre os neurônios.

3.2.1 Implementação

Na neuro-evolução proposta, os cromossomos representam parâmetros e atributos para as redes neurais (por exemplo: pesos, limites e conectividade). Depois de feito o processo de evolução desses cromossomos, os mesmos são decodificados à rede neural que buscará fornecer uma resposta satisfatória ao problema. As redes neurais resultantes dessa busca podem possuir algoritmos de aprendizado que as treinem a partir de estímulos do ambiente ou então avaliando a execução das mesmas para determinada tarefa. Tal avaliação irá determinar a aptidão (fitness) do(s) cromossomo(s) correspondente(s). A figura a seguir representa tal explicação.

(32)

32

Figura 3.2 - Processos da abordagem evolucionária

O modelo de rede neural utilizado na implementação foi do tipo ESP (Enforced

Sub-Populations), onde a rede é formada por um subconjunto de neurônios. Para cada neurônio

desse subconjunto, a ESP aloca uma população separada da rede, em que um neurônio só pode ser recombinado com os neurônios de sua própria subpopulação.

A utilização do ESP, contudo, tem um ponto que pode ser considerado crítico na resolução quando da sua necessidade de resolver mais problemas:

A medida que a evolução progride, cada sub-população irá declinar em diversidade. Isto é um problema, especialmente em evolução incremental, pois, uma população que já convergiu pode não se adaptar facilmente a uma nova tarefa. Para acoplar a transferência de tarefas a despeito de convergência, ESP é combinado com uma técnica de busca interativa conhecida como Delta-Coding. (CÔRTES, 2005, p. 34).

Logo, a autora buscou a utilização de uma técnica para correção de tal deficiência denominada Delta-Coding, que busca modificações ótimas para a melhor solução corrente.

Em relação aos algoritmos genéticos, cada cromossomo representa um neurônio da camada oculta, o qual agrega seu peso aos pesos dos neurônios de entrada e os transmitem para os neurônios de saída. Sendo assim, o cromossomo armazena os pesos das conexões que ele possui com os demais neurônios da camada de entrada e saída.

(33)

33

Figura 3.3 - Codificação do neurônio do modelo proposto

Observando a Figura 3.3, deve-se destacar que o neurônio da camada oculta (definido como “A”) se conecta com todos os neurônios da camada de entrada e de saída, caracterizando uma rede denominada 2-layer-feedforward totalmente conectada.

No processo de seleção da população melhor adaptada, a autora utilizou do método de roleta viciada juntamente com o módulo de população elitista. Já operação de crossover é realizada de formas diferentes para cada codificação. Quando utilizados números binários na representação do cromossomo, o processo de reprodução sexuada é feito utilizando um operador padrão com um ponto de corte. Enquanto que em cromossomos de números reais, é utilizado um operador de recombinação aritmético, sendo que cada filho é gerado pela combinação linear dos genes dos pais, descrita pelas seguintes fórmulas: geneFilho1 = a * (genePai1) + (1 – a) * genePai2 e geneFilho2 = (1 – a) * genePai1 + a * genePai2.

Assim como no crossover, existem dois tipos de operadores na mutação. Para a representação binária, quando um filho é sorteado para mutação, apenas inverte-se o valor alelo (menor representação do gene), o qual é escolhido aleatoriamente, passando de 0 para 1 ou de 1 para 0. Na mutação aritmética a diferença é de que ao invés de inverter o valor, será gerado um número real aleatório no intervalo [-1,1].

Na aplicação estudada, foi utilizado o modelo presa-predador como ambiente para testes. A presa é controlada por algoritmos simples, podendo ser de movimentos aleatórios, ou seguir sempre numa mesma direção ou ainda fugir do predador mais próximo. Já os predadores são controlados por redes neurais, objetivando evoluí-las para buscar uma solução eficiente na captura da presa.

(34)

34

O plano possui dimensões variáveis, podendo ser limitado ou toroidal. A velocidade e a posição inicial da presa podem ser configuradas para variar o grau de dificuldade do problema. Em relação aos predadores, é possível configurar a quantidade máxima de neurônios ocultos e o tipo de entrada da rede neural, bem como parâmetros para o algoritmo genético (tamanho cromossomo, probabilidade de mutação, elitismo e tamanho da população). A Figura 3.4 descreve o algoritmo evolucionário para solução do problema.

Figura 3.4 - Algoritmo Evolucionário proposto

São criados diferentes cenários para avaliar a qualidade da estratégia dos predadores. Esses cenários consistem basicamente em alterar a posição inicial dos predadores, onde estes podem se mover n passos antes de começarem a ser avaliados (etapa denominada de treinamento).

A aplicação foi desenvolvida na linguagem Java (versão 1.5), possuindo interface para parametrização das características do mapa, dos predadores (redes neurais e AG’s) e da presa.

3.2.2 Experimentos e resultados

Côrtes(2005) realizou dois conjunto de experimentos para avaliar o modelo proposto. O primeiro faz uma comparação com modelos de outros autores e o segundo buscou encontrar

(35)

35

valores satisfatórios para os diversos parâmetros de sua aplicação. Aqui serão apresentados apenas os experimentos realizados para o modelo neuro-evolutivo criado pela autora.

Na realização de experimentos com o seu modelo, Côrtes (2005) buscou variar os diversos parâmetros da aplicação a fim de encontrar boas soluções. Primeiramente foram definidos valores padrões para cada parâmetro. Dentre os principais podemos destacar que:

 O plano é toroidal de tamanho (30,30);

 A presa sempre inicia na posição central (15,15), fugindo do predador mais próximo;

 Os agentes podem ocupar uma mesma posição no mundo;

 A presa é considerada capturada quando um predador consegue tocá-la;  Existem três predadores no plano.

Após a definição de valores padrões, em cada experimento era realizado a alteração no valor de somente um parâmetro e extraídos os resultados.

Os resultados apresentaram-se mais satisfatórios quando os agentes passavam por um treinamento inicial, onde a presa fica parada para depois começar a se mover, fugindo dos predadores. Quando treinados diretamente para captura da presa, os predadores não obtiveram sucesso.

Em um ambiente não toroidal a captura se mostrou mais difícil, embora tecnicamente mais fácil pela possibilidade de utilizar o próprio cenário como auxiliar na captura (CÔRTES, 2005).

Em relação à função fitness, os resultados que obtiveram algum sucesso foram aqueles em que a aptidão é inversamente proporcional à distância final dos predadores para a presa. A média de estabilização dos agentes era na 300ª geração, ocorrendo também quando foram utilizados quatro predadores ao invés de três.

A situação mais crítica encontrada é que a presa só era capturada quando um predador a tocasse. Nos casos onde para ser considera capturada a presa tem de ser cercada, não se obteve sucesso em nenhum experimento.

(36)

36

3.3 USANDO PROGRAMAÇÃO GENÉTICA PARA EVOLUIR AGENTES JOGADORES DE FUTEBOL DE ROBÔS

No trabalho de Maia Jr. (2001), é descrita a evolução de agentes robóticos, capazes de seguir uma bola em um campo de futebol simulado. Tal evolução ocorre através da Programação Genética e passa por três estágios: primeiramente os robôs tem o objetivo de seguir paredes (extremidades do campo), sendo posteriormente evoluídos ao objetivo de seguir a bola utilizando-se de um sistema de visão global. Por fim, os robôs tem de seguir a bola, porém com um sistema de visão local.

Uma característica importante a ser considerada no ambiente de futebol de robôs, é que a PG deve criar agentes capazes de atuar nele (o qual é incerto e variável), escolhendo ações de forma rápida e efetivas.

3.3.1. Implementação

No primeiro estágio, os robôs tem de percorrer todo o campo seguindo suas extremidades e iniciando em posições e direções aleatórias no ambiente. Cada indivíduo da população é testado duas vezes. O cálculo do fitness dá-se basicamente pela diferença entre os movimentos ideais realizados e os movimentos em que o robô desviou-se do caminho. Sendo assim, quanto maior o valor, melhor será a avaliação do indivíduo. Além disso, cada população possui 500 indivíduos, sendo que 30% da população avaliada é passada através do elitismo para a próxima população, e o restante sofre o processo de crossover. O autor não informa a taxa de mutação utilizada para essa evolução.

No segundo estágio, onde a PG deve programar os robôs para seguirem a bola através de uma visão global (câmera superior ao campo e que possibilita a visualização de todo o ambiente). Foi definido que os robôs devem tocar a bola o maior número de vezes em um determinado número de passos. Além disso, o robô tem de buscar pela bola em um prazo máximo de 2000 passos (movimentos). Para calcular o fitness nesse ambiente, foi utilizada uma função a qual o número de vezes que a bola foi tocada é multiplicado por uma constante k e subtraída da razão do número de passos do agente pela distância inicial medida antes do agente se movimentar. Os demais parâmetros da PG seguem mesmos valores do estágio anterior.

O terceiro e último estágio tem o mesmo objetivo que o segundo. Contudo o sensor dos robôs passa a ser uma visão local (simulando uma câmera embarcada em cada um dos robôs). Como diferencial, foi adicionada uma função booleana para verificar se a bola está no campo

(37)

37

de visão do robô. Os demais parâmetros, tanto do ambiente como da PG são os mesmos do segundo estágio.

3.3.2. Resultados

Os resultados obtidos pelo autor foram apresentados de três formas. A primeira representou em gráficos a variação do valor do fitness no decorrer das gerações nos três estágios de evolução. Foram realizadas várias evoluções e apresentadas as variações do fitness da média das evoluções e da melhor evolução. Uma abordagem proposta pelo autor foi a tentativa de uma renovação durante a evolução dos indivíduos que deveriam percorrer o campo. Nela somente 10% de uma nova população seria composta de indivíduos da geração anterior (sejam eles advindos do processo de elitismo, crossover ou mutação). Os 90% restantes seriam criados aleatoriamente. O resultado disso foi que a média no valor do fitness caiu drasticamente.

Nos resultados apresentados em gráficos, o autor observa que os valores médios das evoluções eram muito baixos se comparados ao valor da melhor evolução. Isso deve-se ao fato de se tratar de um problema com grande grau de dificuldade.

A segunda forma de apresentação de resultados foi através do caminho percorrido pelo robô no campo. Na ilustração do caminho percorrido, sempre é utilizado o melhor indivíduo das evoluções executadas. Dessa forma era possível acompanhar o desenvolvimento do indivíduo no decorrer das gerações de forma mais fácil. A figura a seguir demonstra o caminho percorrido pelo robô no primeiro estágio de evolução.

Figura 3.5 - Caminhos para agentes seguidores de paredes.

(38)

38

De maneira geral, pode-se observar que o desempenho do robô nos três estágios de evolução é considerável muito bom, pois ele consegue cumprir de maneira eficiente os objetivos de cada estágio.

A última representação dos resultados trata-se da apresentação do código (programa) gerado pela PG para guiar o robô nos ambientes. O principal ponto observado é que a complexidade e tamanho do programa aumenta significativamente quando ocorre o avanço para um novo estágio da evolução.

O trabalho apresentado por Maia Jr. demonstrou que a PG é uma ferramenta capaz de atuar na evolução de um mecanismo para controle de robôs jogadores de futebol. Contudo, vale salientar que a PG controlava apenas um robô no ambiente simulado, sendo que a aplicação deverá ser aprimorada para poder criar times de robôs, o quais cooperariam entre si para alcançar um objetivo em comum.

4 MODELAGEM E IMPLEMENTAÇÃO

Esta seção do trabalho buscará descrever os passos utilizados na criação de toda implementação, incluindo o ambiente de simulação presa-predador, bem como a parte chave deste trabalho: um modelo de programação genética que servirá de inteligência para os predadores capturarem a presa.

A linguagem de programação utilizada foi JAVA (versão 1.7), associada ao ambiente de desenvolvimento IDE NetBeans 7.3. A aplicação criada constitui-se de classes, fora as auxiliares, que estão divididas em três subgrupos: Ambiente, Simulação e Evolução, sendo que os dois primeiros referem-se exclusivamente ao problema presa-predador, e o terceiro representa a programação genética, a qual irá interagir com os demais subgrupos.

4.1 AMBIENTE DE SIMULAÇÃO PRESA-PREDADOR

Assim como descrito, o ambiente que simula o problema presa-predador possui os subgrupos Ambiente e Simulação. O primeiro define as características do plano (ou mundo) onde se encontrarão a presa e os predadores, e o segundo é responsável por fazer a interação dos personagens no mundo.

(39)

39

O Ambiente é definido pela classe denominada Mapa, onde cada instância possui como parâmetros para inicialização uma largura x e uma altura y do plano e o seu tipo (toroidal ou limitado). Há ainda métodos auxiliares que “escutam” o ambiente, retornando quando a presa foi capturada, ou que não permitam dois personagens se colocarem numa mesma posição, dentre outros.

Nesse subgrupo também estão as classes: “Personagem”, que é uma abstração para as classes “Predador” e “Presa”, e também a classe “Acao”, que define quais os movimentos possíveis de um personagem.

A classe “Predador” é uma extensão de “Personagem” e representará os predadores que serão programados através da evolução realizada pela programação genética. Um detalhe importante é que para ser instanciado, um predador deve receber como parâmetro uma árvore de expressões, a qual será gerada da programação genética. Nesta aplicação todos os predadores recebem a mesma inteligência.

Já as classes “PresaParada”, “PresaRandom” e “PresaFoge”, que também estendem a classe “Personagem”, representam cada uma um tipo de presa, sendo respectivamente a presa que fica parada em alguma posição do mundo, a presa que anda de forma aleatória pelo plano, e a presa dotada de certa inteligência, fugindo do predador mais próximo a ela.

A classe “Acao” Basicamente constitui-se de uma lista enumerada de ações com três parâmetros definidos: o código da ação, o seu movimento na coordenada x e o seu movimento na coordenada y. A Tabela 4.1 ilustra as possíveis ações.

Tabela 4.1 - Representação das ações possíveis de um personagem no mapa.

Movimento do personagem Código Deslocamento na coordenada x Deslocamento na coordenada y Nenhum 0 0 0 Norte 1 0 1 Sul 2 0 -1 Oeste 3 -1 0 Leste 4 1 0

O subgrupo Simulação é definido pela classe “Simulacao”, sendo responsável por interagir os personagens com o mapa através de suas ações.

Uma simulação é composta por rodadas, onde uma rodada concluída significa que todos os personagens do mapa foram processados e já possuem a informação de qual será o seu

(40)

40

próximo movimento. Vale lembrar que esse processamento ocorre um de cada vez, mas o movimento dos personagens sempre ocorrerá de forma conjunta. Ao iniciar uma simulação deve ser informado como parâmetro a quantidade máxima de rodadas a serem processadas, definindo um prazo para que os predadores capturem a presa. Além disso, também serão necessários parâmetros como o tamanho do mapa e se o mesmo será toroidal ou limitado.

Há casos onde a simulação pode gerar uma situação onde a programação dos predadores indique que todos devam ficar parados. Caso o número de rodadas não ter finalizado e em x rodadas todos predadores ficaram parados, a simulação é finalizada por timeout, ou seja, os predadores não alcançaram o seu objetivo.

Dentro da classe “Simulacao” existem alguns métodos que servirão de auxílio para a programação genética, como por exemplo, qual o estado da simulação (se finalizada por

timeuout ou pela captura da presa). Tais métodos irão fornecer informações para que a

programação genética possa avaliar os indivíduos de suas populações.

Outra informação importante que a simulação fornece à programação genética é a posição dos personagens no ambiente. Ela pode ser absoluta ou relativa, onde a primeira define a coordenada de cada personagem em relação ao plano. A segunda define a posição relativa de cada predador em relação à presa, sendo que esta é definida como a origem (0,0).

4.2 EVOLUÇÃO

O subgrupo Evolução será o responsável por executar toda programação genética presente na aplicação. Ele possui as classes “Individuo” e “Evolucao”, sendo que a primeira é necessária para representar os indivíduos da população que serão submetidos à programação genética, representada pela segunda classe.

Nesse subgrupo serão descritas todas as etapas da evolução dos indivíduos, desde a criação da primeira população, passando pelos operadores genéticos e finalmente chegando ao indivíduo ideal. Tal indivíduo será o programa que controlará os quatro predadores presentes no ambiente de simulação. Vale destacar que a inteligência gerada pela PG é a mesma para os quatro predadores.

4.2.1 Indivíduos

A população de indivíduos é o ponto inicial da programação genética. Sendo assim, a representação deles tem de ser bem definida para o problema em questão, de modo a ser eficaz

(41)

41

e mais eficiente possível. Isso é necessário para garantir a maior variabilidade de soluções no espaço de busca. Como já descrito, a programação genética evolui programas de computador, sendo eles representados por indivíduos. Cada indivíduo então é uma árvore de derivação, contendo a inteligência dos predadores para a captura da presa.

Na construção do programa, foram analisadas operações que seriam relevantes para possibilitar que os predadores pudessem interagir no ambiente em busca do objetivo. Como a representação é feita em forma de árvore, foi necessária a criação de classes que representam operações de controle de fluxo (CASE), de relação (EQUAL, GREAT e LESS) e lógicas (AND).

A operação CASE será sempre o nó raiz da árvore, sendo que tal operação não pode se repetir, para que não sejam criados indivíduos muito complexos. Cada CASE deverá conter três parâmetros: uma lista de condições a serem executadas, uma lista de alternativas para cada um desses testes, e um valor padrão (default) caso nenhuma condição tenha sido satisfeita. A lista de testes se utilizará das operações lógicas e de relação, onde as variáveis serão denotadas pelas coordenadas x e y dos predadores e da presa. Cada condição terá como alternativa, assim como o valor padrão, um movimento a ser realizado no mundo. Esse movimento é representado pelos valores da Tabela 4.1.

Os operadores de relação, como o próprio nome diz, verificam qual a relação entre as duas variáveis. Com isso, eles informação se uma variável é maior (GREAT) ou menor (LESS) que a outra ou se seus valores são iguais (EQUAL).

A operação lógica AND é responsável por adicionar mais uma condição em um índice já existente da lista de condições. Logo, ela recebe como parâmetro duas expressões para ser criada.

Para melhor representar a linguagem na qual o indivíduo utiliza, segue abaixo uma representação do mesmo, utilizando a gramática BNF (Backus-Naur Form):

<CODIGO> ::= <CASE>

<CASE> ::= <CONDIÇÃO><ALTERNATIVA><CASE> | <ALTERNATIVA> <CONDIÇÃO> ::= <EXPRESSÃO>

<EXPRESSÃO> :: = <OPER_LÓGICA>

<OPER_LÓGICA> :: = <OPER_REL> | <OPER_REL><OP_LÓGICO> <OPER_LÓGICA> <OP_LÓGICO> :: AND

<OPER_REL> :: = <VARIÁVEL> <OP_REL> <VARIÁVEL> <OP_REL> :: = > | < | =

<VARIÁVEL> :: = X1 | Y1 | X2 | Y2 | X3 | Y3 | X4 | Y4 | XP | YP <ALTERNATIVA> ::= 0 | 1 | 2 | 3 | 4

(42)

42

A evolução é iniciada com a criação de n indivíduos previamente informados como parâmetro, gerando uma população. Conforme Linden (2012), a população inicial deve ser o mais simples possível e criada de forma aleatória. Segundo a lei das probabilidades, dessa forma haverá uma distribuição que cobre praticamente todo o espaço de soluções, embora sem garantias do mesmo, visto que a população tem um tamanho limitado.

Um indivíduo então é criado da forma mais simples possível através do método

gerarArvoreReduzida, utilizando a expressão inicial CASE, que conterá apenas uma condição

e uma alternativa, e o valor padrão para a expressão inicial. A Figura 4.2 ilustra de um indivíduo criado inicialmente:

Figura 4.2 - Individuo gerado inicialmente de forma aleatória

4.2.2 Avaliação

Após gerada a população inicial, será dado início ao ciclo da evolução afim de gerar uma solução ao problema. A primeira etapa desse ciclo consiste na avaliação de cada indivíduo, verificando o quão próximo à solução ideal está a solução apresentada por ele.

Para ser realizada, a avaliação cria uma simulação, onde serão inseridos personagens em posições aleatórias no plano, sendo quatro predadores e uma presa. Os predadores receberão a inteligência gerada pela árvore sintática do indivíduo2 a ser avaliado. Feito isso, a simulação

2 Vale ressaltar quando mencionado o termo “personagens” (presa ou predador(es)), este refere-se ao problema

presa-predador. Enqaunto que os termos “indivíduos” e “população” referem-se à programação genética.

Fonte: Próprio autor.

(43)

43

iniciará e os predadores terão seu objetivo guiado pela inteligência. Quando a presa for capturada ou a simulação terminar por timeout, será possível medir a distância média dos predadores para com a presa. Esse valor será denominado de pré-fitness e será essencial ao cálculo do fitness de cada indivíduo.

Como as posições de presa e predadores são geradas aleatoriamente na simulação, fez-se necessário executar várias simulações utilizando a inteligência de um mesmo indivíduo. Isso é feito para ter garantias de que ao final o fitness demonstre verdadeiramente a qualidade do indivíduo. A operação é feita pela média aritmética simples do pré-fitness, onde seus valores serão somados a cada simulação e ao fim das cem simulações, divide-se esse somatório pelo número de simulações realizadas, obtendo-se o fitness do indivíduo.

Vale lembrar que por se tratar de uma evolução, dificilmente um indivíduo de uma geração inicial apresentará uma solução considerada boa, logo terá uma avaliação ruim. Mas é a partir desse mesmo indivíduo, sendo manipulado pelos operadores genéticos, que novos indivíduos surgirão com tendência à melhores avaliações.

4.2.3 Seleção

Concluída a etapa de avaliação, a população passará pelo processo de seleção onde os indivíduos com melhor fitness (nesse caso quanto menor o valor, melhor) terão mais chance de reproduzirem-se e passar suas características para as gerações seguintes.

O processo de seleção escolhido foi o torneio, o qual recebe um parâmetro k = 2, onde

k representa o número de indivíduos que serão sorteados para competirem diretamente entre si.

Dentre os sorteados, o que tiver melhor fitness será o selecionado. O torneio ocorrerá p-1 vezes, onde p representa o tamanho da população. A programação genética define que a população deve ter tamanho constante, contudo é selecionado um indivíduo a menos que o tamanho da população. Isso se deve ao fato do módulo de população utilizado, o qual será descrito posteriormente.

4.2.4 Crossover

A operação que visa simular a reprodução sexuada de indivíduos não foi implementada. Contudo propõe-se aqui uma maneira de fazê-la. Ao invés de efetuar a troca de subárvores dos indivíduos, seria feita a troca de alguma expressão de condição e de resultado entre os mesmos.

Referências

Documentos relacionados

TIPOS DE PROGRAMAS  INTERGERACIONAIS Quanto ao nível de interação (A) Nível 1 – Justaposição: grupos intergeracionais

Na SDME, alguns parâmetros devem ser avaliados para melhorar a eficiência de extração e a precisão da técnica, como quantidade de sal, volume da fase extratora,

As durações médias observadas para o quarto instar larval foram de 4,38; 5,17 e 4,53 dias (Tabela 7), quando as larvas foram criadas com ovos de A kuehniella e com os pulgões

Assim, considerando o potencial efeito neuroprotetor das estatinas em diferentes doenças do sistema nervoso central, o presente estudo tem como objetivo avaliar o efeito do

Este trabalho teve como objetivo principal estudar a influência de diferentes doses de radiação gama sobre a fécula de açafrão (Curcuma longa L.) e avaliar a sua

The identification of problems is the fuel for workers to reach a more ambitious goa1: the process elicitation. It is impossible for somebody to define a process that is

Em se tratando de situações críticas, como emergenciais ou atípicas, que extrapolem a capacidade operacional dos sistemas, ou ainda ocorrências

A receita, segundo informação local e histórica, chegou ao Brasil junto com os primeiros colonizadores da ilha (portugueses e franceses), espalhando-se pela microrregião