3.2 EXEMPLO DE USO
3.2.4 Acompanhando a simulação
Após todas as configurações desejadas no ecossistema, o usuário seleciona a opção de acompanhar simulação, que exibe uma tela onde ele poderá assistir a vida da população habitante do ecossistema local (Figura 18). A princípio a simulação está em modo de pausa, e nada acontece.
Também não existem alimentos nem indivíduos no ecossistema, mas o usuário pode facilmente adicionar indivíduos e alimentos aleatórios, clicando nos botões de controle no painel direito. Assim que o usuário clica no botão play, a simulação é iniciada – ou seja – os indivíduos começam a se locomover, alimentar, reproduzir, envelhecer e morrer.
Figura 17: Configuração de conexões Fonte: Autor (2010).
A simulação prossegue, podendo ser paralisada a qualquer momento clicando-se no botão pause. É possível acompanhar os indivíduos por observação geral, ou clicado-se sobre um indivíduo para ver detalhes do mesmo. Novos indivíduos frutos de reprodução surgem na simulação no mesmo local de um de seus parentes, indivíduos imigrantes provenientes do norte aparecem no mapa na região norte, no centro latitudinal.
Figura 18: Simulação em andamento Fonte: Autor (2010).
A partir dessas interações e dos comportamentos dos indivíduos, espera-se que a simulação, após conseguir um conjunto de indivíduos aptos a sobreviver – o que nem sempre é simples de acontecer – realize a emersão de comportamentos e de iterações diversos.
4 CONCLUSÃO
O princípio do projeto Ambiente distribuído para simulação de vida artificial preparou os fundamentos para o desenvolvimento de um sistema computacional distribuído de vida artificial, utilizando algoritmos evolutivos. Nesta etapa inicial, no processo de fundamentação teórica foram estudados os conceitos: vida, teoria da evolução, interações entre indivíduos em um ecossistema, vida artificial, algorítimos genéticos, simulação de ecossistemas complexos com algoritmos genéticos, paralelismo, sistemas distribuídos e, trabalhos similares.
Com base nesses conceitos, elaborou-se uma abstração simplificada de como a vida pode ser representada digitalmente e também a abstração de como poderiam se dar as interações dos indivíduos em um simulador. Dessas abstrações definiu-se os casos de uso, os diagrama de classes, e todos os artefatos que compuseram o planejamento da implementação do sistema.
A implementação foi realizada utilizando algumas bases dos algoritmos genéticos, mas não de maneira total, pois os algoritmos genéticos não visam simulações e sim buscas estocásticas de soluções de problemas. Com isso, considera-se o presente projeto como um trabalho inspirado em algoritmos genéticos. O desenvolvimento do sistema apresentou diversos desafios, o primeiro foi a escolha de quais técnicas utilizar e a adaptação destas já bem conhecidas e difundidas técnicas de algoritmos genéticos para um modelo de simulação. Depois de criar um sistema simulável, outro grande desafio da implementação foi a paralelização dos indivíduos que habitam um ecossistema.
Essa adequação do sistema exigiu um grande estudo em técnicas de paralelismo, e um grande trabalho de refatoração do sistema, para que ele viesse a suportar esse modelo de interação entre os indivíduos. Alguns casos de concorrência sobre estruturas de dados utilizadas na simulação se mostraram extremamente difíceis de resolver sem prejudicar as características predeterminadas da simulação.
Como o objetivo do sistema é tornar-se um simulador a fim de que futuramente possa ser explorado por outros pesquisadores, e como em algoritmos genéticos existem diversas implementações para seleção de parceiros e para os operadores genéticos, no decorrer da
implementação adicionou-se características de acoplamento fraco entre os indivíduos e os algoritmos que eles utilizam, através dos padrões de projeto: Factory (Fábrica), e Strategy (Estratégia). Com isso, o simulador que atualmente utiliza o método de roleta viciada, e o método de corte em dois pontos, para as ações de seleção de parceiros e recombinação genética respectivamente, já possui implementados outros métodos (torneio para a seleção e corte de um ponto para recombinação) e permite que, facilmente, outros diversos métodos sejam adicionados ao sistema no futuro.
Para a implementação da interface do usuário utilizou-se o conjunto de ferramentas de interface swing, sendo digna de nota a confecção da tela de simulação, que consiste em representar os indivíduos e alimentos, em tempo real para que o usuário do sistema posso assistir conforme eles surgem, morrem ou se movimentam. Neste ponto, a representação gráfica do fenótipo dos indivíduos mostrou-se muito interessante, por possibilitar uma rápida identificação de semelhanças ou diferenças na população.
No que tange a comunicação entre os sistemas, havia sido planejado originalmente a utilização da técnica RMI, mas devido à necessidade de um servidor de webservices em cada ecossistema essa técnica foi descartada. A segunda técnica utilizada foi a de comunicação via socket, com a vantagem de uma melhor performance, mas com a desvantagem da necessidade de criação de um elaborado protocolo para a comunicação. Por fim, optou-se por utilizado o protocolo XMPP – um protocolo extensível que é utilizado para comunicação de sistemas, mas também para a redes de mensagens instantâneas – o que trouxe ao desenvolvimento uma enorme facilidade para a implementação da comunicação entre os ecossistemas, fazendo efetivamente o sistema ser distribuído no modelo de ilhas. A comunicação é simples e é possível um observador se comunicar com um ecossistema através de um cliente de mensagens instantâneas que suporte o protocolo XMPP. Para a transmissão de dados complexos, foi utilizada a biblioteca xstream-1.3.1, que se encarrega da serialização de objetos para XML e da desserialização do XML para objetos.
O processo de comunicação entre os ecossistemas passou por um vasto processo decisório durante o desenvolvimento do sistema, pois existem inúmeros meios de se definir as regras de
comunicação e nenhum do métodos seria de agrado a todos os futuros experimentadores. A título de exemplo, a comunicação pode ser de duas vias (permitindo ida e volta) ou de mão única, obrigando a configuração da mesma ligação em dois ecossistemas para que haja ida e volta – optou-se pelo segundo formato pois dá mais flexibilidade. Uma lateral do ecossistema poderia receber indivíduos de um ou de vários ecossistemas, optou-se por vários por ser mais abrangente. Esses indivíduos podem entrar em um local fixo do mapa, proporcional à altura por onde saíram, randomicamente em qualquer altura, ou em uma faixa determinada da lateral. Optou-se pela entrada centralizada devido à sua simplicidade. A distância dos indivíduos que entram, da lateral de onde eles se originam pode ser zero, ou eles podem entrar afastados da lateral. Optou-se pelo afastamento em 10% do tamanho da largura do ecossistema, a fim de evitar indivíduos que vão e voltam a cada turno pois eles não participam efetivamente da simulação, e trazem sobrecarga à comunicação. Os ecossistemas que se comunicam podem ter tamanhos variados ou tamanhos idênticos. Optou-se pelos tamanhos variados pois assim é possível fazer uma simulação que contemple o primeiro cenário – todos com tamanhos iguais – bastando para isso configurá-los assim. E, por proporcionar ainda a flexibilidade de experiências de ecossistemas vizinhos com tamanhos variados – uma alusão ao mundo real onde ilhas de tamanhos diferentes são vizinhas – sendo que com estes tamanhos variados, possivelmente pode ocorrer a emersão de comportamentos diferenciados aos observados em uma simulação onde todos os ecossistemas possuem o mesmo tamanho.
Percebe-se que a maior parte da implementação do sistema não é visual, não possuindo telas, é a porção do sistema que permite que os indivíduos interajam entre si e com o ecossistema ao seu redor, de maneira que essas ações tragam uma semelhança com o mundo real, além das implementações que são responsáveis pela configuração, comunicação, e paralelismo do sistema.
Uma das dificuldades encontrada no desenvolvimento do sistema foi o fato de que em algumas partes do sistema, por serem intrinsecamente estocásticas, não foi viável a aplicação de testes unitários. Com isso em momentos de grandes refatorações do código não havia garantia que este novo código unitariamente estava funcionando, sendo necessários testes de uso, para garantir a integridade lógica de componentes previamente desenvolvidos. Por outro lado, uma técnica que facilitou significativamente o desenvolvimento e a refatoração de código foi a utilização da técnica
clean code (código limpo), por permitir trabalhar sempre em um código compreensível à leitura sem a necessidade de comentários, de acordo com padrões ágeis de desenvolvimento de software.
Realizando um resgate dos objetivos do projeto vemos que, sendo o objetivo geral
“desenvolver um ambiente distribuído para a simulação de vida artificial inspirado nos algoritmos genéticos, onde estejam implementadas técnicas de interação dos indivíduos entre si e também entre o indivíduo e o ambiente no qual ele está inserido”, podemos considerar como um objetivo plenamente atingido. Avaliando os objetivos específicos, notamos:
Pesquisar as técnicas envolvidas na teoria dos Algoritmos Genéticos: Na primeira fase do projeto executou-se uma vasta pesquisa a respeito de algoritmos genéticos, e através dela foi possível identificar alguns componentes básicos que unidos, permitem que os algoritmos genéticos tenham sucesso como método de busca estocástico. Os componentes de um algorítmo gen[éticos são descritos na seção “2.6 Algoritmos genéticos, do presente trabalho”.
Pesquisar as diferentes técnicas aplicáveis a cada camada de um Algoritmo Genético:
Dentro de cada um dos componentes de um algoritmo genético foram identificadas diversas técnicas utilizadas. As técnicas utilizadas no presente trabalho são apresentadas na seção “2.6 Algoritmos genéticos”, para uma lista completa consulte o apêndice “Outras estratégias em algoritmos genéticos”.
Pesquisar alguns tipos de interações entre indivíduos em um ecossistema que sejam aplicáveis a um sistema de vida artificial: Na seção “2.3 Interações entre indivíduos em um ecossistema” são descritas diversas interações que ocorrem no mundo real, sendo que para todas elas há possibilidade de aplicação simplificada em simulações. Apenas algumas delas, no entato, foram implementadas no presente trabalho.
Pesquisar os conceitos e tecnologias necessários à implementação do sistema: O sistema tem em sua base, além de algoritmos genéticos, um conjunto de técnicas aplicadas. Entre elas podemos citar a execução de códigos paralelos e os sistemas distribuídos. Os conceitos utilizados na implementação do sistema são descritos no capítulo 2.
Pesquisar por frameworks e simuladores que possam contribuir para o projeto: Um conjunto grande de softwares foi avaliado durante a fase de busca por trabalhos similares, sendo que os trabalhos encontrados que apresentaram maior similaridade foram descritos na seção “2.10 Trabalhos similares”.
Determinar os requisitos exigidos pelo sistema: O requisitos do sistema foram elaborados e estão detalhados na seção “3.1.2 Requisitos”.
Realizar a modelagem conceitual do sistema: A modelagem conceitual foi elaborada incluindo casos de uso, diagramas de atividades e diagramas de classe, além da descrição geral do sistema. Essa descrição detalhada do sistema pode ser encontrada na seção “3.1 Modelagem conceitual do sistema” e, os diagramas de classes pode ser encontrados no apêndice “Diagrama de classes”.
Implementar o sistema: O sistema foi implementado em linguagem Java, seguindo os requisitos e regras de negócio definidos na modelagem conceitual. Uma descrição do processo de desenvolvimento pode ser observada no presente capítulo “4 Conclusão”. Pode-se observar também um exemplo de uso, com imagens e a descrição do sistema implementado na seção “3.2 Exemplo de uso”.
Testar e avaliar a implementação do sistema: Ao fim da implementação, um conjunto de simulações foi realizado, visando testar e validar o sistema desenvolvido. Essa validação foi importante não somente por revelar defeitos, mas também por expôr diversos detalhes onde foram necessários alguns ajustes para que houvesse equilíbrio nas simulações – como exemplo pode-se citar o a relação entre o volume de alimentos que um ecossistema gera e o tamanho do ecossistema simulado, já que apenas a velocidade de intervalo entre as gerações de alimento é configurável.
Executar experiências de Vida Artificial utilizando o software implementado: Já durante a fase de teste e validação do sistema, foi possível observar diversas simulações. Após a finalização dos testes foram rodadas outras simulações onde foi possível observar alguns dos comportamentos emergentes nas populações simuladas. O presente trabalho não tem foco em uma vasta experimentação, nem abrange a análise de resultados das simulações, mas é importante citar que foi possível observar alguns comportamentos emergentes nas populações simuladas.
Documentar o desenvolvimento e os resultados do sistema: Todo o processo de pesquisa, planejamento, e implementação são descritos no presente trabalho.
Dessa forma, tendo em vista a análise dos objetivos, podemos considerar em uma revisão geral do projeto que seus objetivos foram alcançados conforme previamente concebidos. Com o presente software, acredita-se ser possível a observação de resultados de simulações com contribuições significativas às análises de ecossistemas, evolução, competição, e inteligência artificial como um todo. Além disso com a boa separação de conceitos no código e adição de componentes de acoplamento fraco, o simulador é de fácil extensibilidade de código, permitindo que pesquisadores o utilizem, estendam, e busquem a emersão de novos comportamentos e padrões, ou efetuem testes de hipóteses sobre evolução, competição e interação entre indivíduos de uma população.