Relatório de Iniciação Tecnológica
Vida Artificial e Transporte Coletivo
Lucas Freitas Teixeira, aluno
Pedro de Souza Asad, aluno
Eduardo Bezerra da Silva, orientador
17 de agosto de 2009
,_
_,
’.__.’
’-,
(__)
,-’
’._ .::. _.’
_’(^^)’_
_,‘ ‘>\/<‘ ‘,_
‘ ,-‘ )( ‘-, ‘
| /==\ |
,-’ |=-| ’-,
)-=(
\__/
1
Resumo
Este presente projeto de pesquisa envolve investigação em Vida Artificial. Em particular, esse estudo tem o objetivo de analisar o comportamento
de transporte de presas por criaturas simples (e.g., formigas) e como esse
comportamento pode ser simulado computacionalmente. Com esse objetivo, estamos desenvolvendo uma ferramenta computacional de simulação
de transporte coletivo. Essa ferramenta deve possibilitar a simulação em
computador de comportamentos de transporte coletivo de objetos por grupos de criaturas. Essa ferramenta se destina ao uso em ambiente de sala
de aula (por alunos de Biologia em variados nı́veis de ensino). Também
pode ser utilizada para complementar e auxiliar experimentos de pesquisa
desenvolvidos por biólogos e engenheiros, que estudam o comportamento de
transporte coletivo.
Palavras-chave: vida artificial, sistemas emergentes, simulação e modelagem computacional, desenvolvimento de software, transporte coletivo
1
Sumário
1 Introdução
3
2 Metodologia
2.1 Aplicativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Linguagens, ferramentas e padrões utilizados . . . . . . . . . . . . .
4
4
4
3 Ambiente
6
4 Formiga
7
4.1 Comportamentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
4.2 Trilhas de feromônio . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.3 Volta ao ninho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5 Variáveis do programa
14
6 Formatos de arquivos
6.1 Entrada da simulação . . . . . . . . . . . .
6.1.1 <simulation> . . . . . . . . . . . .
6.1.2 <variables> . . . . . . . . . . . . .
6.1.3 <environment> . . . . . . . . . . .
6.1.4 <animation> . . . . . . . . . . . .
6.2 Saı́da da simulação . . . . . . . . . . . . .
6.3 Transformando a saı́da em outros formatos
6.3.1 <report> . . . . . . . . . . . . . .
16
16
16
16
19
20
21
22
22
.
.
.
.
.
.
e
.
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
gráficos
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7 Experimentos
26
Referências
47
2
1
Introdução
A Vida Artificial é uma sub-área da Computação Bioinspirada e é a abordagem
que utilizamos para reproduzir o comportamento de transporte coletivo em formigas. “A Computação Bioinspirada estuda técnicas de computação inspiradas na
Biologia. [. . . ] A computação Bioinspirada tem por objetivo construir sistemas
computacionais semelhantes a seres vivos (utilizando conhecimento das ciências
biológicas) e utilizar tais sistemas para melhorar nosso entendimento da Biologia
e da Natureza.” [?]
Outra área da Computação Bioinspirada, a Inteligência Coletiva, se utiliza
constantemente do termo emergente para descrever como a atuação de um grupo
de agentes autônomos, que se comportam com base em regras simples, resulta
num comportamento coletivo complexo e capaz de se adaptar às circunstâncias
ambientais. Isso é particularmente útil na resolução de problemas NP-completo1 ,
como:
• Problema do caixeiro viajante (traveling salesman problem): dada uma lista
de cidades e as distâncias entre elas, achar o menor circuito possı́vel que
visite cada cidade uma única vez, sendo um circuito uma rota que comece e
termine na mesma cidade. [?]
• Roteamento multicast com variação de atraso limitada (multicast routing for
delay variation bound ): transmitir, da melhor maneira possı́vel, dados por
uma rede para diversos destinatários diferentes, de forma que a diferença
entre os atrasos para quaisquer dois destinatários não ultrapasse um limite.
Esse limite de variação de atraso é necessário, por exemplo, em transmissões
de vı́deo para vários destinatários onde é vantajoso para um usuário receber
informações contidas no vı́deo antes dos outros. [?]
1
Classe de problemas computacionais que não podem ser resolvidos em tempo polinomial.
Estes problemas geralmente apresentam tempo de solução exponencial ou fatorial em função
de suas entradas, dificultando a aplicação das soluções conhecidas a conjuntos de dados muito
extensos.
3
2
Metodologia
2.1
Aplicativo
A tela do programa é constituı́da de um painel onde a simulação é exibida, à
esquerda, uma fila de arquivos de simulação a serem executados, botões de controle
da execução (pausar, cancelar a simulação atual e cancelar todas as simulações da
fila) e mostradores onde são exibido o número da rodada da simulação atual, o
tempo passado desde o inı́cio dessa rodada e o tempo máximo permitido para cada
rodada dessa simulação.
Para iniciar uma simulação, o usuário deve adicionar pelo menos um arquivo
de simulação através do botão “Adicionar arquivo”. Arquivos indesejados podem
ser removidos pelo botão “Remover arquivo”. O botão “Processar em lote” pode
ser ativado ou desativado, e quanto ativo, faz com que ao terminar uma simulação,
o programa inicie a próxima simulação da fila.
Ao longo dessa seção (e do relatório), quando certa variável for descrita como
“um certo número” ou similar, isso é feito pois esses números podem estar definidos no arquivo de simulação (quando não estão, o aplicativo designa números
padrões). Além disso, a maioria desses números não são definidos exatamente;
são definidos parâmetros para uma certa distribuição estatı́stica, sendo o número
calculado durante a simulação. Para mais informações sobre as variáveis, consulte
a seção “Variáveis do programa”.
Quando a simulação começa, um certo número de formigas sai do ninho a procura de alimento. São desenhados as formigas, o ninho (um cı́rculo branco), uma
folha (um cı́rculo verde preenchido) e os blocos de feromônio no chão (quadrados
brancos que são preenchidos de tons de amarelo quando há feromônio neles).
2.2
Linguagens, ferramentas e padrões utilizados
Inicialmente, pensamos em fazer um modelo simples na linguagem NetLogo2 , por
ser de fácil aprendizado, já ter a parte gráfica pronta (tanto a tela mostrando as for2
O NetLogo é uma linguagem de programação simples e adaptada à modelação / simulação
de fenômenos naturais e/ou sociais
4
migas se movimentando, quanto a tela para alterar as configurações do ambiente),
e porque a linguagem é orientada a agentes. As ”turtles”, os agentes do NetLogo,
rodam concorrentemente, e isso facilitaria a implementação das formigas.
Posteriormente descobrimos que o NetLogo, entre seus vários modelos de exemplo, possui uma simulação de formigas buscando alimento. Estudamos o modelo,
bem simples, em que as formigas saem do ninho e se guiam por feromônio. [?]
Acabamos desistindo do NetLogo, pois a linguagem é muito limitada.
Trocamos para Java, pois era uma linguagem de conhecimento dos três – orientador e orientados –, utilizada no projeto de Iniciação Tecnológica anterior. Além
disso, Java possui uma enorme variedade de APIs 3 de qualidade disponı́veis –
uma boa parte delas, de licença livre ou gratuita para uso acadêmico. De fato, a
versão presente do programa utiliza as bibliotecas:
• Colt: desenvolvido pelo CERN (European Organization for Nuclear Research), é um conjunto de bibliotecas para realizar computação cientı́fica e
técnica de alta performance, em Java. Possui uma vasta quantidade de
funções, além da utilizada no nosso programa: gerar números aleatórios utilizando distribuições de probabilidade. [?]
• Processing: utilizado para desenhar as o ambiente e as formigas na tela. [?]
• Apache Xerces: conjunto de ferramentas para analisar arquivos XML. Utilizado no nosso programa para ler os arquivos de configuração das simulações.
[?]
Utilizamos o IDE4 Netbeans, escolhido por familiaridade de ambos os alunos e
por ter um construtor de interfaces gráficas simples de usar, o Swing GUI Builder.
A configuração dos parâmetros de simulação é feita através de arquivos XML5 ,
segundo a sintaxe definida no arquivo input.dtd. Arquivos (Document Type Definition, ou Definição de Tipo de Documento) definem regras de formação de arquivos
XML, especificando quais entidades são opcionais, quais são obrigatórias, o que
podem e devem conter e também a ordem em que devem aparecer.
Desenhamos a tela utilizando o Swing, biblioteca padrão do Java para construir interfaces gráficas. Construir interfaces não-triviais com o Swing torna-se
rapidamente trabalhoso e demorado, então utilizamos a ferramenta presente no
NetBeans que permite construir interfaces movendo os elementos (botões, caixas
de texto etc) na tela até o local desejado.
Para desenhar o ambiente (formigas, ninho, folha, feromônios) na tela, utilizamos a API do Processing, por sua simplicidade e novamente por termos, os
três, domı́nio sobre a ferramenta, utilizada em aulas do curso técnico ministradas pelo professor orientador. O Processing permite desenhar facilmente formas
3
Application Programming Interface é um nome comumente empregado para designar bibliotecas de programação, que são pacotes de rotinas computacionais dedicados a mascarar os
detalhes de operações complexas, oferecendo uma interface simples para acessar os serviços.
4
Integrated Development Environment, ou Ambiente de Desenvolvimento Integrado, é um
programa que fornece ferramentas para apoiar o desenvolvimento de software, tornando este
mais rápido do que seria utilizando ferramentas separadas. Possui editor de texto, compilador,
depurador, entre outras ferramentas, integradas em um mesmo programa.
5
XML, do inglês eXtensible Markup Language, é uma linguagem de marcação recomendada
pela W3C (World Wide Web Consortium, a principal organização de padronização da Internet)
para a criação de documentos com dados organizados hierarquicamente, tais como textos, banco
de dados ou desenhos vetoriais. A linguagem XML é classificada como extensı́vel porque permite
definir os elementos de marcação, criando-se uma linguagem de marcação para fins especı́ficos.
5
geométricas na tela, e torna as operações de nı́vel mais baixo (desenhar cada pixel,
limpar a tela etc) transparentes ao programador.
Uma vez que simulações tenham sido rodadas, seus dados são gravados em
arquivos properties, no diretório output. Como o formato dos arquivos só é comumente usado em aplicações Java, fizemos o programa auxiliar Ants-Report.jar,
que pode ser utilizado para coletar dados relevantes e gravá-los em formatos mais
úteis. Na versão atual, há duas maneiras de processar os dados: arquivos CSV6 e
gráficos gerados pelo gnuplot, uma ferramenta para geração de gráficos de funções
e dados interativa e orientada a linha de comando [?].
3
Ambiente
Folhas são o único tipo de presa implementado. Embora o simulador tenha sido
projetado para suportar múltiplas folhas, os módulos de coleta e processamento
de dados só suportam uma presa por ecossistema.
Um dos maiores problemas que enfrentamos no projeto foi simular um ambiente contı́nuo (a realidade) em um sistema discreto (pixels, números de ponto
flutuante). Dentro desse problema, está o de simular os processos fı́sicos. Procuramos em vão uma API pronta para lidar com o nosso caso especı́fico: fı́sica
em duas dimensões, vista de cima. A grande maioria das APIs que encontramos
estava em uma dessas duas categorias: ou era 2D, mas vista de lado como um
videogame de plataforma, ou era 3D, e para adaptá-la à nossa situação terı́amos
que simplesmente ignorar uma das dimensões, mas as curvas de aprendizado eram
impraticáveis para a duração do projeto.
A fı́sica, então, é toda feita por nós. É extremamente difı́cil simular colisões
(entre formigas, folhas e outros objetos) e contato com aplicação de força (quando
a formiga empurra/puxa uma folha). Os problemas foram encarados, respectivamente, permitindo somente uma folha por simulação e “prendendo” as formigas
à folha quando estas estão empurrando/puxando. Cada folha possui uma lista de
formigas que estão “agarradas” nela. A folha então calcula a força aplicada pelas
formigas e se move de acordo com ela, movendo também as formigas.
As folhas, que são sempre circulares, podem possuir ganchos. Os ganchos são
uma resistência à força aplicada pelas formigas em certas direções.
6
CSV é um formato simples para armazenar dados tabelares em arquivos texto. É suportado pela maioria das aplicações de planilha, como OpenOffice Calc e Microsoft Excel. Em
arquivos CSV, os dados em uma linha são separados por vı́rgulas. Todas as linhas devem ter o
mesmo número de elementos, como em uma tabela. Tudo entre um par de vı́rgulas, incluindo
espaçamento, faz parte do campo. Embora existam diferentes implementações deste formato,
cada uma com certas regras, o IETF – Internet Engineering Task Force – possui um documento,
o RFC4180[?], que descreve o formato para uso em correio eletrônico e este é o padrão utilizado
pelo programa.
6
Um gancho tem três parâmetros: um vetor principal, um ângulo de influência
e um valor limite do módulo de influência no extremo do arco.
Quando a força aplicada pelas formigas tem a mesma direção e sentido do vetor
principal, a força de resistência do gancho tem módulo igual ao do vetor principal.
Quando a força aplicada pelas formigas se encontra dentro do arco de influência, a
força de resistência é proporcional ao ângulo formado pela força aplicada e o vetor
principal, até o limite, quando esse ângulo é igual ao ângulo de influência.
A implementação dos feromônios foi feita dividindo o solo em blocos quadrados
de mesmo tamanho. Cada bloco desses é considerado um “átomo”, no sentido que
é definida uma quantidade de feromônio presente no bloco inteiro, e o decaimento
de feromônio é feito em todo o bloco também, bem como as formigas decidem para
qual bloco devem caminhar de acordo com o nı́vel de feromônio do bloco.
O solo, cujas dimensões são dadas em centı́metros, é segmentado em vértices
de acordo com o parâmetro Ecosystem.gridDensity. Esta variável de entrada,
que pode assumir os valores 1, 2 ou 3, determina quantas divisões um centı́metro
causa na matriz de vértices. Assim, quando Ecosystem.gridDensity assume o valor
1, cada centı́metro quadrado equivale a um vértice, quando assume o valor 2, cada
centı́metro quadrado contém 4 vértices e com o valor 3, 9 vértices por centı́metro
quadrado.
Quando uma formiga deposita feromônio em um bloco, a parte do programa
que controla o solo (classe Ground ) adiciona a quantidade de feromônio depositada
a uma matriz NxM, correspondente aos NxM blocos de feromônio. Com o tempo,
esse feromônio vai decaindo (a quantidade de feromônio é decrescida por uma
porcentagem definida por uma constante de decaimento), até chegar a um limite
no qual a quantidade de feromônio é considerada zero (isso foi feito para impedir
que resı́duos desprezı́veis como 0,0000000023 fossem levados em conta na hora dos
cálculos).
4
Formiga
Cada formiga é um agente, no sentido em que ela recebe entradas do ambiente
e como resposta, executa ações. Achamos adequado então procurar alguma API
para o Java que abstraisse a implementação interna dos agentes, e nos economizasse
tempo.
Depois de alguma busca na Internet, achamos o JADE, uma biblioteca de
programação em Java que possibilita a aplicação da Programação Orientada a
Agentes. Seguiu-se um grande aprendizado da utilização do JADE. Analisamos o
trabalho de conclusão de curso de um aluno do CEFET, Fabiano, que consistia
7
em um sistema de gerenciamento de sinais de trânsito, e utilizava JADE. Fizemos
uma versão inicial do nosso simulador de formigas, pra testar as capacidades do
JADE, mas tivemos muitos problemas. O JADE possui um mecanismo de troca
de mensagens entre os agentes muito complexo, e é extremamente difı́cil trabalhar
com os agentes sem ser por troca de mensagens. Isso não nos era útil, pois a
comunicação entre formigas é baseada somente em estigmergia7 .
Decidimos então que implementarı́amos nossos agentes do zero. Depois de
alguns modelos malsucedidos, implementamos nossos agentes como Máquinas de
Estado Finito, que executam comportamentos como “vagar”, “tentar puxar presa”,
“chamar ajuda” etc. Fizemos essa escolha por tornar o código-fonte mais claro e
fácil de manter, uma vez que os comportamentos são como módulos independentes entre si. Também se torna mais fácil mostrar como a formiga se comporta,
através de uma ilustração descrevendo visualmente a máquina de estado finito e
as transições entre os estados.
4.1
Comportamentos
• Seeking - Comportamento inicial. É neste estado que as formigas deixam o
ninho inicialmente e partem em busca de presas. Se a formiga fareja uma
trilha de feromônios, ela possivelmente segue essa trilha inteira, segue por
apenas um trecho ou a ignora completamente. Formigas com altos valores
de independência tendem a ignorar trilhas completamente e formigas com
valores baixos tendem a segui-las. É esperado que uma boa distribuição dos
valores de independência em um formigueiro gere uma população equilibrada,
que consiga eventualmente achar caminhos alternativos cada vez mais curtos
para uma presa. Ao avistar uma presa, a formiga passa imediatamente para
o comportamento Approching. A formiga busca presas até uma distância
máxima, sua audácia. Após essa distância, se a formiga não tiver encontrado presa alguma, ela vai para Returning. Para mais informações sobre
7
Estigmergia é uma comunicação não-verbal auto-ajustável e indireta realizada através do
meio ambiente. Vestı́gios ou estı́mulos fı́sicos ou quı́micos são gerados por um agente como
consequência de suas ações e são percebidos pelo mesmo agente ou por terceiros, influenciando
em suas ações.
8
o algoritmo utilizado na busca para seguir trilhas de feromônio, consulte a
seção “Formiga” → “Trilhas de feromônio”.
Variáveis utilizadas no comportamento:
– Ant.sight
– Ant.topSpeed
– Ant.initiative
– Seeking.audacity
• Returning - A formiga retorna ao ninho por um caminho melhorado em
relação ao caminho percorrido até o ponto em que ela decide retornar. Esse
caminho de retorno tende a ser menor que o caminho original invertido e o
quanto ele é melhorado depende da inteligência da formiga. Quanto maior o
valor da inteligência, mais aprimorado é o caminho de retorno.
Variáveis utilizadas no comportamento:
– Ant.sight
– Ant.intelligence
• Approaching - Neste comportamento, a formiga simplesmente se aproxima
da presa avistada e passa imediatamente para o estado Circumventing.
• Circumenventing - Este comportamento faz com que a formiga procure uma
posição “confortável”, isto é, a uma certa distância de outras formigas. Se
as formigas imediatamente à esquerda e à direita estiverem a uma distância
mı́nima ideal, ela passa prontamente para o comportamento Aligning, caso
contrário, contorna a presa até achar um posição que satisfaça essa condição.
Após certo tempo contornando a presa, se a formiga não encontrar posição
agradável, ela simplesmente pára no meio de duas formigas e passa para
Aligning.
Variáveis utilizadas no comportamento:
– Circumventing.insistance
– Circumventing.sociability
• Aligning - A formiga exerce força cresecente sobre a presa na direção do
ninho durante um certo intervalo de tempo. Após esse tempo, ela muda o
sentido de aplicação desta força e torna a aplicá-la com intensidade crescente.
Quando múltiplas formigas exercem esse comportamento simultaneamente,
a força alicada pode, eventualmente, ser suficiente para mover a folha em
direção ao ninho. Esta mudança de direção aumenta o tempo necessário
para que um grande número de formigas consiga mover uma presa, mas
torna o transporte eficaz na presença de obstáculos. Se a presa for movida a
formiga passa prontamente para o estado Carrying, se não, após certo tempo
de inércia, ela vai para o comportamento Redocking.
Variáveis utilizadas no comportamento:
– Aligning.angleTurn
– Aligning.chargeRate
9
– Aligning.exhaustion
– Aligning.firstCharge
– Aligning.tries
– Aligning.insistance
• Redocking - Semelhante a Circumventing, com a diferença que a condição
de exaustão não é o tempo e sim o comprimento do perı́metro da presa que
é contornado. Em pressas geometricamente complexas, posições diferentes
podem fornecer melhores resultados na movimentação, o que não é o caso
nesta implementação. De toda forma, esse comportamento dá tempo para
que outras formigas se unam ao transporte antes que ocorra desistência,
aumentando as chances de que um deslocamento em grupo seja conseguido.
O número de vezes que a formiga se reposiciona é limitado. Se este número
de reposicionamentos é esgotado, a formiga passa para Recruiting.
Variáveis utilizadas no comportamento:
– Circumventing.sociability
– Redocking.offset
• Carrying - Comportamento de transporte da presa. Neste estado a formiga
mantém a força que aplicava inicialmente sobre a presa. Há uma tolerância
em relação ao desvio de rota, pois o objetivo das formigas é levar a presa
na direção do ninho, mas se a tolerância em relação a desvios na direção
for zero, será virtualmente impossı́vel mover a presa. Por isso, cada formiga
tem uma certa tolerância e uma certa iniciativa em tentar corrigir a rota
através da mudança da aplicação de sua força, a partir de uma intensidade
menor que cresce gradativamente. Como os valores de tolerância e iniciativa
diferem, a rota é corrigida com relativa suavidade, implicando em raras vezes,
na parada do transporte devido à redução da força aplicada. E nos casos
em que isso acontece, é possı́vel que novas formigas se juntem ao grupo,
aumentando a estabilidade do transporte. Quando uma presa é entregada, a
simulação termina. Se o transporte for interrompido, passa-se prontamente
para o estado Aligning novamente.
Variáveis utilizadas no comportamento:
– Aligning.angleTurn
– Aligning.chargeRate
– Aligning.exhaustion
– Carrying.firstCharge
– Carrying.tolerance
• Recruiting - A formiga retorna ao ninho deixando um rastro de feromônios
pelo chão. A concentração do feromônio deixado depende da relação entre a
audácia da formiga e a distância percorrida até chegar à presa. O retorno até
o ninho é feito da mesma maneira que em Returning. Chegando ao ninho,
ela sinaliza para que novas formigas deixem o ninho e sigam sua trilha e
retorna a Seeking.
Variáveis utilizadas no comportamento:
10
– Ant.intelligence
– Seeking.audacity
4.2
Trilhas de feromônio
As formigas deixam o ninho em busca de presas (folhas). Um algoritmo de caminhada é aplicado sucessivas vezes até que uma presa seja encontrada ou a formiga
tenha se afastado uma distância máxima do ninho, dada por sua audácia. No primeiro caso ela agarra a presa e aplica força sobre a mesma na tentativa de movê-la
e no último caso ela retorna ao ninho.
A etapa de busca é baseada no algoritmo Ant System[?], originalmente aplicado
ao problema do caixeiro viajante[?]. Cada vértice percorrido pela formiga passa
a integrar uma lista de vértices denominada trajetória. A cada vértice atingido,
uma regra probabilı́stica de decisão é aplicada para escolher o próximo vértice. A
regra de decisão depende do feromônio presente nas redondezas e da orientação da
caminhada. Esta etapa de decisão é uma adaptação do modelo de construção de
solução do Ant System.
O caminho sk – também conhecido como solução parcial – percorrido pela
formiga k determina qual o conjunto N (sk ) de vértices que podem ser escolhidos
para compor a próxima etapa da caminhada. A probabilidade de que um certo
vértice em N (sk ) seja escolhido, dada por p(v, sk ), depende da atratividade deste
vértice em comparação aos demais vértice dos conjunto N (sk ). Essa probabilidade
p(v, sk ) é dada formalmente por:
p(v, sk ) =
τ (v, k)α · η(v, sk )β
X
[τ (u, k)α · η(u, sk )β ]
u∈N (sk )
Onde:
• sk é a solução parcial ou simplesmente o caminho já percorrido pela formiga
k;
• N (sk ) é o conjunto de vértices candidatos. Esse conjunto é formado por
todos os vértices adjacentes que não façam parte de sk .
• τ (v, k) é a soma da iniciativa da formiga k com a quantidade de feromônio
presente no vértice v no instante da decisão;
• η(u, sk ) é uma função heurı́stica de avaliação do vértice;
• α é o expoente que controla a importância do feromônio na escolha;
• β é o expoente que controla a importância da informação heurı́stica de um
vértice.
A função heurı́stica η utilizada aqui foi escolhida para tornar o padrão de
busca mais realista e eficaz, isto é, minimizar as mudanças súbitas de direção,
mas ainda assim permitir desvios. A função escolhida produz valores entre 0 e 1,
inclusive. Quando o único vértice presente em sk é o vértice de partida do ninho,
a função assume valor 1, pois todos os vértices ao redor são equiprováveis – isto
é, sem levar em consideração o feromônio depositados nestes vértices. A partir da
segunda escolha, dois ângulos passam a ser levados em consideração:
11
O ângulo θ entre o vetor deslocamento do vértice anterior ao vértice atual e o
vetor deslocamento do vértice atual ao vértice candidato. Se este ângulo for maior
que 90◦ , a função assume valor 0. Isso serve para eliminar a possibilidade de se
andar para trás e faz com que, a cada etapa, existam cinco escolhas possı́veis de
vértices: o vértice imediatamente à frente, dois a 45◦ e dois a 90◦ do deslocamento
anterior.
O ângulo φ entre o vetor deslocamento do ninho até o vértice atual e o vetor
deslocamento do ninho até o vértice candidato. À medida que a formiga se afasta
do ninho, as diferenças entre os diferentes φ de cada vértice candidato se tornam
menores, fazendo com que num primeiro momento haja maior tendência a deslocarse radialmente a partir do ninho, mas posteriormente, seja mais provável que curvas
mais abertas sejam realizadas.
A função η(v, sk ) é finalmente definida como:

π
π
1
 [(θ+1)·(φ+1)] se sk > 1 e θ ≤ 2 e φ ≤ 2 ;
η(v, sk ) =
0
se sk > 1;

1
if sk ≤ 1.
A implementação do algoritmo de caminhada do simulador difere do Ant System em alguns pontos chave:
τ (v, k) em Ant System é apenas a quantidade de feromônio associada ao vértice
v. Aqui, a adição da constante de iniciativa visa contornar os seguintes problemas:
no estado inicial do ecossistema não há feromônio qualquer depositado, por isso,
na ausência da constante de iniciativa, todos os vértices teriam probabilidade zero
de serem escolhidos e as formigas não se moveriam; além disso, se uma formiga
encontra uma presa e retorna ao ninho deixando um rastro de feromônio, todas as
formigas que retornam ao ninho percebem esta trilha; se esta constante não fizesse
parte do cálculo de probabilidades, todos os vértices que fizessem parte do conjunto
N (sk ) e não contivessem feromônio algum teriam probabilidade zero de serem escolhidos, o que impossibilitaria a descoberta de trilhas alternativas e faria com
que todas as formigas tivessem um comportamento previsı́vel. Adicionalmente, a
adição dessa constante traz alguns efeitos desejáveis ao comportamento das formigas: valores altos de iniciativa, sobrepujam o feromônio depositado, aumentando a
possibilidade de que vértices alternativos sejam escolhidos e novos caminhos sejam
trilhados; na ausência total de feromônios, o valor de τ (v, k) é idêntico para todos
os vértices, sendo assim, a informação heurı́stica η(v, sk ) é o único fator relevante
na escolha de um vértice, o que é desejável nas primeiras etapas de simulação.
η(u, sk ) em Ant System é o inverso da distância do vértice atual ao vértice v,
o que não faz sentido no contexto deste simulador já que praticamente todos os
vértices levados em consideração estão à mesma distância do vértice atual.
Outra etapa do Ant System é a atualização dos valores de feromônios, que
envolve duas ações:
• deposição de feromônio pelas formigas que já completaram o circuito.
• evaporação do feromônio previamente depositado.
Ambos foram também implementados neste simulador, com adaptações. A
taxa de evaporação, indicada pela variável ρ, representa a taxa de evaporação de
feromônio em unidades por segundo - em contraste com o Ant System, no qual ρ
é a taxa de evaporação em unidades por rodada – e é atualizada constantemente
12
pela thread (unidade de execução independente) que gerencia o ecossistema. A
deposição de feromônio também se processa de maneira bem diferente, visto que
ela é feita gradualmente à medida que a formiga retorna ao ninho e não de uma
única vez como no Ant System. Uma consequência disso é que o feromônio vai
evaporando à medida que é depositado e o feromônio tende a estar mais concentrado próximo ao ninho e menos concentrado próximo à presa. Isso aumenta a
possibilidade que a iniciativa sobrepuje o feromônio quando se chega mais perto da
presa, aumentando a quantidade de caminhos alternativos próximo à folha. Uma
quantidade de feromônio igual para todos os vértices do caminho até uma certa
folha é depositada por uma determinada formiga. A quantidade de feromônio depositada é dada por uma função de avaliação F (sk ) – também chamada de função
de adaptação – que julga o quão bom é o caminho. A função F (sk ) visa aumentar a atratividade de caminhos mais curtos, além de levar em consideração uma
estimativa do tamanho da presa encontrada. Ela é definida da seguinte maneira:
F (sk ) = 1 −
1
d(sk )
·
ak
δ · ik
Onde:
• d(sk ) é o comprimento do caminho sk .
• ak é a audácia da formiga k.
• δ é o diâmetro da folha encontrada.
• ik é a inteligência da formiga k.
A razão d(sk )/ak é tão maior quanto maior for a distância percorrida em relação
à distância máxima que a formiga está disposta a percorrer para encontrar uma
presa. Assim, para uma presa relativamente próxima, 1 – d(sk )/ak é um número
mais próximo de 1 do que de 0. Mas ainda assim, devido às configurações ideiais
e à natureza do caminhar, os valores se concentram mais próximos de 0 do que
de 1. Para contrabalançar este fato, introduz-se a razão 1/(δ · ik ), que constitui
uma estimativa do diâmetro da folha tão mais precisa quanto mais inteligente é
a formiga. O valor de feromônio calculado é, então, despejado sobre cada vértice
sobre o qual a formiga passa ao regressar ao ninho.
4.3
Volta ao ninho
Para calcular o caminho de retorno, nos comportamentos Recruiting e Returning,
dado o caminho original sk , percorre-se o caminho sk no sentido contrário ao de
construção do caminho. A cada vértice em que a formiga está posicionada, traçase um vetor v0 do vértice atual para um vértice de sk que seja o mais próximo
do vértice atual na ordem contrária da lista – o caminho seguro – e um vetor v1
do vértice atual para o ninho – o caminho perfeito. Então toma-se v2 , o vetor
diferença v1 − v0 . Multiplica-se v2 pela inteligência da formiga e soma-se v2 a v1 .
se a inteligência da formiga for máxima (1), o resultado será o caminho perfeito
e a formiga terá estimado um caminho de retorno otimizado ao máximo. Se a
inteligência for mı́nima (0), ela seguirá exatamente o mesmo caminho pelo qual
ela veio.
13
5
Variáveis do programa
Uma simulação possui diversos parâmetros / variáveis de entrada e alguns de
saı́da. Muitas das variáveis de entrada dizem respeito ao comportamento das
formigas, algumas dizem respeito ao ecossistema e outras ainda, à disposição da
presa. As variáveis de saı́da refletem, basicamente, tempos que foram necessários
para realizar uma tarefa e quantas formigas foram necessárias para fazê-lo.
Cada variável um nome único no sistema. Esse nome é hierárquico, no sentido de agrupar variáveis correlatas através de nomes semelhantes. No caso das
variáveis comportamentais, o nome é composto pelo nome da classe comportamental adicionado de um “.” e do nome especı́fico da variável. No caso das variáveis
da formiga, o “.” é precedido por “Ant”.
Variáveis de entrada:
• Ant.initiative – [0, 1]: Representa a iniciativa da formiga em tomar certas
atitudes. Essa variavél afeta dois comportamentos: Seeking e Carrying.
O padrão é uma distribuição normal com média 0.2 e desvio padrão 0.03,
delimitada entre 0 e 0.2.
• Ant.intellingence – [0, 1]: Precisão de estimativas e memória. Afeta três comportamentos: Aligning, Returning e Recruiting. O padrão é uma distribuição
normal com média 0,5 e desvio padrão 0.16.
• Ant.sight – ]0, +∞[: Raio de visão da formiga, em centı́metros. Afeta tão e
somente Seeking. Uma distribuição normal com média 2,5 e desvio padrão
0,2 é o padrão.
• Ant.topForce – ]0, +∞[: Força máxima que a formiga é capaz de exercer.
Afeta Aligning e Carrying. Uma distribuição normal com média 0.6 e desvio
padrão 0.1 é o padrão.
• Ant.topSpeed – ]0, +∞[: Velocidade máxima com a qual a formiga caminha.
Afeta Redocking, Seeking, Approaching, Routing e Circumventing. O padrão
é uma distribuição normal com média 1,7 e desvio padrão 0.2.
• Aligning.angleTurn – ] − ∞, +∞[: Ângulo de rotação da força (em sentido
aleatório) utilizado toda vez que a formiga resolve trocar a orientação da
mesma. O padrão é uma distribuição normal com média π/12 e desvio
padrão 0,5.
• Aligning.chargeRate – ]0, 1]: Taxa de aumento da força em unidades por
segundo. Toda vez que a formiga aplica a porcentagem de sua força inicial
dada por Aligning.firstCharge, essa é a taxa com que ela aumenta sua força
nos próximos segundos. O padrão é uma distribuição normal com média 0,3
e desvio padrão 0,1.
• Aligning.exhaustion – Z>0 : Número máximo de vezes que a formiga troca a
orientação da força antes de desistir ou trocar para Redocking. O Padrão é
uma distribuição poisson com média 3.
• Aligning.firstCharge – ]0, +∞]: Porcentagem da força máxima que a formiga
aplica na primeira tentativa e em cada uma das vezes subsequentes em que
muda a orientação da força. O padrão é uma distribuição normal com média
0,14 e desvio padrão 0,13.
14
• Aligning.tries – Z>0 : Número máximo de vezes que a formiga vai para um
comportamento de Redocking e volta para Aligning antes de passar para
Recruiting. O padrão é uma distribuição poisson com média 4.
• Aligning.insistance – ]0, +∞[: Tempo máximo durante o qual a formiga permance aplicando força na mesma direção. O Padrão é uma distribuição
normal com média 3 e desvio padrão 1.
• Carrying.firstCharge – ]0, +∞]: Porcentagem da força máxima que a formiga
aplica em cada uma das vezes em que muda a orientação da força para tentar
uma correção de rota. O padrão é uma distribuição normal com média 0,95
e desvio padrão 0,2. Esta variável é semelhante a Aligning.firstCharge, mas
deve ter média mais elevada, ou então as tentativas de correção de rota
resultarão em frequentes paradas do transporte.
• Carrrying.tolerance – ]0, +∞[: Ângulo máximo entre a trajetória em linha
reta até o ninho e a orientação da velocidade de transporte atual que a
formiga tolera sem tentar realizar uma correção. O padrão é uma distribuição
normal com média π/24 e desvio padrão 0,04.
• Circumventing.insistance – ]0, +∞[: Tempo máximo durante o qual a formiga circunda a presa em busca de uma posição confortável. O padrão é
uma distribuição normal com média 4 e desvio padrão 1.
• Circumventing.sociability – ]0, +∞[: Medida da distância mı́nima, em centı́metros,
das companheiras mais próximas para que a formiga se sinta confortável. O
padrão é uma distribuição normal com média 1,5 e desvio padrão 0,5.
• Redocking.offset – ]0, +∞[: Medida da distância mı́nima, em centı́metros,
que a formiga circunda a folha buscando uma nova posição. O padrão é uma
distribuição normal com média 1,5 e desvio padrão 0,5.
• Seeking.audacity – ]0, +∞[: Audácia da formiga. Medida da distância máxima
que ela se afasta do ninho em busca de presas. O padrão é uma distribuição
normal com média igual à diagonal do ecossistema e desvio padrão igual a
trigésima parte desta.
Variáveis de saı́da:
• Leaf.finding: Tempo necessário para encontrar a folha.
• Leaf.movement: Tempo necessário para mover a folha.
• Leaf.transporting: Tempo desde o achado da folha até a sua entrega.
• Leaf.delivery: Tempo necessário para entregar a folha desde o começo da
simulação (duração da simulação).
• Workers.delivery: Trabalhadores atuantes ao final do transporte da folha.
• Workers.movement: Trabalhadores necessários para causar a primeira movimentação na folha.
Leaf.delivery, Leaf.finding, Leaf.movement, Leaf.transporting, Workers.delivery
ou Workers.movement.
15
6
Formatos de arquivos
6.1
6.1.1
Entrada da simulação
<simulation>
Todo arquivo de configuração deve conter, obrigatoriamente a entidade simulation:
<s i m u l a t i o n>
[...]
</ s i m u l a t i o n>
Ela delimita o conteúdo de uma simulação e deve ser única em um arquivo.
Esta entidade possui quatro atributos possı́veis, sendo que apenas um deles é
obrigatório. Os demais, se não especificados, farão com que valores padrão sejam
adotados.
Atributos:
• threadInterval (opcional): intervalo de execução de threads em milissegundos (número inteiro). Partes do código que devem ser repetidas diversas
vezes em alta velocidade, devem sofrer uma pausa entre execuções sucessivas, para permitir que outros trechos de código também sejam executados.
Durante o desenvolvimento, indı́cios apontaram para a possibilidade de que
diferentes valores possam se adequar a diferentes processadores, no entanto a
hipótese não foi confirmada. Se as simulações tiverem um baixo desempenho,
recomenda-se testar valores diferentes aqui. O valor padrão é 10.
• timeout (opcional): tempo máximo (em segundos) para a execução da simulação. A simulação é encerrada após este perı́odo de tempo, caso não tenha terminado da maneira correta anteriormente. O valor padrão, 0, indica
que não há limite de tempo, a simulação rodará até que encerre normalmente.
O valor padrão é 0.
• rounds (opcional): número de vezes que a simulação será repetida, com
sucesso ou não. O valor padrão é 100.
• output (obrigatório): arquivo em que serão coletados os resultados da simulação
Exemplo:
<s i m u l a t i o n t h r e a d I n t e r v a l=” 20 ” timeout=” 300 ” rounds=” 250 ”
output=” . / output / 0 0 0 0 0 . t p f ”>
[...]
</ s i m u l a t i o n>
Essa entidade pode conter, nesta ordem, as entidade <variables>, <environment>
e <animation>. A primeira é opcional e as outras duas obrigatórias.
6.1.2
<variables>
A entidade <variables> perimite alterar os parâmetros comportamentais das formigas da simulação. Se não especificada, todas as variáveis comportamentais
assumem valores padrão. Ela não contém atributos, apenas sub-entidades. A
16
sub-entidade <aco> pode aparecer uma única vez; as sub-entidades <boundednormal>, <normal>, <poisson> e <uniform> podem aparecer diversas vezes e
em qualquer ordem, após <aco>.
Sub-entidades:
• <aco>
Altera os parâmetros do algoritmo utilizado no comportamento de busca
(Seeking). Todos os atributos são opcionais, então, a não ser que um deles
seja alterado, não faz sentido utilizar essa entidade, embora seu uso com
valores padrão não gere erro algum. Para mais informações sobre o algoritmo,
consulte a seção “Formiga” → “Trilhas de feromônio”.
Atributos:
– alpha (opcional): expoente alfa. O valor padrão é 1.0.
– beta (opcional): expoente beta. O valor padrão é 1.0.
• <normal>
Descreve uma variável aleatória gerada dentro de uma distribuição estatı́stica
normal.
Atributos:
– name (obrigatório): nome da variável. Pode conter um dos valores a
seguir: angleTurn, audacity, chargeRate, exhaustion, firstCharge, initiative, intellingence, insistance, offset, sight, sociability, topForce, tries,
topSpeed, tolerance.
– class (obrigatório): nome do comportamento. Pode conter um dos valores a seguir: Aligning, Ant, Carrying, Circumventing, Redocking, Seeking.
– mean (obrigatório): valor médio.
– deviation (opcional): desvio padrão. Se não especificado, o valor 1.0,
correspondente à distribuição normal padrão, é utilizado.
• <bounded-normal>
É utilizado para descrever uma variável de distribuição normal restrita a um
certo intervalo. Um conhecido resultado da estatı́stica, conhecido por “Regra
Empı́rica”, atesta que 99.7% dos valores em uma distribuição normal padrão
concentram-se entre menos três vezes o desvio padrão e três vezes o desvio
padrão, significando que todos os valores dentro de uma dirtibuição normal
estão dentro desta faixa, para fins práticos. Em alguns casos, na aplicação,
foi interessante que certas variáveis estivessem limitadas a intervalos, como
entre 0 e 1. É possı́vel utilizar <bounded-normal> com este fim. Se o
intervalo especificado for [a, b], então a média será o meio do intervalo, ou
seja, (a + b)/2 e o desvio padrão será a sexta parte deste intervalo, ou seja,
(b − a)/6. Valores produzidos aleatoriamente que caiam fora do intervalo
especificado serão ignorados.
Atributos:
17
– name (obrigatório): nome da variável. Pode conter um dos valores a
seguir: angleTurn, audacity, chargeRate, exhaustion, firstCharge, initiative, intellingence, insistance, offset, sight, sociability, topForce, tries,
topSpeed, tolerance.
– class (obrigatório): nome do comportamento. Pode conter um dos valores a seguir: Aligning, Ant, Carrying, Circumventing, Redocking, Seeking.
– min (obrigatório): limite inferior do intervalo.
– max (obrigatório): limite superior do intervalo.
• <uniform>
Descreve uma variável aleatória gerada dentro de uma distribuição estatı́stica
uniforme.
Atributos:
– name (obrigatório): nome da variável. Pode conter um dos valores a
seguir: angleTurn, audacity, chargeRate, exhaustion, firstCharge, initiative, intellingence, insistance, offset, sight, sociability, topForce, tries,
topSpeed, tolerance.
– class (obrigatório): nome do comportamento. Pode conter um dos valores a seguir: Aligning, Ant, Carrying, Circumventing, Redocking, Seeking
– min (obrigatório): limite inferior do intervalo.
– max (obrigatório): limite superior do intervalo.
• <poisson>
Descreve uma variável aleatória gerada dentro de uma distribuição estatı́stica
de Poisson. Ao contrário das anteriores, esta distribuição é discreta, ou seja,
gera números inteiros e não reais.
Atributos:
– name (obrigatório): nome da variável. Pode conter um dos valores a
seguir: angleTurn, audacity, chargeRate, exhaustion, firstCharge, initiative, intellingence, insistance, offset, sight, sociability, topForce, tries,
topSpeed, tolerance.
– class (obrigatório): nome do comportamento. Pode conter um dos valores a seguir: Aligning, Ant, Carrying, Circumventing, Redocking, Seeking.
– mean (obrigatório): valor médio. Pode ser um número real.
Exemplo:
<v a r i a b l e s>
<aco alpha=”2” beta=” 0 . 5 ”/>
<bounded−normal name=” i n i t i a t i v e ” c l a s s=”Ant” min=”0”
max=”1”/>
<uniform name=” i n t e l l i n g e n c e ” c l a s s=”Ant” min=”0”
max=”1”/>
18
<normal name=” angleTurn ” c l a s s=” A l i g n i n g ” mean=” 0 . 6 2 ”/>
<p o i s s o n name=” e x h a u s t i o n ” c l a s s=” A l i g n i n g ” mean=”3”/>
<normal name=” a u d a c i t y ” c l a s s=” S e e k i n g ” mean=” 6 7 . 7 5 ”
d e v i a t i o n=” 0 . 3 ”/>
<p o i s s o n name=” t r i e s ” c l a s s=” A l i g n i n g ” mean=”3”/>
</ v a r i a b l e s>
6.1.3
<environment>
A entidade <enviroment> contém informações sobre o tamanho do ecossistema,
a disposição de presas, a taxa de evaporação de feromônios e sobre o ninho. Suas
sub-entidades são <ecosystem>, <colony> e <leaves>, todas obrigatórias.
Sub-entidades:
• <ecosystem>
Agrupa as propriedade fı́sicas do ecossistema.
Atributos:
– rho (opcional): taxa de evaporação de feromônio. Recebe este nome
nada intuitivo devido à terminologia utilizada no algoritmo ACO, do
qual faz parte. O valor padrão é 2.5e − 3.
– threshold (opcional): valor mı́nimo de feromônio. Quando atinge estes
valor, o feromônio terá evaporado totalmente. O valor padrão é 0.01.
– gridDensity (opcional): valor de subdivisões da grade por centı́metro.
Pode ser 1, 2 ou 3, sendo 2 o valor padrão. Os valores de feromônio são
depositados em uma matriz bidimensional de dimensões iguais à largura
e altura do ecossistema em centı́metros. Com esta opção, é possı́vel
multiplicar ambas as dimensões desta matriz por 2 ou 3. Quanto mais
subdividido o ecossistema, mais discretas serão as trilhas de feromônios
e mais caminhos possı́veis as formigas serão capazes de escolher.
– width (obrigatório): largura do ecossistema, em centı́metros.
– height (obrigatório): altura do ecossistema, em centı́metros.
• <colony>
Contém informações sobre o ninho de formigas.
Atributos:
– ants (obrigatório): número de formigas desbravadoras que deixam o
ninho, inicialmente.
– reinforcements (opcional): número de formigas recrutadas por vez. O
valor padrão é 2.
• <leaves>
Como a aplicação foi originalmente concebida para suportar múltiplas presas, <leaves> permite alterar parâmetros qua afetam todas elas da mesma
maneira. Deve conter uma única entidade <leaf>.
Atributos:
– friction (opcional): coeficiente de atrito. O valor padrão é 0.3.
19
– areaDensity (opcional): densidade superficial da folha. o peso das folhas
depende desta densidade e do raio das folhas. O valor padrão é 0.0025.
– topSpeed (opcional): velocidade máxima com que as folhas podem ser
carregadas. O valor padrão é 0.55.
• <leaf>
Uma única folha. Pode conter múltiplas (ou nenhuma) sub-entidades <hook>.
Atributos:
– location (obrigatório): localização da folha segundo o sistema de coordenadas do ecossistema. Deve ser especificada no formato “(a, b)” ou
“a, b”, onde a e b são números reais. O espaço após a vı́rgula é opcional.
– radius (obrigatório): raio da folha, em centı́metros.
A entidade <hook> Adiciona um gancho à folha.
Atributos:
– pointer: Vetor da direção principal do gancho no sistema de coordenadas do ecossistema.
– threshold: valor mı́nimo de atuação do gancho, em centı́metros.
– arc: valor do arco de abertura do gancho, em radianos.
Exemplo:
<environment>
<e co sy s te m g r i d D e n s i t y=”2” width=” 45 ” h e i g h t=” 45 ”
rho=” 0 . 5 e−3” t h r e s h o l d=” 0 . 0 1 ”/>
<c o l o n y a n t s=”5” d e l i v e r i n g D i s t a n c e=”2”
l o c a t i o n=” 2 2 . 5 , 2 2 . 5 ” r a d i u s=”2”
r e i n f o r c e m e n t s=”3”/>
<l e a v e s a r e a D e n s i t y=” 0 . 0 0 0 7 5 ” f r i c t i o n=” 0 . 4 ”
topSpeed=” 0 . 7 ”>
< l e a f l o c a t i o n=” 1 2 . 5 , 3 2 . 5 ” r a d i u s=”5”/>
</ l e a v e s>
</ environment>
6.1.4
<animation>
Permite configurar um pequeno número de opções básicas da visualização da simulação. Pode conter as entidades <leaf-anim> e <ant-anim> nesta ordem, mas
não necessariamente as duas. Todos os atributos desta entidade e daquelas são
opcionais.
Atributos:
• scale (opcional): define quantos pixels são utilizados por centı́metro no desenho da simulação. O valor padrão é 20.
• drawGrid (opcional): se “true”, desenha a grade de vértices do ecossistema,
se “false”, não desenha a grade. O valor padrão é “true”.
Sub-entidades:
20
• <ant-anim>
Contém opções quanto ao desenho das formigas.
Atributos:
– size (opcional): raio das formigas, que são representadas através de
cı́rculos. O valor padrão é 0.3.
– fill (opcional): se verdadeiro, preenche as formigas com a vor de contorno, caso contrário, desenha apenas o contorno. O valor padrão é
“true”.
– drawVectors (opcional): se verdadeiro, habilita o desenho dos vetores
de força aplicada e velocidade. O valor padrão é “true”.
– drawForce (opcional): se verdadeiro, habilita o desenho do vetore de
força aplicada. O valor padrão é “false”.
– drawVelocity (opcional): se verdadeiro, habilita o desenho do vetore de
velocidade. O valor padrão é “false”.
• <leaf-anim>
Contém opções quanto ao desenho das folhas
Atributos:
– drawForces (opcional): se “true”, habilita o desenho dos vetores de
forças e de ganchos. O valor padrão é “true”.
– drawHooks (opcional): se “true”, habilita o desenho dos ganchos atuantes. O valor padrão é “false”.
– drawResultant (opcional): se “true”, habilita o desenho do vetores de
força resultante; se “false”, desenha a força aplicada total. O valor
padrão é “false”.
Exemplo:
<animation s c a l e=” 15 ” drawGrid=” f a l s e ”>
<l e a f −anim drawForces=” t r u e ” drawHooks=” t r u e ”
drawResultant=” f a l s e ”/>
<ant−anim drawVectors=” t r u e ” d r a w V e l o c i t y=” f a l s e ”
drawForce=” t r u e ” f i l l =” t r u e ” s i z e=” 0 . 3 ”/>
</ animation>
6.2
Saı́da da simulação
No final da simulação, os dados são inseridos no arquivo definido na entrada da
simulação (atributo “output” da entidade “<simulation>”).
A primeira linha do arquivo informa o horário do final da primeira rodada da
simulação, e as outras informam os valores das variáveis durante a rodada (quer
elas variem entre uma rodada e outra, quer não).
As variáveis de entrada só estarão presentes na saı́da se forem explicitadas
como entradas no arquivo de entrada. Os valores impressos na saı́da para variáveis
estatı́sticas são as médias destas variáveis, seja qual for a distribuição.
Exemplo:
21
#Wed Aug 05 19 : 3 9 : 0 9 BRT 2009
Colony . a n t s =15 ,15 ,15 ,15
Ecosystem . s u r f a c e =2025 ,2025 ,2025 ,2025
Ecosystem . rho =5.0E−4 ,5.0E−4 ,5.0E−4 ,5.0E−4
Ecosystem . g r i d D e n s i t y =2 ,2 ,2 ,2
Colony . r e i n f o r c e m e n t s =9 ,9 ,9 ,9
Workers . movement =76 ,66 ,73 ,63
L e a f . a r e a D e n s i t y =7.5E−4 ,7.5E−4 ,7.5E−4 ,7.5E−4
L e a f . topSpeed = 0 . 7 , 0 . 7 , 0 . 7 , 0 . 7
Leaf . d i s t a n c e =42.169907 ,42.169907 ,42.169907 ,42.169907
Leaf . d e l i v e r y =151.03514378 ,161.50254692 ,164.08383385 ,154.75300962
Leaf . f i n d i n g =13.116619583 ,8.249502757 ,7.290980041 ,11.188247748
Leaf . radius = 5 . 0 , 5 . 0 , 5 . 0 , 5 . 0
Leaf . f r i c t i o n = 0 . 4 , 0 . 4 , 0 . 4 , 0 . 4
L e a f . movement = 1 1 3 . 9 1 0 6 , 1 2 8 . 9 7 4 4 7 3 2 3 6 , 1 3 2 . 6 1 6 0 , 1 1 9 . 2 6 8 8 7 6 3 8 8
Leaf . t r a n s p o r t i n g =24.0079031 ,24.2785709 ,24.17677560 ,24.29588548
Workers . d e l i v e r y =113 ,104 ,127 ,99
Ecosystem . t h r e s h o l d = 0 . 0 0 9 8 2 5 8 2 , 0 . 0 0 9 8 2 5 8 2 , 0 . 0 0 9 8 2 5 8 2 , 0 . 0 0 9 8 2 5 8 2
6.3
Transformando a saı́da em outros formatos e gráficos
Uma vez que simulações tenham sido rodadas e seus dados tenham sido gravados
em arquivos properties, o programa auxiliar Ants-Report.jar pode ser utilizado
para coletar dados relevantes e gravá-los em formatos mais úteis. Na versão atual,
há duas maneiras de processar os dados: arquivos CSV e gráficos gerados pelo gnuplot, ambos mencionados na seção “Linguagens, ferramentas e padrões utilizados”
deste documento. O programa recebe um arquivo XML com os dados necessários
para fazer a conversão de formatos. A seguir, uma descrição do formato do arquivo
XML:
6.3.1
<report>
Esta etidade deve estar presete em todo e qualquer relatório e deve ser única. Deve
conter apenas uma entre as entidades <plot-2d>, <plot-3d>, <csv> e <csv-all>
e deve conter uma ou mais entidades <input>.
Atributos:
• file (obrigatório): contém o arquivo em que será gravada a saı́da, exceto no
caso em que ela for direcionada para o terminal interativo. No último caso,
o valor do campo será ignorado, mas ainda assim, deve ser especificado.
Sub-entidades:
• <plot-2d>
Indica que um gráfico em duas dimensões deve ser gerado. Contém as subentidades <x> e <y>, nesta ordem. Atributos:
– title (opcional): permite mudar o tı́tulo padrão adicionado ao topo do
gráfico. O valor padrão é o nome do arquivo de entrada.
– type (opcional): escolhe o tipo de saı́da da imagem. Pode possuir os
seguintes valores: PNG, GIF, BMP, JPG, SVG, EPS, DEFAULT. O
22
último direciona a saı́da para o terminal interativo e os demais constituem formatos de imagem, sendo recomendado colocar a extensão de
arquivo correspondente ao tipo escolhido aqui. Assim, por exemplo, se
o tipo escolhido for “GIF”, o arquivo deve ter um nome semelhante a
“arquivo.GIF” ou “arquivo.gif”. O valor padrão é “PNG”.
– average (opcional): se “true”, indica que as médias aritméticas dos
valores referentes a cada simulação serão gravadas. Se “false”, cada
valor será registrado. O valor padrão é “false”.
– style (opcional) - determina o estilo de desenho dos pontos do gráfico.
O gnuplot suporta muitos estilos diferentes, mas somente os estilos
“POINTS” e “LINES” são suportados nesta versão da aplicação. “POINTS”
desenha os pontos como cruzes vermelhas e “LINES” traça linhas entre
pontos consecutivos do gráfico. O valor padrão é “POINTS”.
– margin (opcional): indica a porcentagem de margem q deve ser deixada
em relação aos limites do gráfico, para evitar que os pontos fiquem
colados nos cantos do gráfico. O valor padrão é 0,1.
Sub-entidades:
– <x> e <y>
Escolhe a variável de simulação utilizada no eixo x, y e permite escolher
algumas outras opções de gráfico relacionadas a cada eixo.
Atributos:
∗ range (opcional): escolhe os limites inferior e superior do eixo. Se
não especificado, os limites serão automaticamente escolhidos para
se ajustar aos menores e maiores valores, respectivamente. Deve
ser especificado na forma “a:b”, onde a é o limite inferior e b é o
limite superior, a e b números reais.
∗ label (opcional): especifica o nome do eixo, que será apresentado no
gráfico. Se não especificado, assume o valor do atributo “variable”.
∗ variable (obrigatória): escolhe a variável correspondente ao eixo,
pode ter um dos seguintes valores, dependendo da entidade (todas
essas variáveis são descritas na seção “Variáveis do programa”):
· Para a entidade <x>: Aco.alpha, Aco.beta, Colony.ants, Aligning.angleTurn, Aligning.chargeRate, Aligning.exhaustion, Aligning.firstCharge, Aligning.insistance, Aligning.tries, Ant.initiative,
Ant.intelligence, Ant.sight, Ant.topForce, Ant.topSpeed, Carrying.firstCharge, Carrying.tolerance, Circumventing.insistance,
Circumventing.sociability, Colony.reinforcements, Leaf.areaDensity,
Leaf.distance, Leaf.friction, Leaf.radius, Leaf.topSpeed, Hook.modulus,
Hook.arc, Redocking.offset ou Seeking.audacity.
· Para a entidade <y>: Leaf.delivery, Leaf.finding, Leaf.movement,
Leaf.transporting, Workers.delivery ou Workers.movement.
• <plot-3d>
Indica que um gráfico em três dimensões deve ser gerado. Contém as subentidades <x>, <y> e <z> nesta ordem. Atributos:
– title (opcional): permite mudar o tı́tulo padrão adicionado ao topo do
gráfico. O valor padrão é o nome do arquivo de entrada.
23
– type (opcional): escolhe o tipo de saı́da da imagem. Pode possuir os
seguintes valores: PNG, GIF, BMP, JPG, SVG, EPS, DEFAULT. O
último direciona a saı́da para o terminal interativo e os demais constituem formatos de imagem, sendo recomendado colocar a extensão de
arquivo correspondente ao tipo escolhido aqui. Assim, por exemplo, se
o tipo escolhido for “GIF”, o arquivo deve ter um nome semelhante a
“arquivo.GIF” ou “arquivo.gif”. O valor padrão é “PNG”.
– average (opcional): se “true”, indica que as médias aritméticas dos
valores referentes a cada simulação serão gravadas. Se “false”, cada
valor será registrado. O valor padrão é “false”.
– style (opcional) - determina o estilo de desenho dos pontos do gráfico.
O gnuplot suporta muitos estilos diferentes, mas somente os estilos
“POINTS” e “LINES” são suportados nesta versão da aplicação. “POINTS”
desenha os pontos como cruzes vermelhas e “LINES” traça linhas entre
pontos consecutivos do gráfico. O estilo “LINES” funciona melhor em
gráficos bidimensionais. O valor padrão é “POINTS”.
– margin (opcional): indica a porcentagem de margem q deve ser deixada
em relação aos limites do gráfico, para evitar que os pontos fiquem
colados nos cantos do gráfico. O valor padrão é 0,1.
Sub-entidades:
– <x>, <y> e <z>
Escolhe a variável de simulação utilizada no eixo x, y ou z e permite
escolher algumas outras opções de gráfico relacionadas a cada eixo.
Atributos:
∗ range (opcional): escolhe os limites inferior e superior do eixo. Se
não especificado, os limites serão automaticamente escolhidos para
se ajustar aos menores e maiores valores, respectivamente. Deve
ser especificado na forma “a:b”, onde a é o limite inferior e b é o
limite superior, a e b números reais.
∗ label (opcional): especifica o nome do eixo, que será apresentado no
gráfico. Se não especificado, assume o valor do atributo “variable”.
∗ variable (obrigatória): escolhe a variável correspondente ao eixo,
pode ter um dos seguintes valores, dependendo da entidade (todas
essas variáveis são descritas na seção “Variáveis do programa”):
· Para a entidade <x>: Aco.alpha, Aco.beta, Colony.ants, Aligning.angleTurn, Aligning.chargeRate, Aligning.exhaustion, Aligning.firstCharge, Aligning.insistance, Aligning.tries, Ant.initiative,
Ant.intelligence, Ant.sight, Ant.topForce, Ant.topSpeed, Carrying.firstCharge, Carrying.tolerance, Circumventing.insistance,
Circumventing.sociability, Colony.reinforcements, Leaf.areaDensity,
Leaf.distance, Leaf.friction, Leaf.radius, Leaf.topSpeed, Hook.modulus,
Hook.arc, Redocking.offset ou Seeking.audacity.
· Para a entidade <y>: Aco.alpha, Aco.beta, Colony.ants, Aligning.angleTurn, Aligning.chargeRate, Aligning.exhaustion, Aligning.firstCharge, Aligning.insistance, Aligning.tries, Ant.initiative,
Ant.intelligence, Ant.sight, Ant.topForce, Ant.topSpeed, Carrying.firstCharge, Carrying.tolerance, Circumventing.insistance,
24
Circumventing.sociability, Colony.reinforcements, Leaf.areaDensity,
Leaf.delivery, Leaf.distance, Leaf.finding, Leaf.friction, Leaf.radius,
Leaf.movement, Leaf.topSpeed, Leaf.transporting, Hook.modulus,
Hook.arc, Redocking.offset, Seeking.audacity, Workers.delivery
ou Workers.movement.
· Para a entidade <z>: Leaf.delivery, Leaf.finding, Leaf.movement,
Leaf.transporting, Workers.delivery ou Workers.movement.
• <csv>
Determina a geração de um arquivo CSV ao invés de um gráfico. Pode conter
uma ou mais sub-entidades <col>, cada uma sendo uma coluna da tabela.
Atributos:
– header (opcional): caso seja “true”, a primeira linha da tabela conterá
o tı́tulo das colunas, correspondente ao tı́tulo dos eixos especificado nas
entidades <x>, <y> e <z>. O valor padrão é “true”.
Sub-entidades:
– <col>
Representa uma coluna na tabela.
Atributos:
∗ label (opcional): especifica o nome da coluna da tabela. Se não
especificado, assume o valor do atributo “variable”.
∗ variable (obrigatória): escolhe a variável correspondente ao eixo,
pode ter um dos seguintes valores (todas essas variáveis são descritas na seção “Variáveis do programa”): Aco.alpha, Aco.beta, Colony.ants, Aligning.angleTurn, Aligning.chargeRate, Aligning.exhaustion,
Aligning.firstCharge, Aligning.insistance, Aligning.tries, Ant.initiative,
Ant.intelligence, Ant.sight, Ant.topForce, Ant.topSpeed, Carrying.firstCharge,
Carrying.tolerance, Circumventing.insistance, Circumventing.sociability,
Colony.reinforcements, Leaf.areaDensity, Leaf.distance, Leaf.friction,
Leaf.radius, Leaf.topSpeed, Hook.modulus, Hook.arc, Redocking.offset
ou Seeking.audacity, Aco.alpha, Aco.beta, Colony.ants, Aligning.angleTurn,
Aligning.chargeRate, Aligning.exhaustion, Aligning.firstCharge, Aligning.insistance, Aligning.tries, Ant.initiative, Ant.intelligence, Ant.sight,
Ant.topForce, Ant.topSpeed, Carrying.firstCharge, Carrying.tolerance,
Circumventing.insistance, Circumventing.sociability, Colony.reinforcements,
Leaf.areaDensity, Leaf.delivery, Leaf.distance, Leaf.finding, Leaf.friction,
Leaf.radius, Leaf.movement, Leaf.topSpeed, Leaf.transporting, Hook.modulus,
Hook.arc, Redocking.offset, Seeking.audacity, Workers.delivery ou
Workers.movement, Leaf.delivery, Leaf.finding, Leaf.movement, Leaf.transporting,
Workers.delivery ou Workers.movement.
• <csv-all>
Determina a geração de um arquivo CSV ao invés de um gráfico, mas ao
contrário da entidade <cvs>, insere no arquivo CSV todas as variáveis disponı́veis para os arquivos indicados pelas entidades <input>.
Atributos:
25
– header (opcional): caso seja “true”, a primeira linha da tabela conterá
o tı́tulo das colunas, correspondente ao nome das variáveis. O valor
padrão é “true”.
• <input>
Adiciona um arquivo de saı́da de simulação como entrada para geração do
relatório.
Atributos:
– file (obrigatório): nome do arquivo de saı́da de simulação.
7
Experimentos
Realizamos alguns experimentos com a aplicação, e fizemos gráficos com os dados
recolhidos.
Os arquivos de simulação foram nomeados segundo a convenção input-xyz.xml,
onde:
x se refere ao número de formigas desbravadoras que deixam o ninho, inicialmente.
• x = 0 =⇒ Colony.ants = 5
• x = 1 =⇒ Colony.ants = 15
• x = 2 =⇒ Colony.ants = 25
y se refere ao número de formigas que saem do ninho quando uma formiga
retorna para recrutar apoio.
• y = 0 =⇒ Colony.reinforcements = 3
• y = 1 =⇒ Colony.reinforcements = 6
• y = 2 =⇒ Colony.reinforcements = 9
z se refere à distância da folha ao ninho.
• z = 0 =⇒ Leaf.distance = metade da distância do raio do cı́rculo inscrito na
tela da simulação.
• z = 1 =⇒ Leaf.distance = distância do raio do cı́rculo inscrito na tela da
simulação.
Exemplo: input-201.xml é a simulação na qual 25 formigas deixam o ninho a
princı́pio, os reforços são de 3 em 3 formigas e a folha está a uma distância do
ninho equivalente ao raio do cı́rculo inscrito na tela da simulação.
Os arquivos dos gráficos foram nomeados segundo a convenção report-###?.xml, onde:
? indica qual variável está no eixo y, sendo:
• a −→ Leaf.finding
• b −→ Leaf.delivery
26
• c −→ Leaf.movement
• d −→ Leaf.transporting
Dois dos #’s são números que indicam os valores dos parâmetros, segundo a
convenção anterior, e um # é um X, indicando qual parâmetro está variando.
Exemplo: report-20X-b.xml é o gráfico no qual 15 formigas saem da colônia e
o tamanho do reforço é 3 em todas as simulações. O que varia é a distância da
folha ao ninho (que é a variável do eixo x) e a variável do eixo y é Leaf.delivery.
Isso significa que este é um gráfico das simulações input-200.xml e input-201.xml.
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Download

Relatório: Vida Artificial e Transporte Coletivo - PDF