Você está na página 1de 170

Instituto Federal de Educação, Ciência e Tecnologia do Sudeste de Minas Gerais

Campus Juiz de Fora


Engenharia Mecatrônica

Frederico José Dias Möller

Desenvolvimento de um algoritmo de organização de enxame de robôs


baseado em crescimento celular na formação de tecidos.

Juiz de Fora
2018
Ficha catalográfica elaborada através do Modelo Latex do
IFSUDESTEMG - Campus Juiz de Fora com os dados
fornecidos pelo autor

MOELLER, Frederico José Dias.

Desenvolvimento de um algoritmo de organização de enxame de robôs


baseado em crescimento celular na formação de tecidos. / Frederico José
Dias Möller, 2018.

168 f.

Orientador: Luis Oscar de Araujo Porto Henriques Coorientador: Fran-


cisco Augusto Lima Manfrini
Monografia (Graduação em Engenharia Mecatrônica) –Instituto Federal
do Sudeste de Minas Gerais –Campus Juiz de Fora, 2018.

1. Enxame de robôs. 2. Morfogênese. 3. Heurística. I. Instituto Federal


do Sudeste de Minas Gerais. II. Título.
Frederico José Dias Möller

Desenvolvimento de um algoritmo de organização de enxame de robôs


baseado em crescimento celular na formação de tecidos.

Trabalho de Conclusão de Curso apresentado


ao Campus Juiz de Fora do Instituo Federal
de Educação, Ciência e Tecnologia do Sudeste
de Minas Gerais como requisito parcial para
obtenção do grau de Bacharel em Engenharia
Mecatrônica.

Orientador: Luis Oscar de Araujo Porto Henriques


Coorientador: Francisco Augusto Lima Manfrini

Juiz de Fora
2018
AGRADECIMENTOS

Agradeço a Deus.
Agradeço a meus pais, por toda confiança que depositaram em mim e por todo
incentivo que me deram.
Agradeço minhas irmãs, pelo incentivo que me deram.
Agradeço minha namorada, por ter me incentivado durante todo o trabalho e tem
me ajudado com algumas dúvidas da área de saúde e biológicas.
Agradeço meus orientadores, pela paciência que tiveram comigo, pela liberdade
que me deram na execução desse trabalho e pelas orientações que me passaram.
Agradeço meus tutores da bolsa PET Mecatrônica/BSI, pela experiência acadêmica
que eu tive ao trabalhar nas pesquisas da bolsa.
Agradeço a todos os professores que contribuíram com minha formação acadêmica
durante o curso de engenharia mecatrônica.
“Nunca diga às pessoas como fazer as coisas. Diga-lhes o que deve ser feito e elas
surpreenderão a você com sua engenhosidade.”
(George S. Patton)
RESUMO

No contexto da pesquisa em enxames de robôs e inteligência de enxame, a morfogênese,


ou seja, a capacidade de um enxame se organizar em formas e padrões, é um campo que
tem sido bem investigado principalmente com os avanços da nanorrobótica. É importante,
para o processo de desenvolvimento de um algoritmo de morfogênese, o entendimento da
dinâmica de robôs de enxame, processos análogos na química, biologia e física e claro um
estudo do estado da arte. Para isso foram revisados, neste trabalho, obras importantes
relacionadas. Seus algoritmos foram implementados em Python e seus resultados discutidos.
Por fim, foi analisado o modelo de crescimento celular biológico e o mesmo foi usado
como base para uma proposta de parâmetros para um autômato celular. A ideia é que
com valores diferentes nos parâmetros, o autômato possa criar formas diferentes em seu
crescimento. Para isso uma população de autômatos com valores diferentes foi colocada, em
processo de seleção via algoritmo genético para tentar alcançar formas pré-determinadas.
O algoritmo não conseguiu reproduzir a maioria das formas, porém, aspectos importantes
das formas desejadas foram reproduzidas nas gerações finais, indicando que o conceito
geral.

Palavras-chave: Enxame de robôs. Morfogênese. Heurística.


ABSTRACT

In the context of the research in swarms of robots and swarm intelligence, morphogenesis,
that is, the ability of a swarm to organize itself in forms and patterns, is a field that has
been well investigated mainly with the advances of nanorobotics. It is important, for the
development process of a morphogenesis algorithm, to understand the dynamics of swarm
robots, analogous processes in chemistry, biology and physics and of course a study of
the state of the art. For this, important works related were reviewed in this work. Its
algorithms were implemented in Python and its results discussed. Finally, the biological
cell growth model was analyzed and it was used as the basis for a proposal of parameters
for a cellular automaton. The idea is that with different values in the parameters, the
automaton can create different forms in its growth. For this, a population of automata
with different values was placed, in the process of selection via genetic algorithm to try to
reach predetermined forms. The algorithm failed to reproduce most forms, but important
aspects of the desired shapes were reproduced in the final generations, indicating that the
general concept.

Keywords: Robot Swarm. Morphogenesis. Heuristic.


LISTA DE FIGURAS

Figura 1 – Regra 1 do comportamento dos pássaros. . . . . . . . . . . . . . . . . . 24


Figura 2 – Regra 2 do comportamento dos pássaros. . . . . . . . . . . . . . . . . . 25
Figura 3 – Regra 3 do comportamento dos pássaros. . . . . . . . . . . . . . . . . . 26
Figura 4 – Modelo de autocatálise cúbica para duas substâncias. Em (a) A subs-
tância A é bombeada para o tanque enquanto B é retirada do mesmo.
Em (b) A substância A reage com a substância B em duas etapas,
primeiro uma molécula de A reage com uma de B gerando uma nova
molécula de B e depois duas moléculas de B consomem uma de A para
gerar mais uma molécula de B. Em (c) a taxa de difusão de A é maior
do que a de B. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Figura 5 – Função probabilística de decisão dos elementos do enxame. . . . . . . . 32
Figura 6 – Padrões formados por regras diferentes. Da esquerda para a direita de
cima para baixo: regra250, regra90, regra30 e regra100 . . . . . . . . . 34
Figura 7 – Formação de uma árvore por regra de substituição . . . . . . . . . . . 34
Figura 8 – Trocas de mensagens na montagem de uma formação. No primeiro
quadro o robô A é um vértice. No segundo ele e um robô B acoplam.
Por algum critério de decisão B resolve aceitar A como vértice e A
nomeia elemento 1 de uma linha de tamanho 1. No terceiro um robô C
acopla e aceita a posição de B, B nomeia C o elemento 0 da linha. Em
seguida um robô D acopla em C, D aceita a posição de C e C, sendo o
elemento 0, nomeia D como o próximo vértice. Sendo um vértice, D não
pode aceitar acoplamentos na mesma direção do robô que o nomeou
vértice, assim, só vai nomear uma nova linha quando o robô E acoplar
numa posição possível (último quadro) . . . . . . . . . . . . . . . . . . 36
Figura 9 – 3 regras básicas do algoritmo boids. Em (a) temos a tendência dos
pássaros de se aproximarem do centro de massa relativo ao resto do
bando. Em (b) a resposta evasiva quando algum outro pássaro, ou
objeto entra no raio de segurnaça do mesmo. Em (c) a tendência dos
pássaros em ajustarem suas velocidades com relação às demais do bando. 40
Figura 10 – A evolução do bando durante a execução do algoritmo Boids com apenas
as 3 regras básicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Figura 11 – Distâncias máxima, média e mínima dos pássaros com o centro de massa
do bando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Figura 12 – Variação de distância média em relação ao centro de gravidade do bando
por limite de segurança . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Figura 13 – Variação de distância média em relação ao centro de gravidade do bando
por tamanho do bando . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Figura 14 – Evolução gráfica de um bando contra um enxame. . . . . . . . . . . . . 46
Figura 15 – Convergência de um enxame agregador . . . . . . . . . . . . . . . . . . 47
Figura 16 – Distâncias máxima, mínima e média dos elementos do enxame ao longo
das iterações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Figura 17 – Distâncias máxima, mínima e média dos elementos do enxame ao longo
das iterações, foco no trecho final . . . . . . . . . . . . . . . . . . . . . 48
Figura 18 – Distâncias máxima, mínima e média dos elementos do enxame variando
conforme o valor do coeficiente a, gráfico iniciando com a = 0,0199 . . 51
Figura 19 – Distâncias máxima, mínima e média dos elementos do enxame variando
conforme o valor do coeficiente a, gráfico iniciando com a = 0,1 . . . . 51
Figura 20 – Distâncias máxima, mínima e média dos elementos do enxame variando
conforme o valor do coeficiente b, gráfico iniciando com b = 20 . . . . 52
Figura 21 – Distâncias máxima, mínima e média dos elementos do enxame variando
conforme o valor do coeficiente c, gráfico iniciando com c = 0.2 . . . . 52
Figura 22 – Enxame formando um triângulo equilátero . . . . . . . . . . . . . . . . 54
Figura 23 – Enxame formando uma cruz . . . . . . . . . . . . . . . . . . . . . . . . 54
Figura 24 – Enxame se deslocando em um meio com toxinas e nutrientes . . . . . . 55
Figura 25 – Elementos isolados em ilhas de nutrientes . . . . . . . . . . . . . . . . 56
Figura 26 – Reação difusão para DA = 1, 0, DB = 0, 5, f = 0, 055, k = 0, 062 . . . . 58
Figura 27 – Reação difusão para DA = 1, 0, DB = 0, 5, f = 0, 055, k = 0, 062, em
meio ao ruído . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Figura 28 – Evolução do enxame para 10% de concentração . . . . . . . . . . . . . 61
Figura 29 – Evolução do enxame para 25% de concentração . . . . . . . . . . . . . 62
Figura 30 – Evolução do enxame para 50% de concentração . . . . . . . . . . . . . 62
Figura 31 – Evolução do enxame para 75% de concentração . . . . . . . . . . . . . 62
Figura 32 – Evolução do enxame para 25% de concentração, perfil hormonal rico
em inibidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Figura 33 – Evolução do enxame para 25% de concentração, perfil hormonal balanceado 63
Figura 34 – Evolução do enxame para 25% de concentração, perfil hormonal rico
em ativador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Figura 35 – Evolução do enxame para 25% de concentração, perfil hormonal apenas
com ativador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Figura 36 – Crescimento de uma árvore fractal . . . . . . . . . . . . . . . . . . . . 64
Figura 37 – Regra 90 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Figura 38 – Matriz inicial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Figura 39 – Matriz depois da iteração 0 . . . . . . . . . . . . . . . . . . . . . . . . 67
Figura 40 – Matriz depois da iteração 4 . . . . . . . . . . . . . . . . . . . . . . . . 68
Figura 41 – Matriz, resultado final . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Figura 42 – Evolução do enxame na formação de uma cruz . . . . . . . . . . . . . . 72
Figura 43 – Curvas representadas usando técnicas anti-serrilhamento em comparação
à forma limitada de como o enxame poderia representar a mesma . . . 74
Figura 44 – Surgimento de uma ilha . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Figura 45 – Representação simplificada do desenvolvimento celular em forma de
uma máquina de estados finitos . . . . . . . . . . . . . . . . . . . . . . 78
Figura 46 – Acoplamentos do robô, ou célula autômata . . . . . . . . . . . . . . . . 80
Figura 47 – Crescimento dos tipos a,g e r. O incremento ou o fator dos tipos a e g
é de 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Figura 48 – Crescimento dos tipos a, com fator de incremento 3, mas com filhas
herdando posição da mãe . . . . . . . . . . . . . . . . . . . . . . . . . 81
Figura 49 – Crescimento dos tipos ag2 e ag2c, com fator de incremento inicial 3. . . 82
Figura 50 – Calculo do erro para o algoritmo de seleção. . . . . . . . . . . . . . . . 84
Figura 51 – Ilustração do sistema de sorteio no processo de seleção. . . . . . . . . . 85
Figura 52 – Figura de referência na execução de controle. . . . . . . . . . . . . . . 85
Figura 53 – 25 melhores espécimes depois de 20 gerações . . . . . . . . . . . . . . . 86
Figura 54 – Resultado de 25 das 200 espécies originais 20 gerações . . . . . . . . . 86
Figura 55 – Evolução do tipo de retorno ao longo das 20 gerações . . . . . . . . . . 87
Figura 56 – Evolução do tipo da classe de modelo de rotação ao longo das 20 gerações 87
Figura 57 – Evolução da quantidade de indivíduos gerados pelas células autômatas
ao longo das 20 gerações . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Figura 58 – Evolução da quantidade de indivíduos com modelo de rotação aleatório
ao longo das 20 gerações . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Figura 59 – Evolução do erro ao longo das 20 gerações . . . . . . . . . . . . . . . . 89
Figura 60 – 25 melhores espécimes depois de 20 gerações, com f=0,425 . . . . . . . 90
Figura 61 – Evolução da quantidade de indivíduos com modelo de rotação aleatório
ao longo das 20 gerações, com pop = 300, caso particular . . . . . . . . 91
Figura 62 – Evolução do tipo da classe de modelo de rotação ao longo das 20
gerações, com pop = 300, casp particular . . . . . . . . . . . . . . . . . 91
Figura 63 – 25 melhores resultados usando nas novas condições de execução . . . . 92
Figura 64 – Evolução da quantidade de espécimes que contém elemento randômico
no parâmetro de modelo de rotação, usando as novas condições de
execução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Figura 65 – Evolução erro nas novas condições de execução . . . . . . . . . . . . . 93
Figura 66 – Evolução do tipo de retorno nas novas condições de execução . . . . . . 94
Figura 67 – Evolução do modelo de rotação nas novas condições de execução . . . . 94
Figura 68 – Evolução da quantidade de individuos na figura final, de acordo com as
novas condições de execução . . . . . . . . . . . . . . . . . . . . . . . . 95
Figura 69 – Planejamento do desenvolvimento do algoritmo . . . . . . . . . . . . . 99
Figura 70 – Convergência do enxame com coeficiente a igual a 0,1 . . . . . . . . . . 124
Figura 71 – Distâncias máxima, mínima e média dos elementos do enxame ao longo
das iterações com o coeficiente a igual a 0,1 . . . . . . . . . . . . . . . 124
Figura 72 – Distâncias máxima, mínima e média dos elementos do enxame ao longo
das iterações com o coeficiente a igual a 0,1, iterações = 0,01 . . . . . . 125
Figura 73 – Distâncias máxima, mínima e média dos elementos do enxame ao longo
das iterações, foco no trecho final, com o coeficiente a igual a 0,1,
iterações = 0,01 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Figura 74 – Convergência do enxame com coeficiente b igual a 200 . . . . . . . . . 126
Figura 75 – Distâncias máxima, mínima e média dos elementos do enxame ao longo
das iterações com o coeficiente b igual a 200 . . . . . . . . . . . . . . . 126
Figura 76 – Distâncias máxima, mínima e média dos elementos do enxame ao longo
das iterações, foco no trecho final, com o coeficiente b igual a 200 . . . 127
Figura 77 – Convergência do enxame com coeficiente c igual a 20 . . . . . . . . . . 127
Figura 78 – Distâncias máxima, mínima e média dos elementos do enxame ao longo
das iterações com o coeficiente c igual a 20 . . . . . . . . . . . . . . . . 128
Figura 79 – Distâncias máxima, mínima e média dos elementos do enxame ao longo
das iterações, foco no trecho final, com o coeficiente c igual a 20 . . . . 128
Figura 80 – Convergência do enxame com coeficiente a igual a 0,001 . . . . . . . . 129
Figura 81 – Distâncias máxima, mínima e média dos elementos do enxame ao longo
das iterações com o coeficiente a igual a 0,001 . . . . . . . . . . . . . . 129
Figura 82 – Distâncias máxima, mínima e média dos elementos do enxame ao longo
das iterações, foco no trecho final, com o coeficiente a igual a 0,001 . . 130
Figura 83 – Convergência do enxame com coeficiente b igual a 20000 . . . . . . . . 130
Figura 84 – Distâncias máxima, mínima e média dos elementos do enxame ao longo
das iterações com o coeficiente b igual a 20000 . . . . . . . . . . . . . . 131
Figura 85 – Distâncias máxima, mínima e média dos elementos do enxame ao longo
das iterações, foco no trecho final, com o coeficiente b igual a 20000 . . 131
Figura 86 – Convergência do enxame com coeficiente c igual a 2000 . . . . . . . . . 132
Figura 87 – Distâncias máxima, mínima e média dos elementos do enxame ao longo
das iterações com o coeficiente c igual a 2000 . . . . . . . . . . . . . . 132
Figura 88 – Distâncias máxima, mínima e média dos elementos do enxame ao longo
das iterações, foco no trecho final, com o coeficiente c igual a 2000 . . . 133
Figura 89 – Enxame de forrageamento com 200 elementos presos em ilhas . . . . . 133
Figura 90 – B em duas ilhas retangulares . . . . . . . . . . . . . . . . . . . . . . . 133
Figura 91 – B em circulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Figura 92 – B em cinco quadrados intercalados . . . . . . . . . . . . . . . . . . . . 134
Figura 93 – B em linha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Figura 94 – Redução do valor de k para 0,06 . . . . . . . . . . . . . . . . . . . . . . 134
Figura 95 – Aumento do valor de k para 0,064 . . . . . . . . . . . . . . . . . . . . . 134
Figura 96 – Redução do valor de f para 0,03 . . . . . . . . . . . . . . . . . . . . . . 135
Figura 97 – Redução do valor de f para 0,03 e k para 0,06 . . . . . . . . . . . . . . 135
Figura 98 – Arvore do vídeo I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Figura 99 – Arvore do vídeo III . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Figura 100 – Padrão em linhas do vídeo IV . . . . . . . . . . . . . . . . . . . . . . . 135
Figura 101 – Padrão em linhas do vídeo V . . . . . . . . . . . . . . . . . . . . . . . 136
Figura 102 – Regra 30 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Figura 103 – Regra 90 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Figura 104 – Regra 110 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Figura 105 – Regra 250 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Figura 106 – Evolução da quantidade de indivíduos com modelo de rotação aleatório
ao longo das 20 gerações, com f = 0,425 . . . . . . . . . . . . . . . . . 137
Figura 107 – Evolução do tipo da classe de modelo de rotação ao longo das 20
gerações, com f = 0,425 . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Figura 108 – Evolução do erro ao longo das 20 gerações, com f = 0,425 . . . . . . . 138
Figura 109 – Evolução do tipo de retorno ao longo das 20 gerações, com f = 0,425 . 138
Figura 110 – Evolução do tipo da classe de modelo de rotação ao longo das 20
gerações, com f = 1,275 . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Figura 111 – Evolução da quantidade de indivíduos com modelo de rotação aleatório
ao longo das 20 gerações, com f = 1,275 . . . . . . . . . . . . . . . . . 139
Figura 112 – 25 melhores espécimes depois de 20 gerações, com f=0,1,275 . . . . . . 140
Figura 113 – Evolução do erro ao longo das 20 gerações, com pop = 100 . . . . . . . 140
Figura 114 – Evolução da quantidade de indivíduos com modelo de rotação aleatório
ao longo das 20 gerações, com pop = 100 . . . . . . . . . . . . . . . . . 141
Figura 115 – 25 melhores espécimes depois de 20 gerações, com pop = 100 . . . . . . 141
Figura 116 – Evolução do tipo da classe de modelo de rotação ao longo das 20
gerações, com pop = 100 . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Figura 117 – Evolução do erro ao longo das 20 gerações, com pop = 300 . . . . . . . 142
Figura 118 – Evolução da quantidade de indivíduos com modelo de rotação aleatório
ao longo das 20 gerações, com pop = 300 . . . . . . . . . . . . . . . . . 143
Figura 119 – 25 melhores espécimes depois de 20 gerações, com pop = 300 . . . . . . 143
Figura 120 – Evolução do tipo da classe de modelo de rotação ao longo das 20
gerações, com pop = 300 . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Figura 121 – 25 melhores espécimes depois de 20 gerações, com pop = 300, caso
particular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Figura 122 – Evolução do erro ao longo das 20 gerações, com pop = 300, caso particular145
Figura 123 – Evolução do erro ao longo das 10 gerações . . . . . . . . . . . . . . . . 145
Figura 124 – Evolução da quantidade de indivíduos com modelo de rotação aleatório
ao longo das 10 gerações . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Figura 125 – 25 melhores espécimes depois de 10 gerações . . . . . . . . . . . . . . . 146
Figura 126 – Evolução do tipo da classe de modelo de rotação ao longo das 10 gerações147
Figura 127 – Evolução do erro ao longo das 40 gerações . . . . . . . . . . . . . . . . 147
Figura 128 – Evolução da quantidade de indivíduos com modelo de rotação aleatório
ao longo das 40 gerações . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Figura 129 – 25 melhores espécimes depois de 40 gerações . . . . . . . . . . . . . . . 148
Figura 130 – Evolução do tipo da classe de modelo de rotação ao longo das 40 gerações149
Figura 131 – Figura desejada para a segunda execução . . . . . . . . . . . . . . . . . 149
Figura 132 – Os 25 melhores resultados, figura desejada = circulo . . . . . . . . . . 149
Figura 133 – Evolução do erro, figura desejada = circulo . . . . . . . . . . . . . . . . 150
Figura 134 – Evolução da quantidade de espécies com fator aleatório no modelo de
rotação, figura desejada = circulo . . . . . . . . . . . . . . . . . . . . . 150
Figura 135 – Evolução do tipo de retorno, figura desejada = circulo . . . . . . . . . 151
Figura 136 – Evolução do tipo de modelo de rotação, figura desejada = circulo . . . 151
Figura 137 – Evolução da quantidade de elementos na figura formada, figura desejada
= circulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Figura 138 – Figura desejada para a terceira execução . . . . . . . . . . . . . . . . . 152
Figura 139 – Os 25 melhores resultados, figura desejada = linha horizontal . . . . . 152
Figura 140 – Evolução do erro, figura desejada = linha horizontal . . . . . . . . . . . 153
Figura 141 – Evolução da quantidade de espécies com fator aleatório no modelo de
rotação, figura desejada = linha horizontal . . . . . . . . . . . . . . . . 153
Figura 142 – Evolução do tipo de retorno, figura desejada = linha horizontal . . . . 154
Figura 143 – Evolução do tipo de modelo de rotação, figura desejada = linha horizontal154
Figura 144 – Evolução da quantidade de elementos na figura formada, figura desejada
= linha horizontal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Figura 145 – Figura desejada para a quarta execução . . . . . . . . . . . . . . . . . 155
Figura 146 – Os 25 melhores resultados, figura desejada = linha vertical . . . . . . . 155
Figura 147 – Evolução do erro, figura desejada = linha vertical . . . . . . . . . . . . 156
Figura 148 – Evolução da quantidade de espécies com fator aleatório no modelo de
rotação, figura desejada = linha vertical . . . . . . . . . . . . . . . . . 156
Figura 149 – Evolução do tipo de retorno, figura desejada = linha vertical . . . . . . 157
Figura 150 – Evolução do tipo de modelo de rotação, figura desejada = linha vertical 157
Figura 151 – Evolução da quantidade de elementos na figura formada, figura desejada
= linha vertical . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Figura 152 – Figura desejada para a quinta execução . . . . . . . . . . . . . . . . . . 158
Figura 153 – Os 25 melhores resultados, figura desejada = cruz . . . . . . . . . . . . 158
Figura 154 – Do 75o ao 100o melhores resultados, figura desejada = cruz . . . . . . . 159
Figura 155 – Evolução do erro, figura desejada = cruz . . . . . . . . . . . . . . . . . 159
Figura 156 – Evolução da quantidade de espécies com fator aleatório no modelo de
rotação, figura desejada = cruz . . . . . . . . . . . . . . . . . . . . . . 160
Figura 157 – Evolução do tipo de retorno, figura desejada = cruz . . . . . . . . . . . 160
Figura 158 – Evolução do tipo de modelo de rotação, figura desejada = cruz . . . . . 161
Figura 159 – Evolução da quantidade de elementos na figura formada, figura desejada
= cruz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Figura 160 – Figura desejada para a sexta execução . . . . . . . . . . . . . . . . . . 161
Figura 161 – Os 25 melhores resultados, figura desejada = quadrado oco . . . . . . . 162
Figura 162 – Evolução do erro, figura desejada = quadrado oco . . . . . . . . . . . . 162
Figura 163 – Evolução da quantidade de espécies com fator aleatório no modelo de
rotação, figura desejada = quadrado oco . . . . . . . . . . . . . . . . . 163
Figura 164 – Evolução do tipo de retorno, figura desejada = quadrado oco . . . . . . 163
Figura 165 – Evolução do tipo de modelo de rotação, figura desejada = quadrado oco 164
Figura 166 – Evolução da quantidade de elementos na figura formada, figura desejada
= quadrado oco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Figura 167 – Figura desejada para a ultima execução . . . . . . . . . . . . . . . . . 164
Figura 168 – Os 25 melhores resultados, figura desejada = coração . . . . . . . . . . 165
Figura 169 – Do 50o ao 75o melhores resultados, figura desejada = coração . . . . . 165
Figura 170 – Evolução do erro, figura desejada = coração . . . . . . . . . . . . . . . 166
Figura 171 – Evolução da quantidade de espécies com fator aleatório no modelo de
rotação, figura desejada = coração . . . . . . . . . . . . . . . . . . . . 166
Figura 172 – Evolução do tipo de retorno, figura desejada = quadrado oco . . . . . . 167
Figura 173 – Evolução do tipo de modelo de rotação, figura desejada = quadrado oco 167
Figura 174 – Evolução da quantidade de elementos na figura formada, figura desejada
= quadrado oco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
LISTA DE TABELAS
LISTA DE ABREVIATURAS E SIGLAS

DFT transformada de Fourier discreta - discrete Fourier transform

Boids Bird-oid object

FSS Busca por cardume - Fish School Search

GSO Optimização por enxame de vaga-lumes - Gloworm Swarm Optimization

DHM Modelo digital de hormônio - Digital Hormone Model

RSSF Redes de sensores sem fio

DNSR Rede dinâmica de enxame de robôs - Dynamic Network of Swarm Robots

IA Inteligência Artificial
SUMÁRIO

1 INTRODUÇÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.1 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

2 REVISÃO BIBLIOGRÁFICA . . . . . . . . . . . . . . . . . . . 23
2.1 Inteligência de Enxame . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.1.1 Definição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.1.2 Boids 1986 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.1.3 Stability Analysis of Swarms, 2002 . . . . . . . . . . . . . . . . . . . . . 25
2.1.4 Modelo reação difusão de Turing, 1952 . . . . . . . . . . . . . . . . . . . 27
2.1.4.1 Sistemas baseados no modelo Gray-Scott, 1982 . . . . . . . . . . . . . . 28
2.1.4.2 Hormone-Inspired Self-Organization and Distributed Control of Robotic
Swarms, 2004 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.1.5 A New Kind of Science, 2002 . . . . . . . . . . . . . . . . . . . . . . . . 32
2.1.6 Self-Assembly and Self-Repair of Arbitrary Shapes by a Swarm of Reactive
Robots: Algorithms and Simulations, 2010 . . . . . . . . . . . . . . . . . 35
2.2 Algoritmos Genéticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.3 Visão de máquina e reconhecimento de padrões . . . . . . . . . . . . . . 38

3 IMPLEMENTAÇÃO DOS ALGORITMOS EXISTENTES . . 40


3.1 Boids . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.2 Enxames agregadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.2.1 Função de atração e repulsão simples . . . . . . . . . . . . . . . . . . . 47
3.2.2 Estabilização de formação . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.2.3 Enxames na presença de nutrientes e toxinas . . . . . . . . . . . . . . . 54
3.3 Algoritmos baseados no modelo reação difusão de Turing . . . . . . . . 56
3.3.1 Algoritmo baseado no modelo de Gray-Scott . . . . . . . . . . . . . . . 56
3.3.2 Hormone-Inspired Self-Organization and Distributed Control of Robotic
Swarms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.4 Autômatos celulares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.5 Self-Assembly and Self-Repair of Arbitrary Shapes by a Swarm of Reac-
tive Robots: Algorithms and Simulations . . . . . . . . . . . . . . . . . 69

4 DESENVOLVIMENTO DE UM ALGORITMO DE MORFO-


GÊNESE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
4.1 Particularidades de figuras bidimensionais . . . . . . . . . . . . . . . . . 73
4.2 Células biológicas e tecidos . . . . . . . . . . . . . . . . . . . . . . . . . 76
4.3 Proposta geral do processo de morfogênese programada . . . . . . . . . 78
4.4 Definição dos parâmetros . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4.5 Regras de mutação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
4.6 Regras de seleção . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
4.7 Condições de execução . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
4.8 Variações nas condições de execução e seleção . . . . . . . . . . . . . . . 88
4.9 Condições finais de execução . . . . . . . . . . . . . . . . . . . . . . . . 92
4.10 Testes para outras formas pré determinadas . . . . . . . . . . . . . . . . 92
4.10.1 Circulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
4.10.2 Linha horizontal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
4.10.3 Linha vertical . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
4.10.4 Cruz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
4.10.5 Quadrado oco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
4.10.6 Coração . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

5 ANÁLISE FINAL DOS RESULTADOS E CONCLUSÃO . . . 98


5.1 Análise final dos resultados do algoritmo . . . . . . . . . . . . . . . . . 98
5.2 Análise do processo criativo . . . . . . . . . . . . . . . . . . . . . . . . . 98
5.3 Considerações sobre otimização . . . . . . . . . . . . . . . . . . . . . . . 101
5.4 Trabalhos futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

REFERÊNCIAS . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

A Algoritmos existentes implementados . . . . . . . . . . . . . . . 105


A.1 Boids . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
A.1.1 Primeira regra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
A.1.2 Segunda regra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
A.1.3 Terceira regra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
A.1.4 Boids com apenas as três regras . . . . . . . . . . . . . . . . . . . . . . 106
A.2 Enxames agregadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
A.2.1 Função de módulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
A.2.2 Função de atração e repulsão . . . . . . . . . . . . . . . . . . . . . . . . 106
A.2.3 Modelo do enxame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
A.2.4 Estabilização de formação . . . . . . . . . . . . . . . . . . . . . . . . . . 107
A.2.5 Deltas para a formação de uma cruz . . . . . . . . . . . . . . . . . . . . 107
A.2.6 Função para captura de valores do gradiente . . . . . . . . . . . . . . . 108
A.2.7 Exames de forrageamento social . . . . . . . . . . . . . . . . . . . . . . 108
A.2.8 Regras utilizadas para a criação das matrizes de nutrientes e toxinas . . 108
A.3 Algoritmos baseados no modelo reação-difusão de Turing . . . . . . . . 109
A.3.1 Algoritmo de reação difusão baseado no modelo de Gray-Scott . . . . . 109
A.3.2 Hormone-Inspired Self-Organization and Distributed Control of Robotic
Swarms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
A.3.2.1 Função que aplica os campos hormonais . . . . . . . . . . . . . . . . . . 110
A.3.2.2 Função de movimento dos robôs . . . . . . . . . . . . . . . . . . . . . . 111
A.3.2.3 Regras para a construção das matrizes hormonais utilizadas . . . . . . . 111
A.4 A new kind of science . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
A.4.1 Função de rotacionar vetor . . . . . . . . . . . . . . . . . . . . . . . . . 114
A.4.2 Função de crescimento de árvore . . . . . . . . . . . . . . . . . . . . . . 114
A.4.3 Função de conversão para binário . . . . . . . . . . . . . . . . . . . . . 115
A.4.4 Autômato celular simples . . . . . . . . . . . . . . . . . . . . . . . . . . 115
A.5 Self-Assembly and Self-Repair of Arbitrary Shapes by a Swarm of Reac-
tive Robots: Algorithms and Simulations, 2010 . . . . . . . . . . . . . . 116
A.5.1 Função que determina a velocidade dos grupos . . . . . . . . . . . . . . 116
A.5.2 Função que checa a vizinhança do robô . . . . . . . . . . . . . . . . . . 117
A.5.3 Função que acusa vizinhos que não estão no mesmo grupo que o robô . 117
A.5.4 Protocolo de decisão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
A.5.5 Função de comportamento de vértice . . . . . . . . . . . . . . . . . . . . 118
A.5.6 Função de comportamento de linha: . . . . . . . . . . . . . . . . . . . . 119
A.5.7 Função de destruição de grupos . . . . . . . . . . . . . . . . . . . . . . 121
A.5.8 Função de colisão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
A.5.9 Função de formação de padrões . . . . . . . . . . . . . . . . . . . . . . . 122

B Figuras e gráficos complementares . . . . . . . . . . . . . . . . . 124


B.1 Enxames agregadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
B.1.1  ≈ 38, 36 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
B.1.1.1 a = 0, 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
B.1.1.2 b = 200 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
B.1.1.3 c = 20 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
B.1.2 Outros valores de  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
B.1.2.1 a = 0, 001 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
B.1.2.2 b = 20000 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
B.1.2.3 c = 2000 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
B.1.3 Enxame de forrageamento com 200 elementos . . . . . . . . . . . . . . . 133
B.2 Algoritmos baseados no modelo reação difusão de Turing . . . . . . . . 133
B.2.1 Resultados dos algoritmos baseados no modelo de Gray-Scott . . . . . . 133
B.2.1.1 Mesmos coeficientes, diferentes concentrações iniciais de B . . . . . . . . 133
B.2.1.2 Mesmas concentrações iniciais, variação de k . . . . . . . . . . . . . . . 134
B.2.1.3 Mesmas concentrações, variação de f . . . . . . . . . . . . . . . . . . . . 135
B.3 A new kind of science . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
B.4 Pattern Substitution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
B.4.1 Cellular Automata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
B.5 Desenvolviemnto do algoritmo, variação na execução de controle . . . . 137
B.5.1 f=0,425 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
B.5.2 f=1,275 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
B.5.3 pop=100 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
B.5.4 pop=300 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
B.5.5 pop=300, caso particular . . . . . . . . . . . . . . . . . . . . . . . . . . 144
B.5.6 gerações = 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
B.5.7 gerações = 40 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
B.5.8 Circulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
B.5.9 Linha horizontal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
B.5.10 Linha vertical . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
B.5.11 Cruz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
B.5.12 Quadrado oco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
B.5.13 Coração . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
20

1 INTRODUÇÃO

Para determinados problemas, a busca pela solução perfeita, ou por todo o conjunto
de soluções possíveis pode estar além da capacidade computacional envolvida na resolução,
ou mesmo impraticável. Para esses problemas a abordagem heurística é recomendável
em detrimento da abordagem determinística. Ela sacrifica a precisão e certeza da melhor
resposta, em prol da agilidade e de uma solução boa. Abordagens heurísticas que tenham
conceitos básicos em comum e que podem ser aplicadas a uma grande gama de problemas
são chamadas de meta-heurísticas e dentre elas encontra-se a inteligência de enxame.
Algoritmos de inteligência de enxame vem sendo propostos desde o final da década
de 80, com o programa Boids (REYNOLDS, 1987), que simulava um bando em voo. O
nome do programa, que vem da abreviação de "Bird-oid object", mostra que inteligências
de enxame não precisam ser baseadas em abelhas e vespas, sequer precisa ser limitada a
modelos entômicos, pois existem modelos baseados em bandos e cardumes. Na verdade,
algoritmos de inteligência de enxame fogem até do reino animal, existindo algoritmos
baseados no crescimento de colônias de bactérias (NIU, 2012).
Dentro da robótica, a inteligência de enxame é bastante aplicada quando se quer
passar uma tarefa a um grupo de robôs, não necessariamente homogêneo, mas cujas
capacidades individuais de percepção de atuação dos robôs são muito aquém do problema
proposto. O comportamento de enxame não exige centralização para a coordenação do
grupo e nem hierarquização prévia, ou mesmo sólida. Cada indivíduo no enxame age de
acordo com sua vizinhança e no final a soma dessas atitudes individuais faz com que o
grupo consiga uma solução para a tarefa desejada.
Um problema para enxame de robôs é a auto-organização do enxame em estruturas,
pré-definidas ou objetivas. Chamamos aqui de pré-definidas as estruturas que tem uma
forma fixa determinada previamente à programação do enxame e que tão logo o enxame
comece a operar, ele buscará repetir tal estrutura. Já as objetivas são estruturas que o
enxame tem que formar, da melhor maneira possível, a fim de superar um obstáculo em
sua tarefa. Um exemplo de estrutura pré-definida seria um enxame de micro, ou nano
robôs injetados em uma máquina com o objetivo de formar um dente partido de uma roda
dentada danificada, enquanto uma estrutura objetiva seria uma ponte que um enxame
formaria usando alguns dos seus elementos para ultrapassar um obstáculo que encontrou
em sua rota, tal qual formigas fazem pontes e torres vivas, subindo e agarrando umas às
outras.
Já existem algumas soluções para esse tipo de problema. Em 2010, um artigo
publicado na revista Autonomous Robots (ARBUCKLE, 2010) mostrava como um enxame
de robôs poderiam criar e até mesmo reparar formas executando um algoritmo de construção
de polígonos e baseando-se nas capacidades comunicativas do que é esperado de nanorrobôs,
21

ou seja, comunicação apenas com robôs vizinhos, uma vez que especula-se que tais robôs
estariam limitados à comunicação química. Outro artigo, anterior (MAMEI M. VASIRANI,
2004), mostra enxames de robôs formando padrões como círculos, anéis e polígonos. Uma
abordagem baseada em térmitas foi testada em um enxame de robôs (RUBENSTEIN
A. CORNEJO, 2014) e obteve bons resultados. O fato é que, esse problema tem sido
amplamente estudado e diversas soluções tem surgido nos últimos anos.
Os desafios da morfogênese variam das estruturas pré-definidas para as objetivas.
As estruturas objetivas lidam com o problema da adaptabilidade, elas só serão formadas
quando houver necessidade e sua forma e composição são determinadas pelo obstáculo que
o enxame tem que enfrentar. O algoritmo que estiver presente em cada indivíduo deve
dar ao enxame a capacidade de ser flexível ao lidar com a aleatoriedade de eventos na sua
missão. Talvez, uma forma de buscar essa robusteza para o enxame seja usando algoritmos
genéticos. Usando como exemplo a inspiração do trabalho de Rubenstein (RUBENSTEIN
A. CORNEJO, 2014), térmitas formam estruturas vivas agarrando umas as outras. Não é
um processo sem perdas, algumas podem morrer sendo esmagadas pelas companheiras,
ou sufocadas no meio de muitas outras. Portanto, atingido um certo limite de densidade
formicular, uma térmita abandona a formação, visando a auto-preservação, isso evita
perdas desnecessárias. Agora tem-se uma variável: o quanto uma térmita aguenta antes de
abandonar a formação? Um grupo de térmitas cujo os indivíduos sejam pouco tolerantes
abandonam cedo as formações e torna as mesmas difíceis de acontecer. No entanto essas
térmitas não morrerão pelos acidentes causados por uma formação, mas terão dificuldade
de alcançar seus objetivos. Já um grupo onde as térmitas demorem demais para abandonar
a formação terá maior facilidade na criação destas, porém perderá muitos indivíduos o
que em última análise eleva o custo disso para a colônia de formigas. De vários grupos
de térmitas com padrões diferentes de tolerância e de criação de formas, competindo
por alimento, o grupo que tiver maior facilidade de criar formações com o menor custo
será aquele que dominará o ambiente. Não é difícil imaginar o mesmo raciocínio sendo
projetado para um enxame de robôs.
A morfogênese de estruturas pré-definidas também estão sujeitas às arbitrariedades
que o ambiente impõe ao enxame, mas ao menos o enxame não precisa projetar uma
estrutura diferente para cada ocasião. O problema aqui é transportar a configuração
desejada para a programação de cada individuo do enxame. Cada robô pode assumir
qualquer parte da estrutura, então o primeiro passo é quebrar essa estrutura em regras
simples. Arbuckle (ARBUCKLE, 2010) resolveu isso transportando as coordenadas
relativas dos vértices das figuras desejadas e também a orientação das linhas para a
programação dos indivíduos do enxame. A partir daí é uma questão de disputa entre
robôs vizinhos para determinar quem vai ser vértice e quem vai ser pedaço de linha.
Já Rubenstein (RUBENSTEIN A. CORNEJO, 2014) transportou o gradiente da figura
desejada, estabelecendo um ponto de começo. Mais uma vez, tem-se uma disputa, todos
22

os robôs se consideram pontos de começo e quando um encontra com outro o protocolo de


disputa é executado e um deles tem que ceder, tornando-se vizinhança do outro robô.

1.1 Objetivos

O objetivo desse trabalho é explorar o processo de desenvolvimento de um algoritmo


de morfogênese para estruturas pré-definidas. Para isso o mesmo está organizado da
seguinte forma: após esta introdução, iniciaremos com a análise dos diversos trabalhos já
publicados que serviram de inspiração para esta pesquisa. Essa revisão, organizada no
capítulo 2 se inicia com alguns trabalhos que não tratam diretamente da morfogênese,
mas abordam questões básicas da dinâmica de enxames e termina por revisar trabalhos
que tratam diretamente da morfogênese de estruturas pré-definidas em enxames de robô.
Adicionalmente o capítulo 2 revisará os conceitos fundamentais de algoritmos genéticos.
Em seguida, no capítulo 3, os algoritmos propostos nos trabalhos revisados no
capítulo 2 serão implementados, ainda que com algumas modificações como: simplificação
do espaço (algoritmos que nos trabalhos originais foram desenvolvidos para um ambiente de
três dimensões, aqui serão implementados para apenas duas), simplificação das dinâmicas
dos robôs (na maioria das implementações os robôs serão tratados como adimensionais e em
todas elas como não possuindo massa e coeficiente de atrito e outras propriedades físicas),
redução de limitações (salvo algumas exceções, na maioria dos algoritmos implementados no
capítulo 3 consideram que o alcance de comunicação de sensores dos robôs é praticamente
ilimitado, em relação ao espaço no qual estão incluídos).
Tendo a base teórica e os resultados práticos dos trabalhos sobre morfogênese, será
possível, no capítulo 4, considerar diversas variáveis no desenvolvimento de um algoritmo
para esta tarefa. Este capítulo abordará o passo a passo e justificará as escolhas feitas na
proposta e durante o projeto de tal algoritmo. É importante realçar aqui que o objetivo
não é a criação do algoritmo em sí, muito menos dar uma alternativa mais viável aos
algoritmos existentes e sim estudar e analisar o processo criativo por trás do mesmo,
estabelecendo parâmetros pelos quais outro pesquisador poderia começar ao desenvolver
uma nova proposta.
Os resultados do algoritmo proposto, sua execução, suas falhas e os pontos de
maior dificuldade no projeto serão apresentados no capítulo 5, que trata da conclusão e
resultados. Além dos capítulos, este trabalho conta com um apêndice para os códigos
implementados em Python e um apêndice com figuras extras com relação à diversas
execuções dos algoritmos implementados.
23

2 REVISÃO BIBLIOGRÁFICA

A revisão bibliográfica deste trabalho está dividida em três partes. Primeiramente


será abordado o desenvolvimento de meta-heurísticas baseadas em comportamento de
enxame. Em seguida será abordado algoritmos genéticos, muitas vezes esses são utilizados
em conjunto com algoritmos de enxame para formar soluções hiper-heurísticas e por fim
será abordado alguns aspectos sobre visão de máquina e reconhecimento de figuras, para
explicar o mecanismo que foi usado na solução aqui proposta.

2.1 Inteligência de Enxame

2.1.1 Definição

De acordo com Beni (BENI, 1993), uma inteligência de enxame é definida como
um grupo de robôs não inteligentes, mas que executando uma tarefa em conjunto, tem a
capacidade de exibir comportamento inteligente e chegar determinados resultados sem que
a forma com a qual o grupo vai alcançar estes resultados seja previsível. Já (BOUFFANAIS,
2016) se refere à inteligência de enxame como um conjunto de respostas de um coletivo
para solucionar certos problemas, o que é mais abrangente e a partir da qual será baseada
a definição de inteligência de enxame neste trabalho.
As primeiras referências ao termo inteligência de enxame são de Beni e de Bonabeau
no fim da década de 80 e início da de 90 (VALDEZ, 2016). Todavia, o programa Boids
(REYNOLDS, 1987) é anterior a primeira referência de Beni que é de 88 e Boids claramente
se trata de um programa com inteligência de enxame, pois, ainda que uma única máquina
execute todo o programa, ela executa uma função simplificada para cada partícula no
sistema, o que de certa forma é emular o papel de várias pequenas máquinas de menor
poder de processamento tentando resolver um problema de trajetória. O fato de Boids ser
um programa de inteligência de enxame antes do termo existir e de Beni ter se referido a
um termo anterior, chamado robôs celulares, mostra que esse tipo de aproximação não é
recente. Para a finalidade deste trabalho, no entanto, só será abordado alguns algoritmos
do Boids em diante.

2.1.2 Boids 1986

O programa Boids foi desenvolvido em 1986 por Craig Reynolds para simular o
comportamento de um bando em voo. Em 87, Reynolds publicou um artigo na conferência
anual SIGGRAPH - Special Interest Group on Computer Graphics Interactive Techniques,
onde não fez referência à abordagem do programa como uma inteligência de enxame.
Todavia, o algoritmo proposto por Reynolds se assemelha muito à abordagem de cardume,
que é um dos modelos de inteligência de enxame que existem hoje.
24

A parte principal do programa se resume a um ciclo de instruções infinito com


apenas duas instruções, a de representar graficamente cada pássaro do bando, de acordo
com sua posição atual e outro de atualizar as posições. O comportamento de enxame está
na função de atualização de posição. Cada pássaro do bando é movido por três regras, a
primeira diz que ele tentará se aproximar do centro de massas do bando. Obviamente não
se trata do centro de massas real do bando e sim aquele que o pássaro percebe. Como
Boids é um programa de comportamento simplificado, cada pássaro consegue perceber
todos os demais do bando sempre e por isso o centro de massas para cada pássaro é o do
bando com exceção dele. Uma representação dessa regra pode ser visto na figura 1

Figura 1 – Regra 1 do comportamento dos pássaros.

A segunda regra evita que os pássaros colidam. O modelo mais simples, usado
no programa Boids, estabelece uma distância mínima de segurança entre os pássaros e
qualquer objeto que eles possam colidir. No caso mais simples esses objetos se limitam
aos demais pássaros do bando. Quando um pássaro detecta que outro encontra-se dentro
dessa distância mínima de segurança, ele se move essa mesma distância, mas em sentido
contrário. Em fato, essa situação é um pouco mais complexa no Boids, já que os pássaros
não são capazes de mudar abruptamente de posição, mas a figura 2 demonstra uma razoável
simplificação da regra 2. É importante lembrar que cada pássaro do bando executa essas
mesmas regras. Se um pássaro A está a uma distância menor que a distância mínima de
25

um pássaro B, A voará para longe de B, no entanto B também terá notado A dentro da


distância mínima e voará para longe de A.

Início para o
pássaro P

Carrega vetor V com


posição dos N
pássaros

soma a diferença
Leu todos os
Não O pássaro
Não O pássaro da posição do
pássaros do do vetor é o está perto pássaro n com o
vetor? pássaro P demais? pássaro P ao
vetor c

Retorna o vetor c

Fim para o pássaro


P

Figura 2 – Regra 2 do comportamento dos pássaros.

Por fim, os pássaros no bando tentam igualar suas velocidades, tanto em intensidade
quanto em direção e sentido. Essa é a regra 3 que é demonstrada na figura 3 e tem estrutura
bem parecida com a regra 1, mas ao invés de tratar de posições, trata de velocidades.
Essas três regras são o suficiente para simular o comportamento de um bando
em voo sem deslocar seu centro de massa. O objetivo do boids era criar animações de
bandos e cardumes com comportamento próximo da realidade. Não existia outro objetivo
para o enxame de elementos se não o próprio comportamento do enxame. No entanto,
ele estabelece conceitos que são seguidos por diversos outros algoritmos de enxame. A
regra 1, por exemplo, tem variações no algoritmo GSO - Gloworm Swarm Optimization
(optimização por enxame de vaga-lumes) e no algoritmo FSS -Fish School Search (busca
por cardume) enquanto a regra 2 e 3 mantém a coesão do grupo e evitam colisões. Essas
3 regras básicas são a chave da dinâmica de sistemas robóticos de enxame.

2.1.3 Stability Analysis of Swarms, 2002

A dissertação de Gazi (GAZI, 2002), aborda as questões de coesão, convergência e


estabilidade de modelos de enxames, explorando os modelos simples de atração e repulsão,
oriundos do boids, modelos de coletores, que envolvem conceitos desde do modelo de reação
26

Início para o
pássaro P

Carrega vetor V com


velocidade dos N
pássaros

soma a velocidade
Leu todos os O pássaro
Não Não do pássaro em
pássaros do do vetor é o
vetor? pássaro P
questão ao vetor
Vv

Retorna o vetor
Vv/(N-1)

Fim para o pássaro


P

Figura 3 – Regra 3 do comportamento dos pássaros.

e difusão de Turing, até o algorítimos de otimização baseado em colônias de formigas,


modelos de agregação e de formação de robôs móveis.
Os capítulos de interesse para este trabalho, são os capítulos 2, 3 e 4. Começando
pelo capítulo 2, Gazi aborda modelos de enxame que se agregam usando uma única regra
de atração e repulsão. No caso esta regra é descrita pela função 2.1, enquanto o enxame
é descrito pela equação de movimento 2.2. De fato, função 2.1 tem a particularidade de
mudar de sinal em determinados trechos descritos pelos coeficientes a,b e c. Gazi explora
esse sistema e demonstra que o centro de massa do enxame é fixo e determinado por
fatores iniciais do sistema, bem como deduz a equação 2.3 que determina a distância
máxima entre um membro do enxame e seu centro de massa, quando as iterações tendem
ao infinito.
||y||2
" #
g(y) = −y a − b exp(− ) (2.1)
c
M
i
g(xi − xj ), i = 1, ..., M
X
ẋ = (2.2)
j=1,j6=i
b c
r
 = exp(0.5) (2.3)
a 2

Gazi segue desenvolvendo modelos de enxame baseados em atração e repulsão no


capítulo 3 de sua tese, onde trata de enxames que tem duas regras em separado, uma
para a atração e outra para a repulsão. Nesse caso o modelo do enxame é expresso pela
27

equação 2.4. No fundo isso não é uma grande diferença do que é visto no capítulo 2, já que
a equação 2.2 é uma simplificação da equação 2.4 e a função 2.1 pode ser dividida em uma
2
função de atração ga (||y||) = a e uma de repulsão gr (||y||) = b exp(− ||y||
c
). No entanto,
com essa separação é possível estudar o efeito de regras diferentes de atração e repulsão.
Gazi, em seu trabalho, acaba por demonstrar que o centro de massa do enxame permanece
fixo para todas essas regras, desde que as funções que as ditem sejam convergentes e
estáveis.
M
i
ga (xi − xj ) − gr (xi − xj ), i = 1, ..., M
X
ẋ = (2.4)
j=1,j6=i

Por fim, no capítulo 4 Gazi explora os efeitos de nutrientes e toxinas, nomes para
definir áreas com marcadores que causam força atrativa ou repulsiva nos elementos do
enxame. O modelo cinemático do enxame segue sendo descrito pela equação 2.4, ou
de forma mais simplificada pela equação 2.2, mas dessa vez a difusão dos nutrientes e
toxinas no ambiente são levados em conta. No caso de uma simulação discreta, o operador
diferencial del (∇) é utilizado sobre as concentrações de nutrientes e toxinas no ambiente e
seu resultado é subtraído da equação cinemática, resultando na equação 2.5. Gazi usa esse
modelo para demonstrar que o enxame converge para o ponto de máxima concentração de
nutrientes, ou miníma de toxinas.
M
i i
g(xi − xj ), i = 1, ..., M
X
ẋ = −∇xi δ(x ) (2.5)
j=1,j6=i

2.1.4 Modelo reação difusão de Turing, 1952

Em 1952 Alan Turing publicou o trabalho de nome "The Chemical Basis of


Morphogenesis"(TURING, 1952) em português: "As bases químicas da morfogênese", sendo
esse seu último trabalho publicado antes de sua morte. No trabalho ele tenta demonstrar
que diversos padrões considerados complexos na natureza como o desenvolvimento de
embriões, de tecidos, de padrões de pétalas de flores podem ser regidas por leis simples de
reação e difusão de substâncias químicas.
Para tanto, Turing considera dois cenários, um sendo um anel de células e outro
um anel fino de tecido e então aplica seis casos diferentes, baseados em condições de
equilíbrio, tamanho da onda de propagação dos reagentes, grau de difusão e disserta sobre
as consequências desses casos nos cenários descritos.
É um trabalho de 37 páginas que envolve uma matemática moderada, como o
próprio autor classifica. Nos concentraremos aqui, em dois trabalhos oriundos do trabalho
de Turing, ambos muito relevantes para o estudo da morfogênese em um enxame de robôs.
28

2.1.4.1 Sistemas baseados no modelo Gray-Scott, 1982

O modelo de Gray-Scott (GRAY, 1983) é uma versão específica do modelo reação-


difusão de Turing para reações autocatalíticas. Enquanto seu trabalho foi direcionado para
aplicações em engenharia química, o modelo tem sido explorado em trabalhos de morfogê-
nese nas ciências da computação como é o caso do trabalho de Munafo (R.P.MUNAFO,
2014).
O trabalho de Gray-Scott não será abordado de forma detalhada aqui, já que o foco
deste trabalho é a morfogênese aplicada para enxame de robôs e o trabalho de Gray-Scott
é bem mais amplo e tem foco bem diferente. Vamos nos apoiar aqui no mesmo ponto
de abordagem de Munafo, no modelo Gray-Scott para reações de autocatálise cúbicas,
representada pelas equações 2.6 e 2.7.
∂A  
= DA ∇2 A − AB 2 + f (1 − A) ∆t (2.6)
∂t
∂B  
= DB ∇2 B + AB 2 − (f + k)B ∆t (2.7)
∂t

As duas equações tratam da variação de concentração de duas substâncias hipoté-


ticas A e B em um tanque. A primeira parte da equação trata da difusão de ambas as
substância pelo espaço. Para tal é usado o operador discreto de Laplace, que nada mais
é que a divergência do gradiente da concentração das substâncias no espaço. No espaço
bidimensional e dentro da aproximação discreta é possível fazer isso aplicando um filtro
sobre cada elemento da matriz. Os coeficientes DA e DB são os de difusão de ambas as
substâncias. Para se obter a formação de padrões é preciso que DA seja maior que DB .
O segundo elemento de ambas as equações tem haver com a própria reação de
autocatálise cúbica. Nela, em um primeiro estágio, uma "molécula"de B reage com uma
de A e cria uma nova B consumindo a A. Em seguida duas moléculas de B reagem com
uma molécula de A, criam uma nova molécula de B, consumindo a de A. Gray-Scott,
usando base teórica na química, mostra que a taxa com que tais reações acontecem são
diretamente proporcionais à concentração da substância A e ao quadrado da concentração
da substância B. Portanto A é consumida por B nessa taxa (e com isso tem sua concentração
local reduzida) ao passo que B é sintetizada nessa taxa (tendo sua concentração local
aumentada).
A última parte dessa equação se refere a taxa com que a substância A é "bombe-
ada"para o tanque e que a B, sintetizada, é retirada do mesmo. A substância A é bombeada
a uma taxa f , porém a concentração de A no tanque é dado em valor proporcional no qual
1 é o valor máximo, sendo assim o fator (1-A) garante que o bombeamento não faça com
que a concentração de A em cada porção do espaço passe da concentração máxima. Já a
substância B é retirada do tanque com uma vazão maior que a qual A é bombeada para o
mesmo, por isso o fator (f + k). Além disso ela escoa com maior vazão dos locais onde
29

tem maior concentração, dessa forma, a concentração de B no tanque nunca será menor
que zero. Por fim, o ∆t no final da equação é o fator de discretização, já que estamos
tratando de uma tradução de um modelo químico para um ambiente digital.

a b c
A B
A A A

A B A
B
A
B B A B

A B
B B B
B
A
B
B B A A
B
B B

Figura 4 – Modelo de autocatálise cúbica para duas substâncias. Em (a) A substância A é


bombeada para o tanque enquanto B é retirada do mesmo. Em (b) A substância A
reage com a substância B em duas etapas, primeiro uma molécula de A reage com
uma de B gerando uma nova molécula de B e depois duas moléculas de B consomem
uma de A para gerar mais uma molécula de B. Em (c) a taxa de difusão de A é maior
do que a de B.

Variando os coeficientes DA , DB , f , k e mesmo as condições iniciais de concentração


de A e B no espaço é possível se obter um grande número de padrões se formando ao longo
do tempo. Obter esses padrões, no entanto não é fácil: a variação de alguns centésimos
em um dos coeficientes em uma configuração que resultava em um determinado padrão,
pode ser o suficiente para que a nova configuração não gere padrão nenhum. Um pouco
dessa variação vai ser explorada, nesse trabalho, na seção 3.3.1 do capítulo 3.
Apesar dos termos substância, molécula, ou reagentes usados nos trabalhos de
morfogênese relacionados ao modelo de Gray-Scott, a situação pode ser traduzida para
crescimento celular sob ação de hormônios inibidores e ativadores, ou mesmo bactérias
crescendo sob a influência de nutrientes e toxinas. Sendo assim, a morfogênese, nesse caso
pode, dentro de certos limites, ser transportada para a questão da criação de padrões
por enxames do robôs. Todavia, por mais que tal método resulte em uma diversidade de
padrões no mínimo interessantes, é preciso que ele seja adaptado a outros mecanismos
para ter melhor aproveitamento em um enxame. Um bom exemplo disso é o trabalho de
Shen, tratado na subseção à seguir.

2.1.4.2 Hormone-Inspired Self-Organization and Distributed Control of Robotic Swarms,


2004

O trabalho de Shen usa modelo digital de hormônio, em inglês Digital Hormone


Model (DHM), para controlar o agregamento, a distribuição e a organização de robôs em
30

um enxame (SHEN P. WILL, 2004). Nele, ele dá uma reinterpretação para o trabalho de
Turing, transformando as células em robôs e o grau de difusão das substâncias como o
raio de alcance de algum sistema de comunicação.
O Modelo digital de hormônio - Digital Hormone Model (DHM) baseia-se em
um cenário onde exista um conjunto de indivíduos que tem a capacidade de formarem
agrupamentos, ingressarem em agrupamentos existentes, ou deixarem os agrupamentos aos
quais pertencem livremente. Além disso, dentro dos agrupamentos, os indivíduos podem
formar sub-agrupamentos formando topologias específicas. Esse cenário é comum tanto a
enxames de robôs quanto a redes de sensores sem fio (RSSF), sendo no primeiro caso os
indivíduos sendo os próprios robôs e no segundo sendo os nós da rede, já os agrupamentos
podem ser agregações físicas no enxame de robôs, ou conexões de comunicação, caso
que se aplicaria tanto em enxames quanto em Redes de sensores sem fio (RSSF). Nesse
cenário, os protocolos de decisão e comunicação são os mesmos para todos os elementos do
conjunto, todavia as respostas individuais variam de acordo com o "hormônio"aos quais os
indivíduos estão sendo expostos e sua hierarquia na topologia do conjunto. Dessa forma
dois indivíduos num mesmo conjunto, expostos ao mesmo hormônio, mas em topologias
diferentes, poderão expressar respostas diferentes. Em analogia isso é parecido com o
que acontece com as células do nosso corpo, duas células espacialmente próximas, mas de
tecidos diferentes, podem ter reações diferentes a um mesmo hormônio.
O DHM tem 3 componentes, um especificação de uma rede dinâmica, uma função
probabilística do comportamento de cada um dos indivíduos e uma função de reação e
difusão. O primeiro componente trata de um conjunto de regras nas quais os indivíduos
se baseiam para entrar ou sair de uma rede. No caso do artigo, eles usam uma rede
dinâmica de enxame de robôs, em inglês Dynamic Network of Swarm Robots ou DNSR,
que consiste de N robôs cada qual com conectores que podem ser usados para formar nós
de comunicação ou acoplagem física. Cada robô tem um conjunto finito de conectores,
dessa forma as conexões que ele pode formar são limitadas. Portanto, numa situação onde
um robô esteja usando todos os seus conectores estejam ocupados e o robô precise realizar
uma nova conexão, ele precisará primeiro desfazer de uma antiga. Com isso a cada tempo
t a rede terá uma topologia diferente. Portanto, a Rede dinâmica de enxame de robôs
- Dynamic Network of Swarm Robots (DNSR) do tempo t, pode ser escrita como uma
função baseada nos N indivíduos que a compõe naquele período e dos E nós de conexão
que existem também relativos ao mesmo período de tempo (equivalência 2.8).
O segundo elemento, a função probabilística do comportamento de cada indivíduo
(equação 2.9), é uma analogia aos receptores das células que compõe os organismos vivos.
Essa função é baseada em fatores ambientais, como o as informações dos conectores C dos
indivíduos, sensores S dos mesmos, variáveis ambientes V e informações hormonais H. O
resultado é alguma ação dentro do conjunto de ações B que o robô pode tomar.
31

Para o terceiro elemento, Shen usa um modelo de reação-difusão-dissipação de


elementos em duas dimensões, descrito pela equação 2.10, onde C é a concentração dos
Hormônios, x e y são as distâncias nos eixos cartesianos do ponto de difusão, R é a
função de reação e b o coeficiente de dissipação. R leva em conta todos os hormônios que
compõe C e a equação 2.10, em um modelo mais elaborado, pode ser parte de uma função
ambiental, que vai lidar com questões como interferência na comunicação entre dois robôs.

DN SRt ≡ (Nt , Et ) (2.8)


P (BkC, S, V, H) (2.9)
!
∂C ∂ 2C ∂ 2C
= a1 2 + a2 2 + R − bC (2.10)
∂t ∂x ∂y

As três componentes descritas são a base do DHM, alguns outros elementos podem
ser adicionados, mas geralmente são externos e complementares ao sistema que usa o
modelo de hormônios. Usando o DHM, cada integrante do enxame segue uma rotina
individual descrita na figura 5. No seu trabalho, Shen utilizou as funções de desvio padrão
como regra de emissão de hormônios para os robôs, no entanto ele projetou isso em uma
matriz discreta e como cada robô é representado por uma célula de tal matriz, o resultado
foi quadrados concêntricos de valor variável. A função R se limitou a uma soma simples
da concentração dos dois hormônios utilizados, o ativador e o redutor.
Na demonstração utilizada em seu trabalho, Shen utilizou um conjunto B de 10
ações, sendo a primeira ação a de emitir hormônios e as demais seriam mover-se para uma
das 8 células da vizinhança do elemento, ou permanecer no mesmo lugar. O conjunto
de conectores C de cada robô é um total de 8 cada um equivalendo a uma célula da
vizinhança do robô na matriz. Os sensores S se limitam à vizinhança de uma célula em
torno do robô e à célula ao qual o robô pertence. Shen não usou variáveis V ambientais e
os hormônios H são o resultado dos valores dos 9 sensores S. Para decisão de movimento,
Shen aplicou uma função de forma que o robô busque se aproximar do maior valor de
ativador e desviar do maior valor de inibidor na sua vizinhança.
Shen tenta com isso responder a uma série de perguntas, como: se o DHM consegue
fazer com que os elementos de um enxame se organizem em padrões; se a densidade
populacional regional influência no resultado final; de que forma, mantendo determinadas
condições, um modelo usando DHM se aproxima de observações biológicas reais; como
que os perfis de difusão dos hormônios influenciam no padrão resultante e se qualquer
perfil arbitrário resulta em auto-organização.
Para isso foram conduzidas duas experiências em seu trabalho. A primeira visava
observar os impactos da densidade de elementos na formação de padrões e para isso foram
preparadas 4 matrizes 100 por 100 com concentrações de 10%, 25%, 50% e 75% de robôs.
Em todas as matrizes os robôs tinham o mesmo perfil hormonal. Foi observado no trabalho
que a densidade tem pouco impacto no resultado final: concentrações altas tendem a
32

Inicio

Selecionar ações
com base em
P(B|S,V,H)

Executar ação em B

Gerar e propagar
hormônio H

Simular difusão e
dissipação dos
hormônios

Fim

Figura 5 – Função probabilística de decisão dos elementos do enxame.

formar listras enquanto concentrações baixas formam ilhas de robôs agregados, mas com
as dimensões dessas estruturas variando muito pouco em função da densidade robótica
nas matrizes.
No segundo experimento, as quatro matrizes tinham a mesma densidade robótica,
porém cada uma tinha robôs com perfil hormonal diferente. A matriz cujo o perfil hormonal
continha mais inibidores que ativadores não chegou a apresentar nenhuma formação de
padrão ao longo das iterações. À medida que a proporção de ativadores por inibidor
foi aumentando, não só a formação de padrões foi acontecendo, como o tamanho dos
agrupamentos foi aumentando. O artigo mostra também que ambos os resultados condizem
com as observações no meio biológico. Por fim, Shen explora as possibilidades do uso
do DHM em um enxame de robôs, como busca por alvo, monitoramento de prédios e
reparo de formação. No entanto para este trabalho o funcionamento do DHM e seu uso
na formação de padrão é que são o objeto de interesse.

2.1.5 A New Kind of Science, 2002

O livro de Wolfram (WOLFRAM, 2002) é considerado o reavivador do estudo das


inteligências de enxame nos anos 2000 de acordo com (BENI, 2004). Em seus 12 capítulos,
33

Wolfram explora o conceito de autômato celular, um elemento simples, matematicamente


bem definido, que por repetição de algumas regras pré-determinadas consegue criar padrões
complexos, podendo alguns casos serem pseudo-randômicos e em outros, convergir de uma
aleatoriedade inicial para uma situação de ordem final.
Para este trabalho no entanto, o capítulo 3 é o fundamental. Nele são abordados
os modelos mais simples de célula autômata, que criam padrões com base no valor lógico
de uma célula e suas vizinhas. Isso cria uma regra de código binário de 8 bits, cada qual
descrevendo um padrão diferente.
Para um melhor entendimento de como funciona essas regras, vamos considerar
uma matriz espacial C. Cada célula dessa matriz é um autômato celular e cada linha da
matriz se refere à uma iteração. A regra leva em conta o estado lógico do autômato celular
e dos seus vizinhos na linha, para determinar o estado lógico da célula abaixo. Cada bit
da regra é referente a uma condição: O primeiro bit é referente ao caso onde a célula e
seus vizinhos tem valor igual a um, o segundo bit é para o caso do vizinho da esquerda e a
célula em questão estarem com valor igual a um e o da direita estar com valor igual a zero
e assim por diante, até o oitavo bit, que é o caso das três células estarem com valor zero.
O valor de cada bit é o valor que a célula da próxima geração deve ter, caso a condição
referente ao bit seja alcançada.
Por exemplo a regra 250: o valor binário é 11111010. Logo quando um autômato
celular ci,j tiver valor igual a 1 e seus vizinhos da direita e da esquerda ci,j−1 e ci,j+1
tiverem valor igual a um também, o seu "filho"ci+1,j na próxima geração, vai ter valor igual
a um. No entanto, um dos casos que pode causar um filho com valor zero é quando o
autômato estiver com valor 1, mas seus vizinhos forem de valor zero. De modo geral, o
que a regra nos diz é que para 111 temos 1, 110 temos 1, 101 temos 1, 100 temos 1, 011
temos 1, 010 temos 0, 001 temos 1 e 000 temos 0.
Usando essa norma básica e regras diferentes, padrões com características base
distintas são formados. A regra 250 forma uma estrutura de repetição, já a 90 forma uma
de aninhamento. O padrão formando pela regra 30 beira a aleatoriedade e o 110 possui
estruturas localizadas.
Ainda no capítulo 3, Wolfram vai além da base binária, mostrando regras em base
3, criando estruturas onde os autômatos podem ter mais um estado; Autômatos móveis,
no qual além da regra de formação, existe também uma regra de ativação (dessa forma,
nem todo autômato gera um descendente); Máquinas de Turing, que pode ser interpretado
como uma versão mais complexa dos autômatos móveis; Máquinas de registro, basicamente
um modelo de como funciona o hardware computacional nos níveis mais baixos e Sistemas
de substituição.
Sistemas de substituição são outro fundamento importante no estudo da morfo-
34

Figura 6 – Padrões formados por regras diferentes. Da esquerda para a direita de cima para
baixo: regra250, regra90, regra30 e regra100

gênese, principalmente quando queremos fazer analogia com a formação de estruturas


biológicas. Os sistemas de substituição são aqueles onde um determinado padrão, quando
processado, é substituído por ele acrescentado de um grau de complexidade. Por exemplo,
vamos supor que temos uma regra de substituição na qual a letra I deve ser substituída pelas
letras IF, o F nesse caso é o aumento na complexidade de I. IIIII, sob essa regra se torna IFI-
FIFIFIF. Podemos incrementar essa regra, dizendo que, além de I gerar IF, o F gera FIFI.
Assim IFIFIFIFIF, vira (IF)(FIFI)(IF)(FIFI)(IF)(FIFI)(IF)(FIFI)(IF)(FIFI)(IF)(FIFI),
ou seja IFFIFIIFFIFIIFFIFIIFFIFIIFFIFIIFFIFI. Talvez um exemplo visual seja melhor!
A figura 7 mostra uma regra de criação de uma árvore. O tronco ou galho azul gera um
tronco ou galho azul com uma continuação vermelha. Já o tronco ou galho vermelho,
gera uma ramificação de galhos vermelho e azul. Aplicando essa regra algumas vezes,
fazemos com que um elemento simples, de um componente e geometria simples se torne
um elemento composto de várias ramificações e geometria fractal.

Figura 7 – Formação de uma árvore por regra de substituição


35

Muitas regras de morfogênese complexas tem base nessas duas regras simples, a de
comparação e projeção e a de substituição. A própria difusão, usada no modelo reação
difusão de Turing, em um nível mais básico e discreto, não deixa de ser uma comparação
(do valor de concentração de uma célula com suas vizinhas) e projeção (média ponderada
da vizinhança) e a um nível um pouco maior, uma substituição (a concentração de uma
célula é substituída por um conjunto de 8 células com essa concentração distribuída). O
entendimento dessas regras, que se dá de forma clara no trabalho de Wolfram, acaba se
tornando uma ferramenta muito útil no desenvolvimento de algoritmos de morfogênese.

2.1.6 Self-Assembly and Self-Repair of Arbitrary Shapes by a Swarm of Reactive Robots:


Algorithms and Simulations, 2010

A maioria dos trabalhos citados nessa revisão tratam-se de estudos que descrevem
como certas condições influenciam na morfogênese de um enxame. O trabalho de Arbuckle
(ARBUCKLE, 2010) difere desse padrão. Ele define um protocolo que, em conjunto com
informações de vértices e linhas da forma desejava, ele é capaz de fazer com que um
enxame de robôs crie uma ou mais dessas formas.
Arbuckle trata os robôs em seu trabalho como quadrados, de dimensões arbitrárias
e insignificantes, alinhados aos à grade formada pelos eixos x e y do espaço do espaço
ao qual pertencem e que só conseguem se comunicar e detectar robôs que estejam na
vizinhança próxima. Tal definição, de acordo com o autor, se aproxima de como que se
imagina que será o comportamento e limitações dos nano robôs, estes sendo nada mais
que conjunto moleculares complexos, só terão poder de ação para com outras moléculas
no seu raio de reação.
O algoritmo consiste em 4 tipos de mensagens, crescimento de linha, crescimento
de vértice, resposta de linha e resposta de vértice, tais mensagens organizadas em 10
regras, cada uma definida por um tipo de entrada e coordenando um tipo de saída. Por
exemplo a regra 1 se refere a quando um robô receber a mensagem de crescimento de
linha com a posição P maior que zero, para uma linha de tamanho L (essa mensagem
é escrita no arquivo como GE(X, P > 0, L)). A regra 1 define que o robô deve dar a
resposta de crescimento de linha, posição P-1, para linha de tamanho L, para o robô
seguinte F : GE(X, P − 1, L). Ou seja, a regra 1 basicamente diz que se um robô é parte
do meio de uma linha, o próximo vai ser da mesma linha.
Todas as demais regras estão dentro da mesma lógica. A regra 2 por exemplo,
define a resposta para quando o robô recebe a mensagem de crescimento de linha com
a posição P igual a zero para uma linha de tamanho L GE(X, P = 0, L)). Nesse caso a
resposta do robô deve ser um crescimento de vértice para o próximo robô F : GV (X). Um
exemplo ilustrado das regras pode ser visto na figura 8.
O artigo segue explicando como que são tratadas diagonais e curvas: Ambos os
36

AV(X)

GE(X,1,1) GE(X,0,1) GV(X) GE(X,3,3)


E

A A B A B C A B C D A B C D

A = V0 AV(X) AE(X,1,1) AE(X,0,1)

Figura 8 – Trocas de mensagens na montagem de uma formação. No primeiro quadro o robô A


é um vértice. No segundo ele e um robô B acoplam. Por algum critério de decisão B
resolve aceitar A como vértice e A nomeia elemento 1 de uma linha de tamanho 1.
No terceiro um robô C acopla e aceita a posição de B, B nomeia C o elemento 0 da
linha. Em seguida um robô D acopla em C, D aceita a posição de C e C, sendo o
elemento 0, nomeia D como o próximo vértice. Sendo um vértice, D não pode aceitar
acoplamentos na mesma direção do robô que o nomeou vértice, assim, só vai nomear
uma nova linha quando o robô E acoplar numa posição possível (último quadro)

casos são discretizados para uma série de pequenas retas alinhadas com x e y. O algoritmo
também consegue preencher uma figura: orientando-se pelos vértices, os robôs, em uma
formação, sabem onde fica o lado de "dentro"e o de "fora". Se um robô faz parte de uma
linha e outro robô acopla nele pelo lado de "fora"e não em continuidade à linha. O robô
abandona a linha e se move para dentro da formação enquanto o que estava do lado de
fora assume a posição do antigo na linha. Isso é feito, claro, sempre que houver espaço no
interior da formação.
No final do artigo, Arbuckle apresenta diversas formações feitas pelo enxame usando
o algoritmo. Entre as formações, temos figuras côncavas, convexas, preenchidas, ocas, com
linhas internas, diagonais e curvas. Em enxames com quantidade de robôs muito maior
do que o necessário para criar a figura, mais de uma cópia do padrão programado é feita,
mostrando assim que todos os elementos do enxame tem a mesma programação e que
apenas os encontros é que vão determinar qual o papel de cada um na estrutura a ser
formada.

2.2 Algoritmos Genéticos

Algoritmos genéticos não são responsáveis por fazer com que um enxame assuma
uma determinada forma, mas são ferramentas poderosas para encontrar os valores de
determinados coeficientes de algoritmos morfogênicos, relacionados a uma determinada
forma. A base teórica utilizada neste trabalho vem do livro Inteligência Artificial, Teoria
e Prática (ARTERO, 2009). O livro trata apenas o básico dessa ferramenta, tendo um
aspecto introdutório, no entanto é o suficiente para os objetivos desse trabalho.
Artero define algoritmos genéticos como sendo um método heurístico, baseado na
37

seleção natural, onde diversas configurações de um programa são testadas e as com os


melhores resultados são selecionadas para a próxima geração. Com isso, existem pontos
chaves para o uso dessa heurística, como indivíduos com parâmetros definidos, mas de
valor variável e um objetivo de seleção.
Indivíduos são qualquer elemento que se pretende melhorar pelo uso da heurística.
Pode ser por exemplo um robô, ou um programa. Já os parâmetros são uma série de
variáveis que impactam, ou imagina-se impactar no resultado final do indivíduo no objetivo
de seleção. Por exemplo, se pegarmos os algoritmos baseados no modelo de reação-difusão,
para as mesmas concentrações iniciais, os parâmetros em relação à forma final são os
coeficientes de difusão dos reagentes, a taxa de alimentação do tanque f e a taxa de
morte k. Podemos pegar uma população de 100 concentrações iniciais iguais e variar esses
coeficientes de forma a termos 100 figuras finais diferentes.
O objetivo da seleção é um critério fixo e bem definido sobre a taxa de sucesso
de um indivíduo. No exemplo anterior, o objetivo da seleção pode ser o quão as figuras
formadas se parecem com uma determinada forma. É importante notar que o objetivo de
seleção pode ser a parte mais delicada de um algoritmo genético, se ele não for preciso o
suficiente, ele pode conduzir as gerações para uma evolução indesejada.
Seguindo o exemplo anterior, a forma com que o resultado final de cada geração
seria comparada com a figura desejada pode influenciar muito em como a evolução é
conduzida. Suponhamos que a comparação se trata de uma pixel à pixel simplificada:
a concentração de reagentes do resultado de um indivíduo em uma geração é subtraído
da concentração de reagentes desejada. Isso pode acabar por conduzir a evolução para
espécimes que o reagente não se expanda, ou mesmo que ele desapareça com o tempo, pois,
não tendo o reagente, o erro vai ser a soma de concentrações na matriz objetivo e isso
pode facilmente ser menor que a maioria dos erros que envolve o reagente se expandindo e
tomando forma.
Se o método de seleção for comparar apenas as regiões onde o reagente, na matriz
objetivo, está acima de um certo limite, buscando essas concentrações na mesmas células
nas matrizes geradas pelos indivíduos, o que pode acontecer é que o algoritmo genético
estimule o crescimento dos indivíduos sem critério nenhum. Uma comparação de formas,
usando um algoritmo de visão de máquinas mais desenvolvido pode ser um critério melhor?
Pode, mas geralmente a busca do teste correto é a parte trabalhosa de um algoritmo
genético e envolve tentativas e análises de como o algoritmo está conduzindo a evolução.
Com os parâmetros e o critério de seleção bem definidos, o algoritmo genético
processa cada um dos indivíduos e os classifica por rendimento. Ele seleciona então os
melhores indivíduos e elimina os demais. Depois, com base nos indivíduos selecionados,
ele cria novos, complementando a quantidade de indivíduos. Se na primeira geração, por
exemplo, haviam 100 indivíduos, o algoritmo vai selecionar 50, eliminar outros 50 e com
38

base nos 50 selecionados ele vai criar 50 novos.


A forma como os novos indivíduos são criados também varia de acordo com a
abordagem. Artero expõe uma um tanto complexa, no qual os parâmetros dos indivíduos
selecionados são mesclados para formar novos espécimes, existindo também uma chance
de mutação em alguns dos parâmetros.
Uma forma mais simples envolve apenas a mutação e é uma analogia à divisão
celular. Os indivíduos selecionados são clonados e depois os clones sofre uma mutação
aleatória em algum dos seus parâmetros. Um bom exemplo é o simulador de evolução de
Cary Huang (HUANG, 2016), que seleciona realiza a evolução de indivíduos com base no
deslocamento linear dos mesmos.
A partir dessas etapas, com diversas gerações, o algoritmo genético consegue se
aproximar de uma boa configuração para a solução de uma determinada tarefa. Mas Astero
não reduz o uso dessa heurística para apenas isso. Coletando dados sobre os parâmetros
ao longo das gerações é possível descobrir quais tem maior impacto na tarefa desejada
e até mesmo se havia algum parâmetro, ao qual se julgava ser impactante no resultado
final, mas que na prática acabava por não ter impacto nenhum, ou mesmo que exercia
influência oposta à que se previa.

2.3 Visão de máquina e reconhecimento de padrões

Os conceitos sobre visão de máquina e reconhecimento de padrões utilizados nesse


trabalho foram tirados dos livros Inteligência Artificial, Teórica e Prática (ARTERO,
2009) e Introdução à Robótica (NIKU, 2013). Basicamente ambos afirmam que estes
processos pouco diferem dos métodos de inteligência artificial existentes, em especial das
redes neurais. As imagens nada mais são do que matrizes cujo o valor das células variam
em intensidade, influindo assim na concentração de cor de um determinado pixel. As
poucas variações que existem desse processo são casos de imagens tridimensionais formadas
por mapeamento (laser, ou ultrassom). Não se tratam de imagens propriamente ditas,
mas entram na categoria de visão de máquina e ao invés de fornecerem matrizes com
intensidade de cores, ou escala de cinza, fornecem um vetor com um conjunto de vértices
de 3 coordenadas.
Dentro das imagens convencionais, não é de interesse, nesse trabalho, chegar a
implementar algum mecanismo de Inteligência Artificial (IA) para o reconhecimento de
padrões. Já se considera que o desenvolvimento e implementação do algoritmo de enxame
proposto vá demandar tempo e a primeira versão, não otimizada provavelmente consumirá
bastante capacidade computacional, de modo que implementar uma IA em seguida pode
ser muito custoso com relação ao tempo disponível.
Todavia, é comum que, na visão de máquina, as imagens passem por um pré-
39

processamento a fim de filtrar as informações da mesma, modificar a forma de leitura, ou


mesmo realizar uma detecção de padrões primitiva. Um exemplo desse pré-processamento é
o uso da transformada de Fourier discreta - discrete Fourier transform (DFT) transformar
a imagem para o domínio da frequência, isso possibilita uma gama diferente de operações,
mas geralmente não diminui a complexidade da mesma.
Outro método de pré processamento é a compressão da imagem em um vetor de
uma dimensão. Existem diversos métodos de compressão generalistas, mas se o sistema
vai trabalhar com um imagens que apresentem características muito próximas, o ideal
é usar um método especializado de compressão. No entanto a maioria desses métodos
especializados envolvem uma rede neural.
Reconhecimento de linhas e vértices são possíveis por diversos algoritmos diferentes,
o mais comum é a aplicação do filtro de Sobel sobre a imagem, isso acada por gerar
duas matrizes com linhas variando de acordo com sua orientação. A sobreposição dessas
matrizes revela os vértices côncavos da imagem. Em imagens binárias, alguns outros
métodos podem ser interessantes. A compressão da imagem em um vetor de posições
relativas pode ser um método poderoso de comparação de imagens sem a necessidade de
uma IA. É a partir desse método que desenvolveremos parte do processo de morfogênese
proposto nesse trabalho.
40

3 IMPLEMENTAÇÃO DOS ALGORITMOS EXISTENTES

Neste trabalho foram implementados alguns dos algoritmos existentes a fim de se


obter uma melhor compreensão dos sistemas baseados em inteligência de enxame. Todas
as implementações foram feitas na linguagem python (ROSSUN, 2015), usando os módulos
numpy (OLIPHANT, 2006) para facilitar o tratamento vetorial e o módulo matplotlib
(JUNTER, 2007) para fazer as representações espaciais dos enxames e o desenho dos
gráficos.

3.1 Boids

Como explanado na revisão bibliográfica 2.1.2, este programa foi criado para fazer
simulações gráficas de um bando em voo. A primeira implementação desse algoritmo neste
trabalho levou em conta apenas as três regras básicas vistas na figura 9. Para simplificação,
os pássaros aqui são adimensionais, sendo representados por pontos no espaço, sendo assim,
não houve preocupação, nesse trabalho, de como seria realizada a mudança de direção na
movimentação dos elementos do bando. A variação de direção, nessa simplificação, pode
ser aplicada diretamente ao indivíduo, ao invés de ter que ser aplicada gradualmente por
meio de variação angular. Outra simplificação aqui aplicada foi a limitação espacial de
duas direções, ao invés do usual de três.

a b c

Figura 9 – 3 regras básicas do algoritmo boids. Em (a) temos a tendência dos pássaros de se
aproximarem do centro de massa relativo ao resto do bando. Em (b) a resposta
evasiva quando algum outro pássaro, ou objeto entra no raio de segurnaça do mesmo.
Em (c) a tendência dos pássaros em ajustarem suas velocidades com relação às demais
do bando.

Na execução do algoritmo usando apenas as regras básicas descritas em A.1.1,


A.1.2, A.1.3 e a função de atualização de posição e velocidade em A.1.4, os pássaros são
aleatoriamente dispostos no espaço, cada qual com velocidade zero. A cada iteração o
algoritmo aplica as três regras a cada elemento do bando e calcula sua nova velocidade
e posição. O resultado, como pode ser visto na figura 10, ou acessado no vídeo boids
(MOELLER, 2018b), é inicialmente o bando convergindo para o centro de massa do mesmo
41

e depois tendo seus elementos se movendo em torno desse ponto de forma desordenada,
mas mantendo sempre uma certa distância.

Figura 10 – A evolução do bando durante a execução do algoritmo Boids com apenas as 3 regras
básicas

Com apenas as três regras, o centro de massa do bando permanece o mesmo durante
todo o tempo. É possível demonstrar isso analisando matematicamente o efeito de cada
uma das regras nas posições e portanto no centro de massa. Em fato, cada posição no
instante i + 1 é resultado das somas da posição e velocidade do instante i conforme aa
equação 3.1 mostra. Já a velocidade em cada instante é igual a velocidade no instante
anterior com as três componentes oriundas das três regras.

p( i + 1) = pi + vi (3.1)
v( i + i) = vi + r1i + r2i + r3i (3.2)

Em qualquer instante, o centro de massa c do bando é expresso pela equação 3.3,


enquanto no instante posterior temos a equação 3.4. Substituindo a equação 3.1 e 3.2 em
3.4, temos a equação 3.6.

N
1 X
ci = pn,i (3.3)
N n=1
N
1 X
ci+1 = pn,i+1 (3.4)
N n=1
N
1 X
= pn,i + vn,i (3.5)
N n=1
N
1 X
= pn,i + vn,i−1 + r1n,i−1 + r2n,i−1 + r3n,i−1 (3.6)
N n=1

O somatório da equação 3.6 pode ser desmembrado e cada um dos seus elementos
analisado separadamente. Assim temos:
N N N N N
1 X X X X X
ci+1 = ( pn,i + vn,i−1 + r1n,i−1 + r2n,i−1 + r3n,i−1 ) (3.7)
N n=1 n=1 n=1 n=1 n=1
42

A regra 1 retorna a convergência dos pássaros para o centro de massa relativo do


bando, para um pássaro p cr,p , ou seja o centro de massa levando em conta todo o resto
do bando, mas não o pássaro que está observando o bando. Podemos expressar o centro
de massa relativo pela equação3.8. A regra 1 determina as componentes de velocidade
de um pássaro p para se dirigir para essa nova posição, ou seja, a diferença entre o cr,p
e a posição do pássaro p determinada por pp . Um fator de taxa de aproximação V diz
o quanto dessa velocidade será aplicada na iteração i. Isso pode ser escrito na forma de
equação 3.9. Aplicando esta à parcela do somatório referente à regra 1 na equação3.6
temos a equação 3.14:
n=N
1 X
cr,p = pn (3.8)
N − 1 n=1,n6=p
r1p = V (cr,p − pp ) (3.9)
n=N
1 X
= V( (pn ) − pp ) (3.10)
N − 1 n=1,n6=p
N N m=N
X X 1 X
r1n = V( (pm ) − pn ) (3.11)
n=1 n=1 N − 1 m=1,m6=n
N N
X 1 X
= V ( (pm ) − pn ) (3.12)
n=1 N − 1 m=1,m6=n
N N N
X 1 X X
= V( ( (pm )) − (pn )) (3.13)
n=1 N − 1 m=1,m6=n n=1
N N N
1 X X X
= V( (pm ) − (pn )) (3.14)
N − 1 n=1 m=1,m6=n n=1

O somatório duplo sobre as posições na equação 3.14 significa N sequências de


posições somadas, cada qual sem uma das posições. Isso resulta em N − 1 vezes a soma
de todas as posições e pode ser expressa pela equação 3.15 que a aplicada à equação 3.14,
resulta no valor zero, demonstrando que a primeira regra não influência no centro de massa
do bando.
N
X N
X N
X
(pm ) = (N − 1) pn (3.15)
n=1 m=1,m6=n n=1
N N N
X 1 X X
r1n,i−1 = V ( (N − 1) (pn ) − (pn )) (3.16)
n=1 N −1 n=1 n=1
N
X N
X
= V( (pn ) − (pn )) (3.17)
n=1 n=1
= 0 (3.18)

A regra 2 diz que um pássaro vai se distanciar de outro pássaro quando este estiver
dentro de uma distância d. Matematicamente, isso pode ser expresso como a soma das
diferenças entre a posição do pássaro pp e todos os que estiverem dentro do seu limite de
43

segurança e isso é visto na equação 3.19. O fato é que cada pássaro dentro desse limite
de segurança leva em consideração o pássaro pp no seu próprio limite de segurança. O
somatório da equação 3.19 pode ser aberto em dois (equação 3.20) demonstrando que a
posição do pássaro pp tem o peso dos M pássaros em seu limite de segurança. Todavia
cada um desses pássaros terá a posição pp na sua parcela negativa da regra dois. Assim o
somatório das regras 2 do bando é também nula.
M
X
r2p = (pp − pm ) (3.19)
m=0
M
X
= M pp − pm (3.20)
m=0
N
X
r2n = Mn (pn − pn ) (3.21)
n=0
= 0 (3.22)

A regra 3 segue a mesma lógica da regra 1. A regra 3 para cada pássaro é


resultado da média de velocidade dos demais pássaros do bando menos sua velocidade vp e
multiplicados por um fato S que é quão rápido essa atualização de velocidade pode-se dar,
isso escrito na equação 3.23. Aplicando o somatório da regra 3 aplicada aos N pássaros do
bando, podemos utilizar o mesmo desenvolvimento da equação 3.10 até a 3.18 e chegar ao
resultado de 0, mostrando que a terceira regra também não influência no centro de massa
do bando.
N
1 X
r3p = S( (vn ) − vp ) (3.23)
N − 1 n=0,n6=p
N N N
X X 1 X
r3n = S ( (vm ) − vn ) (3.24)
n=0 n=0 N − 1 m=0,m6=n
N N N
1 X X X
= S( (vm ) − (vn )) (3.25)
N − 1 n=0 m=0,m6=n n=0
N
X N
X
= S( (vn ) − (vn )) (3.26)
n=1 n=1
= 0 (3.27)

Aplicando os resultados dos somatórios das três regras à equação 3.7 temos que
o centro de massa do bando c em um instante i + 1 é igual o somatório das posições da
iteração anterior com as velocidades de duas iterações antes (equação 3.28). As velocidades
em um instante são a soma das velocidades da iteração anterior com as três regras, mas
vimos que o somatório das três regras aplicadas a todo o bando é zero, portanto, ao
desdobrarmos as velocidades vamos chegar no único conjunto de velocidades que pode
influenciar o centro de massa do bando, que são as velocidades iniciais dos pássaros
(equação 3.29). As posições também podem vir sendo abertas tal qual foi feito no processo
44

das equações 3.3 à 3.5, resultando em posições anteriores e velocidades, chegando até
às posições iniciais e velocidades iniciais. Como foi dito no início dessa seção, fizemos
essa execução com velocidade inicial igual à zero para todos os pássaros, portanto está
demonstrado que o centro de massa do bando permanece estático durante toda a execução
do algoritmo.
N
X
ci+1 = (pn,i + vn,i ) (3.28)
n=1
XN
ci+1 = (pn,0 + (i + 1)vn,0 ) (3.29)
n=1
XN
ci+1 = pn,0 (3.30)
n=1

No algoritmo aqui implementado, os pássaros são dispostos em posições aleatórias


no espaço. A tendência inicial é a convergência para o centro de massa do bando, pois a
regra 1 tem maior impacto que a regra 2 quando a distância entre os pássaros é maior.
À medida que se aproximam do centro e portanto, uns dos outros, eles começam a se
repelirem e isso faz com o valor das distâncias entre os pássaros e o centro variem dentro
de uma faixa. O bando se expande e se comprime com certa regularidade, como é possível
ver na figura 11.

Figura 11 – Distâncias máxima, média e mínima dos pássaros com o centro de massa do bando

É de se supor que o limite de segurança dos pássaros é uma variável responsável


pela distância dos pássaros com relação ao centro de massa do bando. Experimentalmente
foi possível determinar isso observando a figura 12. Tal gráfico foi obtido com a média
das distâncias dos pássaros em 200 iterações, em 200 bandos diferentes, com limites de
segurança variando 0.5 entre cada bando.
45

Figura 12 – Variação de distância média em relação ao centro de gravidade do bando por limite
de segurança

A quantidade de pássaros no bando, no entanto, tem influência inversamente


proporcional a média de distância dos mesmos em relação ao centro de massa do bando.
O gráfico 13, mostra uma distância média decrescente em bandos de 3 a 200 pássaros.
Quanto mais pássaros em um bando, maiores as chances de pássaros entrarem no limite
de segurança uns dos outros por direções opostas, fazendo com que a resultante da regra 2
seja mínima.

Figura 13 – Variação de distância média em relação ao centro de gravidade do bando por tamanho
do bando

Apesar do objetivo do algoritmo Bird-oid object (Boids) não ser criar formas,
muitos algoritmos de enxame, como o Optimização por enxame de vaga-lumes - Gloworm
46

Swarm Optimization (GSO) e o Busca por cardume - Fish School Search (FSS) herdam
a dinâmica deste. O conhecimento do comportamento do centro de massa do bando,
por exemplo, tem utilidade na morfogênese para guiar aglomerados robóticos enquanto a
distância média dos robôs pode ser utilizada para manipular a densidade local.
Para compreender melhor essa dinâmica, neste trabalho foi implementado também
uma outra versão do algoritmo Boids, dessa vez com um bando e um enxame. As regras
internas ao bando e ao enxame são as mesmas três regras básicas. O bando se move em
direção ao enxame usando uma quarta regra, na qual cada pássaro é atraído também
para o centro de gravidade do enxame, enquanto os insetos seguem uma regra 5, a qual
determina que os insetos tomam uma rota evasiva quando os pássaros se aproximam. O
resultado pode ser visto na figura 14 e no vídeo boids vs swarm (MOELLER, 2018c), em
ambos é possível observar deslocamento do centro de massa, tanto do bando quanto do
enxame, de acordo com interesse (do enxame de fugir, do bando de perseguir o enxame)
e variação de densidade do enxame, este fica mais disperso em reação à aproximação do
bando. Existem outras implementações possíveis, adição de novas regras, como vento,
adição de obstáculos físicos, ou mesmo variações das regras existentes como modificar a
velocidade de acordo com a vizinhança próxima, mas estas não foram implementadas neste
trabalho, uma vez que o foco aqui é a construção de padrões e formas.

Figura 14 – Evolução gráfica de um bando contra um enxame.

3.2 Enxames agregadores

Os algoritmos desta seção foram baseados nos capítulos 2, 3 e 4 da dissertação de


Gazi (GAZI, 2002), que modela enxames cujo as ações se limitam a movimentos baseados
em leis de atração e repulsão e por isso são chamados aqui de enxames agregadores. Tais
algoritmos podem ser vistos como uma variação do Boids, já que a dinâmica de cada
elemento do enxame é influenciada por um fator de atração, este baseado na posição dos
demais integrantes do enxame tal qual a primeira regra do Boids e um fator de repulsão
para elementos que estejam próximos demais, de forma parecida com o que se tem na
segunda regra do Boids. Todavia não existe nada parecido com a 3a regra do Boids
nesses algoritmos e isso acaba permitindo que, em determinadas condições os elementos
47

do enxame estabilizem suas posições, tornando o uso de tais algoritmos interessantes para
a morfogênese.

3.2.1 Função de atração e repulsão simples

O primeiro modelo de enxame discutido na dissertação de Gazi é regido pelas


equações 2.1 e 2.2, vistas na revisão bibliográfica sobre o trabalho. A função 2.1 é descrita
pelo algoritmo A.2.2 enquanto a equação 2.2 está incluída no algoritmo A.2.3, que já calcula
a interação dinâmica e já aplica para reposicionar os elementos do enxame. Uma variável
denominada vel foi adicionada, uma vez que tais equações descrevem um comportamento
em tempo contínuo enquanto a simulação foi feita em tempo discreto.
De acordo com Gazi, usando essas equações e tendo o coeficiente b > a, é esperado
que os elementos do enxame convirjam em direção ao centro de massa do enxame e
estabilizem a uma distância máxima que pode ser calculada pela equação 2.3. Todavia
tal equação é considerando um enxame com infinitos membros. Um enxame com uma
quantidade M de indivíduos, terá sua fronteira estabelecida pela equação 2.3 multiplicada
por um fator MM−1 e mesmo assim Gazi mostra que os limites reais do enxame são ainda
menores, já que as duas condições de pico para que o enxame chegue à esse limite não
podem ocorrer simultaneamente. A fim de entender melhor essa dinâmica e entender a
influência dos coeficientes a, que indica a magnitude da atração, b que indica a magnitude
da repulsão e c que indica o raio de repulsão, executamos o algoritmo para um enxame de
51 elementos, em um ambiente bidimensional, com os coeficientes a = 1, b = 20 e c = 0.2,
fator de discretização de 1 iteração correspondendo 0.001 segundos e 400 iterações. O
resultado pode ser visto no vídeo I das lista de vídeos Aggregating Swarms (MOELLER,
2018a). A figura 15 mostra a convergência do enxame.

Figura 15 – Convergência de um enxame agregador

A evolução das distâncias dos integrantes do enxame com relação ao centro de


massa do mesmo pode ser visto no gráfico 16 e no 17, este último com enfoque no trecho
onde o enxame se concentrou o suficiente a ponto do fator de repulsão de seus indivíduos
conseguir fazer com que a variação nas distâncias seja mínima.
48

Figura 16 – Distâncias máxima, mínima e média dos elementos do enxame ao longo das iterações

Figura 17 – Distâncias máxima, mínima e média dos elementos do enxame ao longo das iterações,
foco no trecho final
49

A primeira coisa que se observa é que, substituindo-se os valores dos coeficientes


na equação 2.3 o valor da distância máxima deveria permear 3,8 e no entanto as fronteiras
do enxame parecem estabilizar perto do 0,7, confirmando as conclusões de Gazi, de que o
valor real do raio do enxame vai ser muito menor do que os limites calculados. Outra ponto
que pode ser observado pelos gráficos é o tempo de convergência. A distância máxima
começa a se estabilizar entre a 50a e a 100a iteração e se estabiliza entre a 250o e 300o . A
equação 3.33 deduzida por Gazi em sua dissertação, permite calcular o limite de tempo no
qual o sistema termina de convergir. De acordo com o gráfico 16, o elemento mais distante
do centro do enxame tão logo o sistema é iniciado, tem cerca de 67,5 unidades de distância
do mesmo. Aplicando isso na equação 3.33 temos um tempo de convergência próximo de
2,87s, que significa a iteração 287, uma vez que cada iteração corresponde à 0.01s.

ei = xi − x̄ (3.31)
Vi = 0.5ei| ei (3.32)
( !)
2
1 
t̄ = max − ln (3.33)
i∈S 2a 2Vi (0)

Com base nos resultados acima, é possível avaliar os impactos dos coeficientes no
tamanho e tempo para coesão do enxame variando um de seus coeficientes e deixando eles
constantes. Neste trabalho, outras 6 execuções do algoritmo foram feitas, 3 delas visando
 ≈ 38, 36, ou seja, 10 vezes maior que o valor de  usando os coeficientes originais. Para
essas 3 execuções, cada uma teve o valor de um dos coeficientes modificados para a = 0, 1,
b = 200 e c = 20. Os resultados gráficos podem ser vistos no apêndice B B.1.1. Reduzindo
1
o coeficiente a em 10 aumentou o tempo de convergência do enxame para algo entre 15 e
20s o que condiz com a equação 3.33 enquanto a distância máxima do centro de massa
do enxame estabilizado aumentou de algo em torno de 0,7 para 1,55, pouco mais que o
dobro. Aumentando o valor do coeficiente b em 10 vezes não pareceu afetar o tempo de
convergência do enxame, que ocorreu dentro da mesma faixa. O tamanho final foi parecido
com o resultado da redução do coeficiente a com a maior distância ficando em algo entre
1,50 e 1,55. O coeficiente c precisa ser aumentado num fator de 100 vezes para aumentar
em 10 vezes o valor de . Com o valor de 20 foi observado um ligeiro aumento no tempo
de convergência do enxame, que se estabilizou entre 3s e 4s como pode ser visto na figura
79. O aumento no coeficiente c foi o que resultou o maior aumento prático na distância
máxima entre os elementos do enxame e o centro de massa do mesmo, ficando em torno
de 7, um aumento de 10 vezes. A evolução do enxame nessas 3 condições pode ser vista
nos vídeos II, III e IV da lista de vídeos aggregating swarms (MOELLER, 2018a).
Outras simulações foram realizadas e seus resultados gráficos podem ser vistos
no apêndice B em B.1.2 e a evolução do enxame pode ser vista nos vídeos V, VI e VII
da lista de vídeos aggreting swarms (MOELLER, 2018a). Um dos pontos interessantes
nessas simulações são o comportamento do enxame na condição onde apenas o valor do
50

coeficiente b foi aumentado para um valor 10000 vezes maior que o da primeira simulação
(vídeo VI). Neste caso os elementos do enxame não conseguiram manter uma posição
estável, ao se chegarem a um certo raio do centro de massa, os elementos saltavam para
uma distância em direção contrária e depois começavam a convergir de novo. Isso faz
sentido, já que o coeficiente b regula a magnitude da força de repulsão e é um evento
próprio da discretização do sistema: entre uma iteração e outra os elementos deslocam
distância o suficiente para que o raio de repulsão surta efeito. É possível fazer com que
esse efeito desapareça, diminuindo a equivalência de tempo de cada iteração. Outro ponto
interessante é na simulação onde o coeficiente c foi aumentado para o valor de 2000 (vídeo
VII). No início, a força de atração parece ser mais forte em 4 eixos que intercalam outros
4 eixos de atração mais fraca. Isso faz com que o enxame comece a convergência formando
um círculo ondulado, ou uma estrela de 8 pontas arredondadas. Depois atração nos eixos
mais fortes se torna repulsão enquanto continua agindo nos eixos mais fracos e isso faz
com que o enxame se torne um círculo.
Por fim, foi implementado um algoritmo em um enxame menor (10 indivíduos),
que variou cada um dos coeficientes em uma faixa de 100 valores, por 400 iterações a
0,01s cada iteração. Os valores foram calculados de modo que o tempo de convergência
estivesse dentro do tempo das 400 iterações e que as 100 ultimas iterações estivessem além
desse tempo. A maior e menor distância de um elemento ao centro de massa do enxame
nessas 100 ultimas iterações foram marcadas em um vetor de 100 posições, bem como a
média dessas 100 últimas iterações. O resultado pode ser visto nos gráficos 18, 19, 20 e
21. Os gráficos 18 e 19 mostram que regular o tamanho do enxame pela força de atração
talvez seja a pior abordagem, valores menores que 0.1 incrementam a distância em uma
taxa muito alta, ao ponto que valores maiores 0.1 tem uma taxa de variação muito baixa.
Tando o gráfico 20, referente ao coeficiente b, quanto o gráfico 21, parecem assumir a
forma de uma curva logarítmica, mas com trechos facilmente linearizáveis. É interessante
notar que a distância mínima parece diminuir a partir de um certo ponto com o aumento
do coeficiente b. É possível que isso seja mais um efeito da discretização: elementos mais
próximos do centro de massa podem estar sendo repelidos por membros mais externos em
direção ao próprio centro de massa. Mais uma vez, também, o coeficiente c mostrou ter
maior impacto na distância dos elementos do enxame.
Para uma última observação dentro dos resultados obtidos, o aumento nos valores
do coeficiente c pareceu ter maior poder em dar ao enxame uma forma final circular
que qualquer alteração nos demais coeficientes. Os outros dois tem seus impactos nas
distâncias do enxame, mas tendem a modificar menos a geometria inicial com a qual os
robôs foram dispostos no espaço.
51

Figura 18 – Distâncias máxima, mínima e média dos elementos do enxame variando conforme o
valor do coeficiente a, gráfico iniciando com a = 0,0199

Figura 19 – Distâncias máxima, mínima e média dos elementos do enxame variando conforme o
valor do coeficiente a, gráfico iniciando com a = 0,1
52

Figura 20 – Distâncias máxima, mínima e média dos elementos do enxame variando conforme o
valor do coeficiente b, gráfico iniciando com b = 20

Figura 21 – Distâncias máxima, mínima e média dos elementos do enxame variando conforme o
valor do coeficiente c, gráfico iniciando com c = 0.2
53

3.2.2 Estabilização de formação

No capítulo 3 do trabalho de Gazi, ele aborda uma classe de funções de atração e


repulsão para criar formações estáveis em enxames. Como dito na revisão bibliográfica,
em 2.1.3, ele passa a abordar o modelo de enxame como um somatório de resultados de
funções e atração e funções de repulsão e explora cada uma delas. Dentro do capítulo, a
seção 3.3.2 de nome Formation Stabilization foi de especial interesse para esse trabalho.
Nela Gazi apresenta uma simples modificação no modelo de atração e repulsão que pode
garantir a estabilização de formações. No caso, admite-se que, na formação estável, as
distâncias entre os elementos variem de acordo com sua posição. Então é acrescentado um
fator δ ij que é proporcional a distância do par i,j na formação estável.
O algoritmo implementado é uma mera variação do algoritmo anterior. Como
pode ser visto em A.2.4, a única mudança é que o coeficiente c utilizado na função de
atração e repulsão é multiplicado por um valor armazenado no vetor bidimensional delta.
Esses valores variam de acordo com a figura que se deseja formar e com a quantidade
de elementos no enxame. Por exemplo, para formar um triângulo equilátero usando seis

robôs, o vetor delta terá os seguintes valores (sq3 = 3):

delta = np.array([
[0,1,2,1,sq3,2],
[1,0,1,1,1,sq3],
[2,1,0,sq3,1,2],
[1,1,sq3,0,1,1],
[sq3,1,1,1,0,1],
[2,sq3,2,1,1,0]
])

Usando os coeficientes a = 0, 1, b = 20, c = 200 e velocidade de iteração = 0,025s


temos o resultado que pode ser visto no vídeo "triangle"da lista de vídeos Swarm Formation
(MOELLER, 2018j). A figura 22 também mostra a evolução do enxame na formação. O
processo funciona tanto para formas convexas como para formas côncavas, como é possível
ver no vídeo "crux"da lista de vídeos Swarm Formation (MOELLER, 2018j) e na figura 23.

Como visto na subseção anterior, o coeficiente c é responsável pelo raio de repulsão,


todavia, para que os valores de δ ij surtam o efeito desejado, eles precisam ser elevados ao
quadrado e então multiplicados por c. Isso porque, como visto na equação 2.3, o coeficiente

c entra na equação de distância máxima dentro como c.
Esse tipo de algoritmo de formação apresenta algumas desvantagens. A primeira
delas é o fato de cada elemento do enxame já começar com uma posição na formação
54

Figura 22 – Enxame formando um triângulo equilátero

Figura 23 – Enxame formando uma cruz

previamente definida. Isso acaba por exigir que o enxame tenha a mesma quantidade de
elementos que a formação final e caso algum elemento seja destruído a formação final
é comprometida. Outro problema é que, dependendo da figura e das posições iniciais
dos elementos do enxame, os mesmos podem acabar se estabilizando em uma formação
diferente da provista. Isso geralmente acontece quando um elemento se aproxima da
formação pela posição dos elementos extremos opostos a sua posição pré-definida. A
repulsão desses elementos é maior que a atração exercida pela formação e com isso o
elemento em questão pode ficar preso em uma armadilha de forças de repulsão. Ambas
as desvantagens podem ser resolvidas fazendo com que todos os elementos do enxame
assumam que são os primeiros elementos da formação e que a medida que forem fazendo
contato uns com os outros, usem algum tipo de protocolo de disputa para decidirem qual
continua sendo o primeiro elemento da formação e qual será o próximo elemento. Um
protocolo desse tipo será abordado na seção 3.3.2

3.2.3 Enxames na presença de nutrientes e toxinas

Seguindo para o capítulo 4 da dissertação de Gazi, são tratados dos enxames de


forrageamento social, que são enxames agregadores que se baseiam também em alguma
variável espacial, cujo os valores de concentração são diferentes no espaço. Se a variável
tem um valor abaixo de zero ela exerce um efeito de atração sobre os elementos do enxame
e é chamada de nutriente. Se o valor é maior que zero, ela tem um efeito repulsivo sobre o
enxame e é chamada de toxinas. O modelo do enxame, nessas condições é definido pela
55

equação 2.5 e essa está aplicada no algoritmo A.2.7. Já as regras para a construção da
matriz com as concentrações de toxinas e nutrientes utilizadas nesse trabalho podem ser
vistas em A.2.8.
O resultado das simulações executadas para este trabalho podem ser vistas nos
vídeos da lista Social Foraging Swarms (MOELLER, 2018i). Para ilustrar a evolução do
enxame, a figura 24, referente ao vídeo I da lista, mostra o comportamento geral do enxame
ao longo do tempo. Nas condições estabelecidas (a = 1, b = 20, c = 20, vel = 0, 01), os
elementos do enxame transpõem trechos de elevada concentração de toxinas durante as
iterações iniciais. Isso se deve porque a força de atração entre os elementos do exame
é maior quanto maior a distância e os picos de toxinas, de valor entre 12 e 16, não são
o suficiente para obrigar os elementos a adaptarem sua rota antes do enxame convergir.
Depois da conversão, as distâncias entre os elementos são fracas e as forças de repulsão
são equilibram o sistema, sendo assim apenas a influência externa, ou seja, os nutrientes e
as toxinas, afetam o enxame, fazendo com que o mesmo se desloque até um mínimo local
(que corresponderia a um máximo local de nutrientes).

Figura 24 – Enxame se deslocando em um meio com toxinas e nutrientes

A concentração de toxinas e nutrientes e a taxa de incremento espacial de ambos é


fator determinante para saber se o enxame vai conseguir se agrupar ignorando a maior
parte de ambos, se terá desvios, ou se não conseguirá se agrupar ao todo. A figura 25
associada ao vídeo II, mostra o resultado de uma simulação onde os elementos do enxame
estão presos em "ilhas"de nutrientes. Isso ocorre não só porque as concentrações máximas
de nutrientes e toxinas são o dobro da simulação anterior, como também essa variação de
concentração acontece num espaço muito curto. Isso é análogo a uma superfície de morros.
É como se na segunda simulação o enxame tivesse que vencer morros mais inclinados.
A figura 89, referente ao vídeo III mostra um enxame de 200 elementos se portando
no mesmo cenário da simulação 2. Nesse caso, mais elementos, mais força de atração e
portanto o enxame acaba por se estabilizar numa quantidade menor de ilhas. No casos
dessas simulações é considerado que a concentração das toxinas e nutrientes ao longo do
tempo é estática. Todavia é interessante considerar um cenário onde os elementos do
enxame são os responsáveis por despejar as toxinas e nutrientes no ambiente, conseguindo
56

Figura 25 – Elementos isolados em ilhas de nutrientes

assim uma forma de regular sua vizinhança. No caso isso é uma analogia a uma das
formas mais primitivas de comunicação celular, o uso de hormônios (ESBERARD, 1980).
Propostas desse tipo podem ser vistas, nesse trabalho, em 2.1.4.2.

3.3 Algoritmos baseados no modelo reação difusão de Turing

Os algoritmos baseados no modelo reação difusão costumam ter mais de uma matriz
espacial envolvida, uma para cada reagente envolvido. No entanto, para fins de praticidade,
os resultados dos algoritmos aqui implementados serão referentes a apenas uma dessas
matrizes. No caso do algoritmo baseado no modelo de Gray-Scott, Ambas as matrizes
podem ser representadas em uma imagem RGB, sendo um dos reagentes representando
a concentração de uma das cores e o outro a concentração de outra. Todavia, devido
as características das três cores básicas, o efeito visual é cansativo e para pessoas mais
sensíveis, pode ser até doloroso para os olhos. Por isso aqui optamos por só mostrar
imagens com a concentração do reagente B na matriz. Não existe perda de informação
visual para um observador humano nesses casos, todas as imagens foram comparadas com
a projeção de ambos os reagentes em uma imagem RGB e as formas são suficientemente
parecidas, já que o objetivo é mostrar a mudança de padrões mudando as variáveis iniciais
e não o padrão em sí.
Quanto ao modelo de hormônio digital, escolhemos aqui mostrar a projeção dos
robôs na matriz e não dos hormônios por eles gerados. O comportamento de agregação e
os padrões por eles formados são mais relevantes para este tópico que mostrar seus campos
comunicativos.

3.3.1 Algoritmo baseado no modelo de Gray-Scott

As equações 2.6 e 2.7 resultam na variação de concentração de dois reagentes em um


espaço. O algoritmo baseado no modelo de Gray-Scott basicamente recebe duas matrizes,
de mesmo tamanho, contendo as concentrações de dois reagentes em um determinado
espaço, os coeficientes das equações citadas acima, calcula as variações de concentrações e
soma essas às matrizes iniciais.
57

O primeiro componente de ambas as equações é o fator de difusão, que utiliza


o operador laplaciano discreto. Tal operador é resultado do cálculo da divergência do
gradiente de uma função bidimensional. Não existe tal função implementada nos módulos
utilizados nesse trabalho, portanto foi necessário implementa-la. Uma das formas formas
de implementação é via convolução de matrizes, sendo uma dessas um filtro 3 por 3, que
resulta em uma aproximação aceitável (LINDEBERG, 1990). Para o tratamento de bordas,
o filtro utilizado foi redimensionado e seus pesos recalculados, para manter a soma do
filtro em zero e minimizar a perda de informação. O filtro escolhido foi o de 8 direções e
de peso 1:  

.05 .2 .05 
 .2 −1 .2 
 
 
.05 .2 .05

Para fins de exemplo do tratamento de bordas, o elemento de índice 0,0 da matriz


de concentração, ou seja, o canto superior esquerdo da mesma seria multiplicado pelo filtro
modificado:

 

−45 .2 
.2 .05

Isso acaba resultando com que o fluxo das células da borda ocorra em uma taxa
menor, mas faz com que o valor da soma de todos os elementos da matriz tratada pelo
operador seja zero, ou seja, não são criadas nem destruídas substâncias no tanque pela
difusão, o que é o esperado na realidade. O tratamento de borda por reflexão, nesse caso,
não tem efeito e acaba por alterar os valores globais de concentração.
As equações 2.6 e 2.7 tratam da matriz por completo, porém, determinadas
operações são mais simples de serem feitas elemento a elemento e armazenadas em uma
nova matriz. Esse não é o caso do operador laplaciano discreto, uma vez que ele precisa ser
calculado por toda a matriz, a melhor abordagem é a de calcular ele primeiro e armazenar
seu resultado em uma nova variável, depois, durante a execução do resto do algoritmo, o
mesmo pode acessar essas variáveis e pegar elemento por elemento para realizar as demais
operações. Isso foi feito com ambas as matrizes de concentração.
As parcelas −AB 2 e +AB 2 não interferem no total de "moléculas"envolvidas, já
que o mesmo valor que é subtraído de cada célula em A é adicionado em B. No entanto isso
muda os valores globais de concentração de cada substância. Mesmo a terceira parcela, que
diminui a concentração de B em −(f + k)B e aumenta a concentração de A em f (1 − A)
não é suficiente e nem tem por objetivo manter equilibrada a concentração global de cada
substância, afinal é essa dinâmica que gera os padrões.
Os valores da concentração de cada célula, no entanto, não podem ser menores
que 0, nem maiores que 1. Mesmo fazendo restrições de variáveis, como f < 1, é difícil,
58

só com as equações apresentadas, garantir a restrição desses valores e, enquanto em um


sistema contínuo isso poderia não ser um grande problema, já que a terceira parcela de
cada equação acabaria por tratar essas irregularidades, em um sistema discreto as mesmas
podem causas desequilíbrio no mesmo e fazer com a concentração de uma substância chegue
a valores extremamente altos. Para tratar disso, foi utilizado um método simplificado, que
resulta em certa perda de informação, mas que é satisfatório para fins demonstrativos, que
é verificar o valor de cada célula da matriz: se este passar de 1, o valor é revertido para 1
e se este estiver abaixo de 0, o mesmo é revertido para zero.
Os vídeos com os resultados do algoritmo foram publicados na lista Reaction-
Diffusion Models (MOELLER, 2018g). Todas as execuções do algoritmo foram feitas em
um espaço matricial de 100 linhas e 100 colunas. Em todas as execuções o valor inicial da
concentração de A em todas as células era de 1. A execução do algoritmo que usaremos
como base para comparação é a primeira, que possui os seguintes valores de coeficientes
DA = 1, 0, DB = 0, 5, f = 0, 055, k = 0, 062 e ∆t = 1, 0. As concentrações de B, nessa
execução estão limitadas em uma área levemente retangular entre as linhas 47 e 53 e as
colunas 47 e 54. O resultado pode ser visto na figura 26, ou no vídeo I da lista.

Figura 26 – Reação difusão para DA = 1, 0, DB = 0, 5, f = 0, 055, k = 0, 062

As figuras 90 até 93, referentes aos vídeos de 2 a 5 são resultado de execuções com
as mesmas configurações da execução inicial, mas com diferentes disposições iniciais da
concentração de B e resultam claramente em formas diferentes. No entanto a figura ?? e o
vídeo VI são particularmente interessantes, pois a base da configuração e das concentrações
iniciais são as mesmas da primeira execução, no entanto foi adicionado um ruído, de
valor máximo de 0,2 , em torno do bloco principal de concentração de B. Esse ruído foi o
suficiente para não só alterar drasticamente a forma final, como também acabar com a
simetria da mesma, confirmando a especulação de Turing, de que uma esfera de células
iniciais, pode acabar se tornando algo não simétrico em todos os eixos, como um embrião,
por conta de pequenas imperfeições e ruído (TURING, 1952).

Figura 27 – Reação difusão para DA = 1, 0, DB = 0, 5, f = 0, 055, k = 0, 062, em meio ao ruído


59

Para mesmas concentrações iniciais, a variação do coeficiente k apresentou bastante


impacto na formação dos padrões. Um decréscimo de dois milésimos nessa variável e a
concentração de B se expandiu em um círculo até tomar toda a matriz, como pode ser visto
na figura 94 e no vídeo VII. Enquanto um aumento de dois milésimos fez com que a forma
se expandisse como um anel com velocidade de expansão cada vez menor, como pode ser
verificado na figura 95 e no vídeo VIII. O coeficiente k entra no cálculo da taxa com que
B é retirado do tanque, portanto os resultados observados condizem com os esperados.
Os padrões se mostraram bem sensíveis ao coeficiente k, reduções e aumentos de
mais alguns milésimos acabaram por fazer com que a concentração de B diminuísse muito
rápido e com isso impedindo que padrão algum fosse formado. O coeficiente f se mostrou
mais maleável, uma redução do mesmo em alguns centésimos acabou por gerar um padrão
interessante (figura 96 e vídeo IX), os vértices do quadrado inicial se expandiram, mas
não conseguiram manter-se conectados formando assim ilhas. Essas ilhas começaram a se
expandir formando seguimentos alongados, porém, quando atingiram um certo limite, os
meio dos mesmos se rompeu fazendo assim com que as extremidades se tornassem novas
ilhas. O processo foi se repetindo e se assemelha visualmente à divisão celular.
Outras combinações foram tentadas, muitas, como a redução em alguns décimos
do coeficiente de difusão de A, não resultaram em forma nenhuma, em outras, valores
que não resultavam em formas, passaram a resultar com a variação de outro coeficiente.
O coeficiente k = 0, 06 por exemplo, que gerava um círculo que terminava por ocupar
toda a área da matriz, com f = 0, 03 acaba por gerar padrões que se assemelham a trevos
e por fim um conjunto de linhas e quinas. Se essa grande variação de formas pode ser
alcançada com os coeficientes constantes, é de se imaginar que coeficientes variáveis por
eventos possam gerar formas ainda mais diversificadas e complexas.

3.3.2 Hormone-Inspired Self-Organization and Distributed Control of Robotic Swarms

A implementação do algoritmo sugerido por Shen (SHEN P. WILL, 2004) não


pode ser completamente fiel ao seu trabalho, para fins de comparação, pois o autor não
deu qualquer valor de coeficiente no mesmo. Já que sem essa informação, não seria
possível repetir exatamente o mesmo experimento que o autor, foi optado nesse trabalho
por simplificar as matrizes hormonais dos robôs, usando valores arbitrários baseado nos
desenhos das matrizes hormonais no trabalho de Shen, ao invés de discretizar as funções
de desvio padrão dadas pelo autor. Isso se deve ao fato de que sem os coeficientes, levaria
um tempo considerável para descobrir os valores corretos da função que projetariam o
mesmo hormônio.
Os vídeos com os resultados do algoritmo estão na lista Digital Hormone Swarm
(MOELLER, 2018e). Os quatro primeiros vídeos foram executados em um espaço matricial
de 25 por 25. O fato do restante ser baseado em um espaço 100 por 100 é fruto de uma
60

mudança na forma de tratar os robôs durante a simulação. Até esse ponto, todos os outros
algoritmos que haviam a figura do robô individual, como em 3.1 e 3.2, a quantidade de
robôs envolvida na simulação era da ordem de dezenas e no máximo centenas, nunca
chegando na ordem de um milhar, os robôs também eram considerados adimensionais e
portanto não havia preocupação em fazer tratamento de colisões. Todavia, no trabalho
de Shen, cada robô tem tamanho definido de uma célula da matriz, o que exige algum
tratamento de colisão. Além disso, uma das considerações a serem feitas é a influência
da densidade populacional nos padrões criados, o que em uma matriz 100 por 100, quase
sempre vai tratar da ordem de milhares de robôs.
Inicialmente, estávamos tratando os robôs separadamente do espaço. Havia uma
matriz de posições, a movimentação dos robôs era calculada com base nessa matriz e
depois eles eram desenhados na matriz espacial. No caso do algoritmo em questão, uma
função de intenção de movimento calculava para onde cada robô iria se deslocar, com
base na regra de movimentação selecionada, e uma outra função mover, verificava se a
posição não estava ocupada, para só então realizar a movimentação do robô. Isso significa
que cada robô tem que comparar sua posição de destino com todos os outros do enxame.
Um enxame de N indivíduos acaba por ter que realizar (N − 1)2 operações sobre essas
coordenadas. Levando em conta que essas simulações foram realizadas em um computador
pessoal, que não é otimizado para a tarefa e nem poderia se dedicar só a ela, o tempo
entre uma iteração e outra para um grupo de 7500 robôs estava beirando aos 15 minutos,
o que resultaria mais de 10 dias de processamento para 1000 iterações num espaço 100 por
100. Isso se o hardware não acabasse desligando, já que a temperatura média dos núcleos
do processador chegou a passar de 80o C. Por isso, foi optado por realizar essas simulações
em um espaço menor.
Uma mudança na forma de interpretar os robôs é que possibilitou as simulações em
um espaço 100 por 100: ao invés de tratar os robôs por uma matriz de posições, trata-los
diretamente na matriz espacial. Dessa forma o algoritmo varre a matriz espacial e ao
localizar um robô já executa a decisão de movimento, verifica se o espaço para o qual vai se
mover está vago e caso esteja, move e atualiza a matriz. Dessa forma, uma execução com
7500 robôs deixa de executar algo em torno de 56 milhões de comparações de posições,
para fazer algo perto de 10 mil. Isso possibilitou com que as 1000 iterações fossem feitas
em alguns minutos.
Com isso a versão final do algoritmo se resume aos seguintes passos:

1. Distribui os robôs aleatoriamente pelo espaço.

2. Aplica o campo hormonal de cada robô e salva o resultado em uma matriz separada

3. Varre a matriz espacial procurando robôs.


61

a) Ao encontrar um robô, ele verifica na matriz hormonal os valores da vizinhança


b) Ele busca o maior valor maior que zero na vizinhança
c) Havendo mais de um valor igual, ele sorteia para qual ele vai seguir
d) Verifica se o espaço decidido não está ocupado
e) Se não estiver, move o robô

4. Retorna para o item 2

É possível notar, pela descrição acima, que a decisão de movimento usada aqui é
levemente diferente da usada no artigo de Shen. Neste o algoritmo faz com que o robô
busque o maior valor na vizinhança, enquanto no nosso trabalho, o robô vai para o maior
valor positivo, ou então não se move. Isso não pareceu afetar significativamente o resultado
final.
A primeira série de execuções utilizada para este trabalho são as relativas ao
5 ,6 ,7 e 8o vídeos da lista. A matriz hormonal utilizada é a descrita pela matriz a seguir
o o o

e o resultado pode ser visto também nas figuras 28, 29, 30 e 31. O resultado verificado
se assemelha com as conclusões de Shen, a densidade populacional pouco influência nos
padrões formados, tendo maior impacto no tamanho dos aglomerados. Nas concentrações
mais altas, a ausência de espaços para a mobilidade dos robôs acaba forçando com que os
padrões mudem de ilhas para faixas.

 

−.5 −.5 −.5 −.5 −.5 −.5 −.5 −.5 −.5 
−.5 0 0 0 0 0 0 0 −.5 
 

 
−.5 0 .5 .5 .5 .5 .5 0 −.5 
 

 
−.5 0 .5 1 1 1 .5 0 −.5 
 

 
−.5 0 .5 1 0 1 .5 0 −.5 
 

 
−.5 0 .5 1 1 1 .5 0 −.5 
 

 
−.5 0 .5 .5 .5 .5 .5 0 −.5 
 

 
−.5 0 0 0 0 0 0 0 −.5 
 

 
−.5 −.5 −.5 −.5 −.5 −.5 −.5 −.5 −.5

Figura 28 – Evolução do enxame para 10% de concentração

As figuras 32,33,34 e 35, e os três últimos vídeos da lista são referentes à execuções
com 25% das concentrações e campos hormonais diferentes. A figura 32 não está relacionada
62

Figura 29 – Evolução do enxame para 25% de concentração

Figura 30 – Evolução do enxame para 50% de concentração

Figura 31 – Evolução do enxame para 75% de concentração

a nenhum vídeo, pois é referente à execução cujo o perfil hormonal continha mais inibidor do
que ativador, o fez com que os robôs não se agregassem e nem formassem padrões, excluindo
a necessidade de uma animação. Nas demais execuções, temos um perfil balanceado, um
perfil com maior proporção de ativadores e por fim um só com agregadores. O resultado
final foi o mesmo observado no trabalho de Shen, quanto maior a proporção de ativadores,
maior o tamanho dos agregados formados.

Figura 32 – Evolução do enxame para 25% de concentração, perfil hormonal rico em inibidor

As regras para a construção dos perfis hormonais utilizados se encontram no


apêndice B A.3.2.3.

3.4 Autômatos celulares

Para este trabalho foram implementados apenas os algoritmos referentes ao modelo


de autômato celular simples e o de estrutura por substituição. Os vídeos com os resultados
63

Figura 33 – Evolução do enxame para 25% de concentração, perfil hormonal balanceado

Figura 34 – Evolução do enxame para 25% de concentração, perfil hormonal rico em ativador

Figura 35 – Evolução do enxame para 25% de concentração, perfil hormonal apenas com ativador

estão nas listas Pattern Substitution (MOELLER, 2018f) e Cellular Automata (MOELLER,
2018d). Os dois últimos da lista Pattern Repetition formam os mesmos padrões dos dois
primeiros da Cellular Automata, no entanto eles foram gerados por algoritmos diferentes e
essa informação é relevante para a conclusão dessa seção.
A primeira função de morfogênese por substituição, é a responsável por gerar uma
árvores fractais. Tal função recebe como entrada um vetor chamado vértice e uma matriz
de padrões M. Cada elemento do vetor vértice é também um vetor e neste estão incluídas
informações sobre uma determinada forma, como coordenadas, orientação, tamanho final,
quais outros vértices o final dessa forma vai gerar, orientação desses novos vértices, tamanho
proporcional e se estão ativos ou não. Já a matriz M contém, em cada uma das suas
linhas, informações padrões de cada forma.
A cada execução da função de criação de árvore, ela varre o vetor de vértice
procurando por vértices ativos. Ao encontrar um, a função vai desenhando uma reta, na
orientação do vértice, até o tamanho final do mesmo. Feito isso, a função desativa esse
vértice e com base no tipo do vértice, ela busca na matriz M quais são os tipos que ele
gera, calcula os novos tamanhos e orientação global e gera um novo vértice ativo para
cada tipo correspondente.
Para fins de exemplificação, vamos chamar os vértices ativos de brotamentos, ou
64

semente para o caso do primeiro vértice ativo, que vai gerar a árvore. Os vértices inativos
vão ser chamados de galhos, ou tronco, esse último para o caso do primeiro vértice, depois
de executado. Quanto a padrões, temos a seguinte regra: Azul é substituído por um azul
seguido de um vermelho, na mesma orientação. Vermelho é substituído por um vermelho,
seguido de uma bifurcação com outro vermelho a -30 graus e um azul a 30 graus com
relação a orientação do vermelho inicial.
A semente é vermelha. O primeiro elemento da semente é sua coordenada inicial,
vamos considerar aqui 50,50. A orientação inicial é 0 graus, mas estamos usando aqui um
sistema transformado. O vetor de crescimento não rotacionado é sempre em função de
diminuir o valor de y, vale a pena lembrar também, que em coordenadas computacionais,
o eixo y é invertido, já que ele provêm do sistema de linhas e colunas. Logo a orientação
de 0 graus vai fazer com que o crescimento esteja orientado para "cima". O tamanho
final do tronco gerado pela semente é 20 e como visto na regra acima, vermelho gera um
vermelho a -30 graus e um azul a 30 graus. Por fim o tamanho relativo dos galhos ligados
diretamente a esse tronco são de 75% do tamanho deste.
Na primeira execução da função, o único vértice ativo é a semente. O algoritmo
vai executar 20 passos de crescimento, resultando num segmento de reta que vai das
coordenadas 50,50 até 30,50. No fim o algoritmo vai gerar dois brotamentos, ambos nas
coordenadas 30,50. Um vermelho, de orientação inicial -30, tamanho final 15 e um azul,
também de tamanho final 15, mas com orientação de 30 graus. Além disso o algoritmo vai
desativar o vértice da semente.
Na segunda execução, o algoritmo vai ignorar o primeiro vértice, pois seu marcador
está como desativado. O segundo vértice é um brotamento vermelho. A orientação global
deste é -30, então ele vai crescer cerca de 15 unidades até algo próximo da coordenada 17,43
(o algoritmo arredonda até o inteiro próximo) e gerar mais dois vértices nessas coordenadas,
um vermelho e um azul, de coordenadas globais -60 e 0 e tamanho 11 (também aqui temos
um arredondamento de 75% de 15). Feito isso ele desativa esse brotamento vermelho.
Ainda na segunda execução, ele desenvolve o brotamento azul: também um cresci-
mento de 15 unidades até as coordenadas 17,57 e depois gera um novo brotamento vermelho,
com a mesma orientação (30 graus) e tamanho 11. Termina a execução desativando esse
vértice azul. O resultado de diversas execuções é a árvore vista na figura 36. É importante
observar que as "cores"dos vértices são apenas uma codificação, não são cores de fato e
não influenciam no resultado final.

Figura 36 – Crescimento de uma árvore fractal


65

A substituição de padrões pode servir também para gerar estruturas que o algoritmo
de autômato celular simples também gera. A lógica é bem parecida com a geração de
árvores: O programa é alimentado com um vértice ativo e uma matriz de regras, o vértice
ativo é processado, gera novos vértices e o vértice em questão é desativado.
Por exemplo, para gerar um padrão parecido com o da regra 250: cada vértice
ativo gera dois novos vértices, ambos uma linha abaixo, um à esquerda e outro à direita
da coluna do vértice ativo. Se temos um vértice ativo em 50,50, esse vai gerar um em
51,49 e outro em 51,51. Na próxima execução o 51,49 e o 51,51 é que estão ativos. O 51,49
gera novos dois, um em 52,48 e outro em 52,50 enquanto o 51,51 gera também em 52,50 e
52,52. Como não existe nenhuma regra de sobreposição, os dois 52,50 são considerados
um vértice só (eles serão executados duas vezes, mas o resultado visual na matriz espacial
é o mesmo).
É possível gerar padrões mais complexos, associando tipos aos vértices e tendo
uma regra de vértices filhos para cada vértice diferente. Todavia, padrões como o da
regra 90 só podem ser construídos parcialmente com esse tipo de regra. Quanto maior o
tamanho do padrão construído, mais tipos de vértices são necessários. É possível remediar
isso alterando a regra de repetição: quando dois vértices ativos geram filhos na mesma
coordenada, esse filho é eliminado. Assim, voltando a ter só um tipo de vértice conseguimos
criar o padrão da regra 90.
Isso complica o uso da substituição de padrões, já que para agora, não só a regra
de substituição, mas as regras de execução do algoritmo tem que ser modificada para se
alcançar determinados padrões. Padrões como o 30, podem exigir um conjugado complexo
de regras de substituição e de execução. Porém esse mesmo padrão pode ser alcançado
usando o algoritmo de autômato celular simples. Isso acaba por indicar que se uma
determinada lógica simples está tendo dificuldade para alcançar um padrão complexo, não
significa que este padrão é impossível para lógicas simples, pode existir uma outra lógica
que o alcance.
O algoritmo do autômato celular simples recebe como uma entrada uma matriz
cujo as células são os autômatos celulares, o número da iteração e a regra utilizada. A
matriz com os autômatos é uma matriz onde cada célula pode ter apenas dois valores, 0 e
1. Cada linha dessa matriz é referente a uma iteração e a regra define o valor do próximo
autômato. Como explicado em 2.1.5, a regra toma por base um autômato e seus vizinhos
da esquerda e da direita para definir o valor do autômato abaixo destes. Para tratamento
de borda, os valores dos extremos da matriz são repetidos. Por exemplo, o autômato da
primeira coluna não tem vizinho da esquerda, então o valor do autômato da última coluna
é repetido e colocado como "vizinho da esquerda"do autômato da primeira coluna. De
forma parecida é tratado o autômato da última coluna, que recebe o valor do da primeira
coluna como vizinho da direita.
66

Como exemplo, vamos utilizar a regra 90 e uma matriz 11 por 11, com todos
autômatos iguais a zero exceto pelo da linha zero e coluna 5. A regra 90 pode ser visto na
figura 37 enquanto a matriz está representada pela figura 38.

Figura 37 – Regra 90

Figura 38 – Matriz inicial

Na primeira execução o algoritmo recebe a matriz, o valor de iteração 0 e a regra e


vai verificar cada célula da linha de valor igual ao da iteração, portanto 0. Começando
pela célula 0 da linha 0 primeiro temos que verificar o valor da célula à esquerda. Ora
não existe célula à esquerda da célula 0,0 então assumimos o valor da última célula da
linha: "roxo". A célula 0,0 também tem valor "roxo"e sua vizinha da direita, a célula 0,1
também é roxa. Com isso temos a sequência roxo,roxo,roxo, olhando a regra vemos que
essa sequência gera um roxo, logo a célula 0 da linha 1 será roxa também.
Esse padrão segue até chegarmos na célula 4 da linha 0. Sua vizinha da esquerda é
roxa e ela também é roxa, mas a vizinha da direita é amarela. Com isso temos o padrão
roxo,roxo,amarelo. De acordo com a regra, isso gera uma célula amarela, então a célula 4
da linha 1 será amarela. A célula 5 é precedida e sucedida por células roxas, mas ela é
amarela. roxo,amarelo,roxo gera uma roxa, logo a célula 5 da linha 1 será roxa. A célula 6
é roxa, sua vizinha da esquerda é amarela e a da direita é roxa. Amarelo,roxo,roxo gera
67

um amarelo. Depois seguem várias sequências roxo,roxo,roxo até chegarmos na célula 10,
que não possuí vizinho à direita. Para resolver isso, pegamos o valor da célula 0, da mesma
linha e aplicamos como se fosse um vizinho da direita. Dessa forma temos roxo,roxo,roxo
novamente e a célula 10 da coluna 1 é roxa. O resultado da execução do algoritmo é a
figura 39.

Figura 39 – Matriz depois da iteração 0

Para desenvolver mais a figura, são necessárias mais execuções. A próxima execução
tem como entrada a matriz resultante de iteração anterior (figura 39), a mesma regra,
mas o valor de iteração sendo 1. Como isso ele só vai ler os estados da linha 1 e mudar os
estados da linha 2. Depois de 5 execuções a matriz inicial agora tem o formato da figura
40.
Continuar desenvolvendo o raciocínio a partir desse ponto é essencial para mostrar
como que o tratamento de borda escolhido influência no resultado final. No modelo que
estamos usando nesse trabalho o primeiro elemento da linha 6 será amarelo: o elemento 0
da linha 5 é amarelo, seu vizinho da direita é roxo, ele não tem vizinho da direita, portanto
usamos o valor do último elemento de sua linha, que é amarelo também. Temos amarelo,
amarelo, roxo, que pela regra gera um amarelo. Uma outra forma de tratar a fronteira,
seria considerar todos os valores externos à matriz como roxo, teríamos roxo, amarelo,
roxo, que gera roxo. Por fim, um método clássico de resolução de problemas de fronteira é
usar a técnica reflexiva, no caso o valor do vizinho da esquerda reflete para o da direita e
vice e versa. Nesse caso teríamos novamente roxo,amarelo,roxo e o resultado seria roxo
novamente. Mas, seguindo a regra de resolução de borda adotado inicialmente o resultado
final da matriz seria o visto na figura 41
As figuras referentes às listas de vídeo citadas nessa seção estão disponíveis no
68

Figura 40 – Matriz depois da iteração 4

Figura 41 – Matriz, resultado final


69

apêndice B

3.5 Self-Assembly and Self-Repair of Arbitrary Shapes by a Swarm of Reactive Robots:


Algorithms and Simulations

O algoritmo proposto por Arbuckle é simples, todavia, sua implementação para


uma simulação em computador exigiu uma série de funções. Um ponto interessante é
que, ainda que fosse possível usar uma única função para definir o comportamento de
cada robô na formação, foi mais fácil fazer uma função de comportamento para linhas
e outra para vértices. Isso se aproxima da abordagem do algoritmo de Arbuckle como
um protocolo de comunicação, sendo as funções ações que o robô toma de acordo com a
mensagem recebida.
De modo geral, a lógica utilizada na simulação consiste de cada robô começando a
mesma assumindo ser um vértice qualquer da formação. É importante observar que todos
os robôs contém todas as informações necessárias sobre a formação, portanto, essa atitude
de assumir um vértice qualquer é apenas para facilitar as combinações e não é necessária,
qualquer robô pode deixar de ser o vértice que assumiu e se tornar uma nova posição na
formação a qualquer momento.
Os robôs se organizam em grupos, isso é uma caraterística da simulação e repre-
sentaria, na realidade a união física entre os mesmos. No início da simulação cada robô
representa um grupo, ou seja, cada grupo tem apenas um indivíduo. No início de cada
iteração, o programa varre a vizinhança de cada robô e procura por outros robôs que não
sejam do mesmo grupo, ao encontrar ele mede forças entre os grupos do robô atual e do
vizinho. Em caso de derrota, uma mensagem é enviada para todos os robôs da formação
do robô atual e cada robô assume um novo valor de grupo, diferente dos existentes, ou
seja, a formação é desfeita. Em caso de vitória, a formação do vizinho é desfeita e este
é assinalado para o grupo do robô atual e assume seu lugar na formação. No fim, cada
grupo se movimenta.
Os robôs são alimentados no sistema por meio de uma lista. Cada robô é também
uma lista de 13 elementos, dentre eles a posição em x,y, sua velocidade em x e y, o grupo
ao qual pertencem, sé é vértice, as conexões que o vértice faz, o tamanho da linha de cada
conexão, se é linha, orientação de linha, quantos faltam para completar a linha, os vértices
ao qual faz conexão e a força do grupo, que é a quantidade de indivíduos no mesmo.
Algumas informações podem parecer redundante. Na simulação executada, os
robôs só poderiam ser vértices ou linha, uma variável booleana seria o suficiente para
indicar isso, no entanto foram optadas por duas variáveis, para facilitar uma modificação
futura que possibilite que os robôs assumam um terceiro estado, que é o de preenchimento
da figura.
70

Tendo isso em mente é possível exemplificar de forma detalhada a execução do


algoritmo. A figura escolhida foi uma cruz grega, que tem todos os seus braços de igual
tamanho. Tal cruz tem 12 vértices. Foi escolhido um tamanho de forma que só houvesse
um robô de linha entre cada vértice, totalizando 24 robôs na formação.
Numa execução com 60 robôs, uma função dispõe os mesmos aleatoriamente no
espaço. Cada robô começa como representante de um grupo, então temos 60 grupos. Numa
situação real, cada robô processaria suas ações por conta própria, mas na simulação cada
robô é processado de uma vez. No algoritmo aqui implementado, os robôs são tratados
por suas coordenadas e não por sua projeção na matriz espacial, com isso, para verificar
se existem outros robôs na vizinhança de um robô específico, o algoritmo precisa varrer
todas as coordenadas e verificar quais estão a uma célula de diferença do robô em questão.
Para cada robô, o algoritmo executa as seguintes tarefas: primeiramente ele procura
por vizinhos. Vamos supor que o primeiro robô da lista não tenha vizinhos. Sendo assim
o algoritmo pula para a tarefa de calcular a força do grupo que no caso desse primeiro
robô, nessa primeira iteração é 1 (apenas um robô grupo). O robô 2 no entanto tem como
vizinho o robô 17. O programa então verifica quais vizinhos são de grupos diferentes do
robô em questão. Ora, na primeira execução existe apenas um robô por grupo. O robô 2
é do grupo 2 e o 17 é do grupo 17, portanto o algoritmo segue para o próximo passo, que
é medir a força dos grupos.
A função de medir forças nada mais é que o cerne de um protocolo de prioridade.
Ela compara a força, ou seja, a quantidade de membros do grupo em questão com a dos
grupos vizinhos. Se o grupo em questão for o que tiver mais membro, ela retorna o valor
booleano verdadeiro. Se qualquer grupo tiver mais membros que o grupo em questão, ela
retorna Falso. Se o grupo em questão e outro tiverem a mesma força e nenhum outro
for mais forte, a função sorteia um retorno verdadeiro ou falso, com 50% de chances,
independente de quantos grupos tiverem a mesma força que o grupo em questão.
É importante salientar que essa função de forças não determina qual grupo tem
prioridade e sim se o grupo em questão tem tal (prioridade) ou não. No exemplo, ambos os
grupos tem o mesmo tamanho (1 indivíduo), então a prioridade seria definida por sorteio.
A função sorteia um retorno falso para o robô 2, com isso ele perderia a prioridade e o
grupo dele seria, ou seja, ele passaria a ter um novo valor de grupo, que nenhum outro robô
no espaço tenha (o valor 2 passaria a ser vago até ser ocupado por outro robô que tenha
perdido o grupo). No entanto, mesmo que o 2 não tenha ganho a prioridade, a função não
garante que o 17 vai ganhar. Suponha que o 2 é o único vizinho do 17 nessa iteração, no
momento de verificar a vizinhança e medir forças do 17 ele ainda está competindo com um
grupo que tem a mesma força e a função pode sortear um falso para o 17. Em um cenário
real, essa função é uma aproximação do que determinaria qual robô tem prioridade em
iniciar a comunicação.
71

Caso a função sorteie um verdadeiro como retorno para 2, o próximo passo é


verificar se 2 é linha ou vértice. Na primeira iteração, todos os robôs assumem serem
vértices. Vamos supor que 2 assumiu ser o vértice 1, que arbitrariamente foi definido com
a quina esquerda do braço alto da cruz. Esse vértice faz duas conexões, uma "embaixo", ou
seja, na direção de aumentar o valor da coordenada de linha e uma conexão à "esquerda",
ou seja, na direção de aumentar o valor de coluna. O algoritmo então chama a função de
comportamento de vértice.
A função de comportamento de vértice lê as informações do vértice em questão e
as posições dos vizinhos que não fazem parte do grupo do robô em questão. Ele verifica se
algum dos robôs está em posição de conexão do vértice. No caso, se 17 estiver "acima", ou
seja, com o valor de linha igual ao do robô 2, subtraído de 1, ou à "direita"de 2, a função
vai simplesmente ignorar o 17. No entanto, se 17 estiver embaixo, ou à esquerda, 2 enviará
uma mensagem a 17, fazendo com que 17 abandone seus antigos atributos e se torne uma
linha.
Essas novas informações são atualizadas na mesma iteração, ou seja, se 17 se tornou
linha na iteração de 2 e se 17 tem outro vizinho além de 2, na vez de processar tanto o
robô 17, quanto mesmo este outro vizinho, o robô 17 já será interpretado como parte do
grupo 2, de força 2 (dois elementos, robô 2 e 17) e 17 sendo linha. Se esse outro vizinho
de 17 for um robô solitário ele 17 automaticamente ganhará prioridade sobre ele e usará a
função de linha.
A função de linha, de forma parecida com a de vértice, verifica se o robô de fora
do grupo está na posição correta para ser incorporado. Se não tiver ele ignora o robô. No
caso de 17 a única posição correta é à sua esquerda, pois a sua direita já está ocupada
por um robô de seu mesmo grupo (o 2) e a orientação da linha dele é horizontal. Estando
esse vizinho na posição correta, a função verifica se ainda faltam robôs para completar a
linha, ou seja, se a posição P do robô na linha é maior que zero. No caso deste exemplo,
as linhas contam só com um robô, 17 já foi associado à posição zero e portanto ele passa a
mensagem para o seu vizinho da esquerda de que ele é o vértice 3.
Depois que todos os robôs tiverem sido processados, o algoritmo move os grupos.
Ele sorteia uma das 4 direções possíveis para cada grupo, depois, grupo por grupo, verifica
se não existe nenhum outro robô, de fora do grupo, na vizinhança do grupo, naquela
direção. Por exemplo, Supondo que no final da primeira iteração, os robôs 2, 17 e 3
formaram um grupo. Foi sorteado que o grupo 2 iria se deslocar uma célula para "cima",
no entanto, o robô 10 está um bloco "acima"do bloco 3. Nesta condição, nenhum robô do
grupo 2 irá se mover.
À medida que as iterações passam, mais robôs vão se encontrando e grupos maiores
vão se formando. Quanto maior o grupo, menor a mobilidade. Essa mobilidade reduzida,
no entanto, acaba contribuindo para a sua sobrevivência. A função de medir forças quebra
72

os grupos menores em grupos individuais. Quando um grupo menor se aproxima de um


maior e se desfaz, este fica cercado desses grupos individuais. Nenhum deles tem força
para desfazer o grupo maior e alguns destes acabarão por integrar o mesmo. Os indivíduos
no entorno de uma formação maior acabam dificultando que ela se mova até perto de
outra formação grande, formada em outra região e isso permite uma certa estabilidade. É
como se o algoritmo criasse um pequeno ecossistema, com uma dinâmica de um grupo
se alimentando de outros para completar sua formação e como se seus "dejetos"fossem
como uma toxina que impedisse, ou dificultasse a mobilidade do maior predador regional,
criando assim "nichos".
O resultado da execução do algoritmo (com 200 robôs ao invés de 60), está no vídeo
Reactive Robots (MOELLER, 2018h) e é representado, nesse trabalho, pela figura 42.

Figura 42 – Evolução do enxame na formação de uma cruz


73

4 DESENVOLVIMENTO DE UM ALGORITMO DE MORFOGÊNESE

Neste capítulo, vamos explorar o processo criativo de um algoritmo de morfogênese.


Como em qualquer projeto, antes de outras considerações, deve-se primeiro definir os
objetivos do mesmo e as particularidades do problema que ele deve resolver. No caso
queremos aqui desenvolver um algoritmo de morfogênese, para enxames de robôs, que
possibilite que o enxame se organize em formas pré-definidas (na introdução desse trabalho,
diferenciamos as formas pré-definidas das objetivas).
A ideia então é que o enxame tenha uma série de parâmetros padrões e dependendo
dos valores com os quais ele é programado, ele assumirá depois de i iterações uma determi-
nada forma. Não é objetivo direto desse trabalho, mas será uma etapa do desenvolvimento
deste projeto a parte do programa responsável por quebrar uma estrutura prévia em
valores para abastecer tais parâmetros.
Nos limitaremos aqui ao espaço bidimensional. O enxame será composto de robôs
quadrados do tamanho de uma célula do espaço matricial ao qual estão incluídos. Seu
movimento será discreto e alinhado com a grade cartesiana, portanto a posição dos robôs
sempre será definida por linha e coluna da matriz. Além disso, fisicamente os robôs são
simplificados, eles não possuem massa, atrito, portanto também não possuem energia
cinética e podem parar seu deslocamento de forma instantânea. O alcance de sensores e o
raio de comunicação, no entanto podem vir a serem limitados por parâmetros. Esse e o
parágrafo anterior definem o objetivo do algoritmo.
Desde o início do projeto, não é esperado que o mesmo gere um resultado comple-
tamente funcional. Vale a pena reforçar que o objetivo final aqui não é o algoritmo, mas
sim o processo de desenvolvimento do mesmo.

4.1 Particularidades de figuras bidimensionais

Como os robôs sempre estarão alinhados à grade cartesiana e têm o tamanho


exato de uma célula da matriz, as figura que o enxame podem formar estão limitadas
àquelas que podem ser representadas inteiramente de forma binária. Curvas, por exemplo,
costumam ser representadas, em pixels, por uma sequência de retas de valores inteiros,
contornadas em pelo menos um dos lados por pixeis de valores reais e que vão gradualmente
diminuindo. Essa diminuição gradual evita que a curva tenha um aspecto "serrilhado"para
um observador, no entanto esse artifício é um exemplo de algo impossível de ser alcançado
pelo enxame aqui definido, uma vez que cada célula da matriz, ou seja, cada pixel só pode
ter ou um robô, ou nenhum. Outro elemento que as figuras também não vão apresentar são
diagonais. Assim como as curvas, apenas a sequência de retas inteira será representada.
Em face disso, as figuras a serem representadas podem apresentar concavidades,
74

Figura 43 – Curvas representadas usando técnicas anti-serrilhamento em comparação à forma


limitada de como o enxame poderia representar a mesma

protuberâncias, regiões ocas e simetrias. Além disso, figuras bidimensionais discretas


podem apresentar ilhas (figura 44, ou seja, no caso do enxame isso representaria uma
concentração de robôs dentro de uma região oca e não ligados fisicamente ao resto do
enxame. Não trataremos dessa última particularidade no desenvolvimento do algoritmo,
pois ela é uma situação bem mais complexa que as demais.

Figura 44 – Surgimento de uma ilha

Regiões ocas podem ocorrer em uma formação de diversas formas, talvez a mais
básica seja por meio de leis de repulsão. Nas implementações de funções de atração e
repulsão simples 3.2.1, foi verificado que o aumento do valor do coeficiente c aumenta
o tamanho da formação e deixa a mesma com um aspecto "circular". Se o tamanho da
formação for grande o suficiente em relação à quantidade de robôs, não existirão robôs o
suficiente para preencher a formação e o enxame acabará por formar uma circunferência,
como é visto principalmente na figura 86. Uma outra forma de criar regiões ocas é
com a "morte"dos robôs no interior da formação. Nos algoritmos de reação e difusão, a
concentração de um determinado reagente diminui, ou por ele estar sendo consumido em
75

uma reação de catálise, ou por ele estar sendo retirado do espaço de reação. Obviamente,
esse artificio não pode ser adotado de forma literal em um enxame de robôs, ou ainda que
possa, em robôs moleculares, não é o ideal para uma situação mais generalista, como é o
caso deste trabalho. Mesmo assim o artificio da morte ainda pode ser usado, desde que
essa morte seja apenas um sinalizador do robô e quando marcado com esse sinalizador
ele seja "expulso"do interior da formação pelos demais robôs. O trabalho de Arbuckle
(ARBUCKLE, 2010), dá uma solução do tipo.
As concavidades podem ocorrer pelo rompimento de uma borda de uma região
oca. Isso foi verificado diversas vezes durante as execuções de algoritmos baseados no
modelo reação-difusão de Turing. Outro modo com qual concavidades apareceram durante
as execuções foi por uma taxa de crescimento, ou avanço, no entorno da região onde a
mesma surgiu. Isso em geral pode ser conseguido com algumas regras de repulsão e por
hormônios digitais. Protuberâncias podem ser conseguidas com uma abordagem parecida.
Por fim, simetrias talvez sejam a propriedade mais difícil de se alcançar. É certo
que em diversas execuções dos algoritmos implementados anteriormente, simetrias em pelo
menos um dos eixos foi verificada. No entanto ela acontece quando a organização inicial
do enxame é simétrica e não existe qualquer tipo de ruído. Nas execuções dos algoritmos
de reação e difusão simples, por exemplo, mesmo nas execuções onde o coeficiente c tinha
um valor alto e o enxame terminava por formar algo parecido com uma circunferência,
ainda havia elementos dentro da mesma e dispostos em forma aleatória. Certo que não
havia ruído ambiente, mas o enxame havia sido disposto de forma aleatória no espaço.
Nos algoritmos de reação difusão baseados no modelo de Gray-Scott, a maior parte das
execuções gerou sim, padrões simétricos em diversas vezes. No entanto todos esses foram
gerados em situações onde a concentração inicial do reagente B, ou seja, o enxame, estava
inicialmente disposto em uma formação simétrica. Na execução onde havia a presença
de um ruido (figura 27) o resultado final não apresentou simetria. O artigo de Arbuckle,
executado aqui de forma simplificada, foi o único a gerar estruturas simétricas, já que a
estrutura pré-definida também era. Mas as regras fechadas de construção do algoritmo
por ele desenvolvido, não recebem interferência do ambiente, nem de outros robôs que não
sejam interessantes para a construção da geometria final (exceto no processo de decisão de
qual estrutura deve continuar sendo construída e qual deve ser destruída). Num nível geral,
pode-se afirmar que o algoritmo de Arbuckle age como se ignorasse o ruído ambiente.
É possível que, dentro de uma faixa de erro, a simetria possa ser alcançada
manipulando as regras de atração e repulsão do enxame. Sabemos que para um enxame
que os robôs comecem estáticos em relação a uns aos outros, o centro de massa do enxame
permanece o mesmo. Como estamos partindo do princípio que os alcances dos sensores e
da comunicação de cada robô no enxame possa ser limitado, é possível fazer com que as
leis de atração e repulsão no enxame tenham pesos variados e com isso fazer com que no
76

final o próprio enxame consiga corrigir irregularidades, como foi visto na seção 3.2.2.

4.2 Células biológicas e tecidos

Algoritmos de enxame costumam ter inspiração em elementos naturais. O algoritmo


que será proposto aqui tem como inspiração o crescimento celular na formação de tecidos
e órgãos em um ser vivo. Para isso é importante entender as particularidades do modelo
biológico.
A primeira informação a se considerar é que em um organismo multicelular, todas
as células tem o mesmo DNA. Na verdade essa informação é um tanto exagerada, mesmo
no conceito mais clássico de organismo multicelular, algumas células, como os gametas
sexuais tem apenas metade do código genético e eventualmente algumas células vão ter o
DNA danificado, ou alterado por influência do ambiente. Mas de modo geral podemos sim
considerar que o DNA é o mesmo para todas as células (ALBERTS A. JOHNSON, 2010).
O DNA é uma longa molécula constituída de pequenas estruturas que se repetem
e se organizam em uma longa cadeia. Essas estruturas, chamadas nucleotídeos tem 4
variações representadas pelas letras A,T,G,C. Qualquer uma delas se liga as outras na
mesma cadeia e a G se liga à C, assim como a A se liga a T em cadeias diferentes. Duas
cadeias ligadas uma à outra é que dão o aspecto de hélice dupla do DNA.
Um erro comum é considerar que a função do DNA é passar informações hereditárias.
O fato de duas bactérias terem o mesmo DNA agirem da mesma forma, ou um descendente,
fruto de uma reprodução sexuada, ter características fenotípicas dos pais é consequência
da função do DNA e não da causa delas. O DNA é responsável por controlar a síntese
proteica celular e portanto coordenar seu funcionamento e desenvolvimento. É um processo
impressionante: trechos do DNA são transcritos em outras moléculas, chamadas RNA.
O RNA mensageiro envia instruções para os ribossomos para informar quais proteínas
devem ser sintetizadas, o transportador captura aminoácidos no interior celular e leva os
mesmos para os ribossomos e o RNA ribossômico sintetiza as proteínas.
Tudo isso é um processo condicional, que é executado de acordo com variáveis
ambientais e temporais. As células, por exemplo, possuem receptores químicos e de acordo
com o ativamento destes, trechos do DNA são transcritos em RNA e determinadas proteínas
são, ou deixam de ser produzidas. Por exemplo, células humanas tem proteína em sua
superfície chamada PD-1, essa proteína serve para inibir regular o sistema imunológico do
corpo. Quando uma célula T do sistema imunológico se liga à uma outra célula do corpo
humano, a PD-1 contida na membrana celular ativa uma sequência de auto-destruição na
célula T (esse mecanismo é o que impede uma série de doenças auto-imunes, mas também
é uma das maiores dificuldades corporais em combater o câncer). Isso acontece pois, uma
vez que o receptor é ativado, ele envia uma outra proteína para o núcleo, que ativa a
77

transcrição de determinados trechos do DNA, que são responsáveis por proteínas que
destroem o equilíbrio celular, fazendo com que a célula encolha e se desintegre (ALBERTS
A. JOHNSON, 2010).
Isso quer dizer que todas as instruções que são responsáveis pelo funcionamento
de um neurônio, por sua forma, tempo de vida e outras características também estão em
uma célula da pele, em uma célula dos ossos e muitas outras do nosso corpo. De fato,
pesquisadores já conseguiram reverter uma célula da pele de um humano adulto ao estágio
de célula tronco embrionária (CHUNG J. H. EUM, 2014). E tais células podem se tornar
qualquer outra célula especializada.
Ou seja, todas as células tem o mesmo conjunto de programas e de acordo com sua
especialização, elas passam a usar apenas alguns deles. Parte disso porque cada trecho é
associado a um receptor, que em uma alusão à maquinas, seriam os sensores e periféricos
de entrada de uma. Células de especialização diferentes possuem receptores diferentes, ou
seja, entradas de informação diferentes, blocos condicionais de instruções diferentes sendo
acionados, resultados diferentes.
No caso de humanos, bem como outras criaturas de igual complexidade celular, as
células não começam especializadas. Após a fecundação, a célula ovo começa a se dividir
formando células tronco embrionárias e de início as mesmas apenas se dividem e crescem.
Quando o embrião atinge um determinado tamanho, as próprias células embrionárias
começam a sintetizar e a emitir determinadas proteínas, que ativam genes de especialização
nas que estão ao seu redor. Variáveis ambientais, como pressão e a direção da gravidade
e temporais, como contagem de divisões realizadas são as responsáveis por ativar essa
primeira síntese de proteínas que comandam a especialização (ALBERTS A. JOHNSON,
2010).
Tecidos em crescimento também sintetizam determinadas proteínas, que influenciam
na especialização das células vizinhas, com isso é alcançada a organização espacial dos
tecidos e órgãos. Dentro dos tecidos, as células crescem de maneiras específicas. Por
exemplo na pele, as células se dispõem em superfície com maior velocidade do que se
dispõe em altura, ou seja, as células se duplicam em maior velocidade para os lados, do
que outras células, mais jovens, empurram estas para cima, para formar camadas. Já as
células musculares crescem alongadas em torno de eixos, formando estruturas fibrosas. As
células ósseas, até certo ponto tem orientação de crescimento cúbicas.
É importante lembrar que isso é uma abordagem superficial, para sermos justos e
exatos, os tecidos epiteliais de revestimento, tecidos que existem na constituição dentre
diversos órgãos a pele, tem vários tipos diferentes com várias tipos de células e organizações
de crescimento. O mesmo vale para as "células ósseas"e musculares citadas no parágrafo
anterior. Mas o ponto importante, para esse trabalho, não é a exatidão de como o
modelo biológico funciona e sim o que podemos transportar dele para o nosso algoritmo
78

morfogênico.
As células, tendo a mesma programação, mesmo executando funções tão diferentes
claramente podem ser transpostas para um robô de um enxame, já que estes também não
são previamente especializados, conforme as necessidades do enxame e com sua percepção
local é que o mesmo vai executar um determinado comportamento. A síntese e secreção
de proteínas (e portanto hormônios), atinge todas as células no ambiente (ESBERARD,
1980) e portanto pode ser considerado uma forma de comunicação via broadcasting. Os
receptores celulares fazem as vezes de sensores, mas principalmente de protocolos de
comunicação, filtrando as mensagens no sistema. Tais mensagens podem influenciar nas
decisões de controle e acoplamento de cada robô e isso nada mais é que uma analogia à
especialização e formação de tecidos.

C_0
S_3 S_4
C_4

C_2 C_3
C_1
C_0
S_0 S_1
S_5

C_2 C_3

C_1

S_2

C_0 Célula alcançou tamanho de divisão S_0 Célula embrionária em crescimento


C_1 Término da divisão S_1 Célula embrionária em divisão celular
C_2 Quantidade de hormônio liberada S_2 Célula embrionária produzindo hormônios
C_3 Condições externas S_3 Célula especializada em crescimento
C_4 Sinal de especialização S_4 Célula especializada em divisão celular
S_5 Célula especializada produzindo hormônio

Figura 45 – Representação simplificada do desenvolvimento celular em forma de uma máquina


de estados finitos

4.3 Proposta geral do processo de morfogênese programada

Baseado nas peculiaridades do problema e no modelo que serve de inspiração, é


possível propor um processo de morfogênese programada. O processo é dividido em duas
etapas, uma de treinamento ou seleção e outra de execução. O elemento básico do processo
assume a forma de célula autômata na primeira etapa e de elemento do enxame na segunda.
Em ambas as etapas ele tem os mesmos parâmetros, sendo que os valores dos mesmos
podem variar, sendo cada combinação de valores uma configuração. Apenas um parâmetro
muda de nome e de lógica entre as etapas, mas mantém seu formato e seus valores. Tal
parâmetro é o que regula o crescimento celular na primeira etapa, na segunda ele regulará
os acoplamentos entre os robôs.
79

Na etapa de treinamento ou seleção, diversas configurações são criadas aleatoria-


mente formando uma população. Cada individuo é por vez inserido em um espaço matricial
e tem seu crescimento e formato avaliados ao final de um número fixo de iterações. Os que
tiverem alcançado um resultado que mais se assemelhe à figura desejada são selecionados
e os demais descartados. A população é completada com mutações dos que foram selecio-
nados e uma nova geração é processada. Na geração em que o melhor resultado estiver
com um erro menor do que um parâmetro pré-estabelecido, a configuração responsável
por esse indivíduo é passada para todos os elementos de um enxame.
A principal diferença da etapa de treinamento para a etapa de execução é que,
enquanto na primeira temos apenas um indivíduo crescendo ao longo das iterações, na
de execução temos diversos elementos que se acoplam. Todos os indivíduos iniciam o
programa assumindo serem a primeira célula em crescimento e realizam uma etapa de
crescimento na direção que sua configuração determina. No entanto, ao invés de passar
para a próxima etapa de crescimento, o robô espera que algum outro robô entre em seu
alcance pela direção de acoplamento. Ocorrendo isso, os robôs executam um protocolo
de decisão e prioridade. Vencendo o protocolo, o robô continua se considerando a célula
inicial, o robô acoplado passa a se considerar a célula filha da inicial e ambos executam
suas próximas etapas de crescimento. Uma variável interna dificulta os acoplamentos
para células de gerações posteriores e isso garante que a formação não cresça apenas para
um lado. Além disso os robôs são inseridos no ambiente com velocidade iniciais iguais a
zero. Como visto na implementação do Boids, na seção 3.1, e do algoritmo de atração e
repulsão simples 3.2.1, o centro de massa do enxame não muda, o que aumenta as chances
de acoplamento por ambos os lados.
Devido à limitações de cronograma, hardware e da proposta deste trabalho, só a
primeira etapa do algoritmo será implementada e avaliada, reservando a etapa seguinte
para trabalhos futuros.

4.4 Definição dos parâmetros

Cada indivíduo tem o tamanho definido como o de uma célula da matriz espacial,
tem o formato quadrado e quatro acoplamentos, ou posições de crescimento possíveis: o
primeiro é orientado em sentido decrescente do número de linhas, o segundo no sentido
positivo do número de colunas, o terceiro é orientado no sentido positivo do número de
linhas e o quarto no sentido negativo do número de colunas (figura 46). A cada iteração
o autômato vai crescer para uma determinada posição. Isso se assemelha ao autômato
celular simples discutido em 3.4, desse modo os primeiros parâmetros podem ser para
onde a célula vai crescer na iteração atual e para onde ela vai crescer na próxima.
A forma básica de se fazer isso é começar crescendo em uma direção e incrementar
essa direção a cada iteração. Para esse modelo chamaremos de incremento do tipo "a"de
80

4 2

Figura 46 – Acoplamentos do robô, ou célula autômata

aritmético. Uma variação aceitável seria o incremento geométrico "g", no qual a direção
é multiplicada por um fator a cada iteração. Por fim é possível fazer um incremento
randômico "r". Este último, em princípio, não é muito vantajoso para que a célula autômata
alcance uma forma determinada, porém é importante manter o mesmo para a diversidade
genética. Se ele não for importante, ou mesmo negativo, ele acabará por desaparecer
ao longo das gerações. Não é necessário fazer um modelo com alteração de direção por
subtração. Uma vez que o incremento do modelo aritmético pode ser definido com qualquer
valor entre 1 e 4, ao selecionarmos o valor 3, ele acabará por retornar uma cada de direção.
Supondo que cada célula gerada tenha as configurações iniciais idênticas as da célula pai,
um comparativo entre os 3 métodos pode ser visto na figura 47.
É possível alterar a herança da posição de crescimento. Uma maneira é fazer com
que a célula filha herde a posição da mãe, o resultado é algo parecido com a figura 48.
Seguindo a lógica da herança, mas não se atendo ao conceito, é possível variar o modelo da
mudança de direção da célula filha. Por exemplo, uma célula que tenha modelo de direção
tipo "a"e fator de incremento 3, pode gerar uma célula de modelo "g"com incremento 2.
Para isso o parâmetro que define o modelo da célula mãe deve estar escrito "ag2". O
incremento é um parâmetro separado, mas se a célula filha vai ter um modelo diferente a
informação do parâmetro deve estar incluída no modelo. Assim a filha da célula "ag2"vai
ser "g"e não "g2". Uma alternância de parâmetros pode ser permitida com um carácter
"c"no final. A célula "ag2c"de incremento 3, vai gerar uma célula "ga3c"de parâmetro 2.
Esses dois últimos exemplos podem ser vistos na figura 49.
Nessa primeira tentativa, limitamos o tipo de herança àquele em que a célula
filha herda a posição de crescimento da mãe. Já a variação não parâmetro de modelo
de mudança de direção, o mesmo não deve ser entendido como uma herança e sim como
influência hormonal, ou especialização. Uma primeira escrita de um algoritmo quase
sempre é voltada para verificar o funcionamento geral do mesmo e portanto carece de
otimização. Por essa razão optou-se nesse trabalho por deixar as ações motivadas por
comandos hormonais implícitas, evitando assim a construção de uma matriz para cada
hormônio e a execução da difusão dos mesmos no espaço.
Apenas a variação entre dois modelos talvez não seja o suficiente para que o
81

Figura 47 – Crescimento dos tipos a,g e r. O incremento ou o fator dos tipos a e g é de 3

Figura 48 – Crescimento dos tipos a, com fator de incremento 3, mas com filhas herdando posição
da mãe
82

Figura 49 – Crescimento dos tipos ag2 e ag2c, com fator de incremento inicial 3.

autômato celular crie os tipos de vértices e linhas diferentes de uma figura, todavia com o
parâmetro de probabilidade de crescimento, degeneração e regeneração a possibilidade de
formas se expande. O parâmetro de probabilidade de crescimento é um vetor de quatro
elementos cujo os valores variam de 0 a 1 e dizem a chance da célula conseguir crescer para
a aquela direção. Se a célula falhar no teste de crescimento, ela rotaciona normalmente,
mas não gera descendente naquela iteração. A cada iteração as chances de crescimento
são reduzidas pelo fator de degeneração, um outro vetor com quatro posições e valores
variando de 0 a 1. Da mesma forma, a cada iteração, existe uma chance regulada pelo
vetor de regeneração de uma das posições ter sua probabilidade de crescimento aumentada
para 1. O vetor de regeneração tem seus valores aumentados a cada iteração e quando a
regeneração acontece, ele volta a ter seus valores iniciais. O vetor degeneração da célula
filha pode ser diferente do da célula mãe. Mais uma vez, esse sistema de degeneração e
regeneração é uma forma implícita de colocar em execução os comandos hormonais, as
especializações e as variáveis ambientais.
Por fim, o último parâmetro define o que as células devem fazer quando a posição
na qual vão crescer está ocupada. O normal é simplesmente não crescer, mas as variações
implementadas para esse parâmetro são, ir tentando outras posições no sentido horário, ir
tentando no sentido anti-horário, voltar para uma determinada posição e ir tentando no
sentido horário ou no anti-horário.
83

4.5 Regras de mutação

Para cada geração apenas um valor de um parâmetro sofre mutação, dentro dos
clones das espécies selecionadas na etapa de seleção. Quanto ao modelo de mudança de
direção, os modelos simples ("a","g", ou "r") podem mutar entre sí, ou se tornarem um
modelo com substituição, nesse caso, o valor do incremento da célula filha será o mesmo
da célula mãe. Por exemplo, um indivíduo que as células era do tipo "a"com incremento 3,
ao sofrer mutação, passando a ser um modelo com substituição por fator multiplicativo
("g") terá seu modelo sendo "ag3". Modelos de substituição poderão ter qualquer valor
do modelo alterado (por exemplo "ag3"pode mutar para "ar3", ou "ag2", ou mesmo para
algo como "aa3") ou pode se tornar um cíclico. Os cíclicos sofrem mutação em qualquer
parâmetro menos o responsável pelo ciclo.
Os parâmetros de probabilidade de crescimento, degeneração, degeneração herdada,
regeneração e regeneração base sofrem mutação no vetor por completo. É importante
observar duas coisas. A primeira é que esses são valores com o qual a célula nasce e se
alteram com o tempo. O segundo ponto é que o vetor regeneração base armazena os valores
para os quais os do vetor regeneração devem voltar quando um evento de regeneração
acontece. Isso significa que uma célula mutada vai ter seus valores de regeneração resetados,
quando isso ocorrer, para valores alienígenas ao seu valor inicial.
Já os valores de regras de retorno podem mudar entre os mesmos. Sem retorno
pode se tornar qualquer tipo de retorno, da mesma forma, os demais podem se tornar sem
retorno. Quando algum tipo muta na regra de retorno para uma posição definida e depois
fazer tentativas em um sentido horário, ou anti-horário, a posição de retorno é sempre a 1.
Essa regra de regra, em específico pode mutar para a mesma regra, mas com posição de
retorno diferente.

4.6 Regras de seleção

O método de seleção consiste em comparar a imagem formada pela célula autômata


com a imagem desejada. Apesar da importância do mesmo, discutida em 2.2, nenhum
método baseado em inteligência artificial (IA) foi utilizado, pois mais uma vez temos as
limitações de tempo e hardware, os algoritmos anteriores não passaram por quaisquer
otimizações e o objetivo deste trabalho é explorar o processo criativo em segundo plano,
testar o conceito do algoritmo proposto, na primeira etapa e não obter um resultado
funcional.
Durante a etapa de treinamento e seleção, existe apenas uma célula autômata no
espaço e devido a aleatoriedade das configurações, não é possível garantir que as figuras
venham a ser formadas na mesma região do espaço. Duas configurações distintas poderiam,
em tese, formar a mesma figura, mas em uma a célula inicial estaria em um vértice
84

enquanto na outra no centro. Deste modo, comparação por máscara não é um método
válido para a seleção.
A forma que foi encontrada para resolver isso sem ter que implementar um método
baseado em IA foi calcular os centroides de ambas as figuras e a posição relativa de
cada elemento aos mesmos e comparar. Cada indivíduo cujo a posição relativa, na figura
formada, não tiver elemento com posição relativa correspondente na figura desejada é
considerado um erro e seu valor de erro é igual a diferença da sua distância relativa com
a distância relativa mais próxima na figura desejada. Por exemplo, se um elemento da
formação tem distância 2 do centroide e na figura desejada não existe nenhum elemento
com tal distância, mas existe um com 1,8, o erro vai ser de 0,2 (equação 4.1, onde Cdf é o
conjunto das distâncias da figura desejada). Esse erro é elevado ao quadrado e somado ao
erro total (equação 4.2, onde N é o total de elementos da figura formada). Para evitar
que a seleção vicie e passe a selecionar as células autômatas que não gerem descendentes,
ou gerem demais, o erro total é somado com o módulo da diferença do total de elementos
da figura desejada com a formada, multiplicado por um fator arbitrário f (equação 4.3,
onde M é o toral de elementos na figura desejada).

i = min (|di − df |) ∀df ∈ Cdf (4.1)


i=0
d2i
X
t = (4.2)
N
f inal = −t − f |N − M | (4.3)

Com o erro de cada espécie computado, os 10% com o menor erro são selecionados, os 10%

Inicio

_t = 0

i=0

_p
i>=N _i = d_i - d_t0 j=0 i>=M _p = d_i - d_ti
< _i

_f = - _t-f|N-M| _i = _p

_t = _t + _p^2
Final

Figura 50 – Calculo do erro para o algoritmo de seleção.

com o maior são eliminados, dos restantes 10% do total de espécies são eliminadas entre
85

as que ficaram entre 10% e 50%, o restante dessas são selecionadas. E 10% do total de
espécies são selecionadas entre as que ficaram entre 50% e 90% sendo as demais eliminadas.
A figura 51 ilustra essa situação. A razão desse sorteio nas classes intermediárias é garantir
certa variabilidade genética e equivale, na analogia biológica a espécies que eram realmente
adaptadas aos seu ambiente, mas por uma razão catastrófica e alienígena acabaram por
perecer (a exemplo de uma extinção causada por atividades vulcânicas ou queda de
meteoro), enquanto algumas espécies menos adaptadas podem acabar tendo vantagens
dessa catástrofe e se acabarem por se desenvolverem.

Grupo 1 - 10% melhores, Todos


Selecionados

Grupo 2 - dos 10% melhores aos


50%. 10% do total de espécies é
eliminado

o restante é selecionado

Grupo 3- dos 50% aos 90%, 10%


do total de espécies é
selecionado

o restante é eliminado

Grupo 4, os 10% piores, todos


eliminados

Figura 51 – Ilustração do sistema de sorteio no processo de seleção.

4.7 Condições de execução

Uma execução foi escolhida como sendo a de controle. Essa é composta por uma
população de 200 espécies, em um espaço matricial de 51 linhas e 51 colunas, nos quais a
célula poderá crescer por 14 iterações. O total de gerações é de 20 e a figura de referência
é um quadrado de 5 linhas por 5 colunas (figura 52). O fator f no calculo dos erros é 0,85.

Figura 52 – Figura de referência na execução de controle.


86

As figura 53 mostra as 25 primeiras espécies selecionadas ao final das 20 gerações.


Nenhuma das figuras atingiu o quadrado 5 por 5 desejado, mas em comparação com as
formas criadas por 25 das espécies originais], mostradas pela figura 54, a seleção pelas
formas mais próximas de um quadrado é evidente. Os gráficos 55, 56 e 57 mostram,
respectivamente, os tipos de retorno, a classe do modelo de mudança de direção e a
quantidade de indivíduos gerados pelas células autômatas ao longo das gerações.

Figura 53 – 25 melhores espécimes depois de 20 gerações

Figura 54 – Resultado de 25 das 200 espécies originais 20 gerações

É notável a supremacia dos espécimes sem regra de retorno. Até o fim desse trabalho
o autor não conseguiu descobri, ou mesmo levantar hipóteses sobre essa convergência. Já
os modelos de rotação não variaram muito ao longo das gerações, apesar de ter havido
87

Figura 55 – Evolução do tipo de retorno ao longo das 20 gerações

Figura 56 – Evolução do tipo da classe de modelo de rotação ao longo das 20 gerações


88

Figura 57 – Evolução da quantidade de indivíduos gerados pelas células autômatas ao longo das
20 gerações

uma supressão dos tipos cíclicos no final e um aumento dos tipos simples (ou tipo l), isso
era esperado, já que os tipos l já começaram com uma população maior que as do tipo
2lnc. Uma surpresa foi a quantidade de modelos de rotação com componente aleatório
ao longo das gerações (gráfico 58). De fato a quantidade desses modelos no final das 20
gerações é bem menor que as quantidade iniciais, porém a redução foi abrupta e ocorreu
bem próximo do final do período de seleção. Essas observações apontam que talvez o
modelo de rotação tenha tido sua importância na forma final sobrepujada pelo sistema de
probabilidade de crescimento, degeneração e regeneração. Ou que o método de seleção
escolhido não está fazendo uma seleção razoável e que a quantidade de elementos na forma
está tendo maior impacto que a disposição dos mesmos. O fato é que pela forma como
foi escolhido para calcular o erro, o sistema está sim convergindo para um valor de erro
menor, como mostra o gráfico 59.

4.8 Variações nas condições de execução e seleção

Reduzindo o valor de f pela metade, reduzimos o peso que o método de seleção dá


para a diferença entre a quantidade de elementos na figura formada e desejada. Com isso,
a redução de espécies com elemento randômico no modelo de rotação acontece mais cedo
e de forma mais progressiva (gráfico 106, apêndice B), enquanto os modelos de rotação
2ln, ou seja, aqueles que a filha herda um modelo de rotação diferente da mãe apresentam
uma clara dominância ao final das gerações (gráfico 107, apêndice B). A redução de erro
continua a mesma, vista que o que mudou foi o sistema de seleção, então a definição de
erro também mudou (gráfico 108, apêndice B). A figura mostra que os melhores resultados
estão mais próximos de um quadrado e a convergência para espécies sem regra de retorno
89

Figura 58 – Evolução da quantidade de indivíduos com modelo de rotação aleatório ao longo das
20 gerações

Figura 59 – Evolução do erro ao longo das 20 gerações


90

permaneceu a mesma (figura 60).

Figura 60 – 25 melhores espécimes depois de 20 gerações, com f=0,425

Aumentando o valor de f para 1,275, voltamos a perceber pouco impacto dos tipos
de modelos de rotação no resultado final (um certo equilíbrio entre os tipos l e 2ln, gráfico
110, apêndice B), uma permanência do fator aleatório nos modelos de rotação (gráfico
111, apêndice B) e um resultado final com formas alongadas e menos parecidas com um
quadrado (figura 112, apêndice B).
A redução da população pela metade não causa alterações significativas, diferente
do que em tese deveria acontecer pela redução da diversidade genética. Isso se deve porque,
para 20 gerações, uma população de 100 indivíduos ainda é suficientemente diversa. O erro
(gráfico 113) a presença do fator de aleatoriedade (gráfico 114, apêndice B) e o resultado
final (figura 115, apêndice B) se assemelham aos da execução de controle. A variação do
tipo (gráfico 116, apêndice B) é que destoa, mas isso provavelmente é devido ao fato de
particularidades da população inicial e nesse caso uma redução na variabilidade genética,
além do fato do fator f estar em 0,85, fazendo com que o formato da figura final perca
força em comparação à quantidade de elementos na figura.
Da mesma forma que a redução da população não causou grande impacto no
resultado final, os efeitos do aumento da população para 300 também não geraram grandes
mudanças e isso pode ser verificado nos gráficos e figura 117,118,119 e 120 (apêndice
B). O gráfico da evolução do modelo de rotação sugere, no entanto, que a variabilidade
genética tendeu por facilitar a convergência para um determinado modelo. No entanto
é inegável que o aumento da população aumente as chances de que genéticas favoráveis
floresçam, de quatro execuções com a população de 300 espécimes, uma delas teve um
resultado bastante particular, tendo resultado final bem próximo da figura desejada (figura
121), uma curva de erro com menor quantidade de picos (gráfico 122, apêndice B), uma
91

evolução da quantidade de espécies com fator aleatório no modelo de rotação, chegando o


número destes aumentar em um determinado período até quase ser responsável por quase
todos os espécimes (gráfico 61) e apresentar uma dominância por tipos cíclicos (gráfico
62). Provavelmente, algum espécime inicial tinha uma configuração bem otimizada para
a figura desejada, e sua configuração de tipo continuam um elemento randômico e era
do tipo cíclico. Seus descendentes, todos com genética forte para a seleção em questão,
herdaram essas características.

Figura 61 – Evolução da quantidade de indivíduos com modelo de rotação aleatório ao longo das
20 gerações, com pop = 300, caso particular

Figura 62 – Evolução do tipo da classe de modelo de rotação ao longo das 20 gerações, com pop
= 300, casp particular

A redução nas gerações também impacta negativamente no resultado final. Porém


92

se a redução for feita dentro do espaço de um espaço com a mesma margem de erro, as
alterações no resultado final são mínimas. A figura e os gráficos 123, 124, 125 e 126, do
apêndice B mostram isso. O gráfico responsável por mostrar a quantidade de espécimes
com componente aleatória no modelo de rotação celular aponta um leve crescimento, mas
isso corresponde a um pico local e comparando com a execução e controle, esse pico é
esperado. O aumento de gerações para 40 também apresentou apenas leves alterações.
As características já observadas na execução de controle, mostram que no final o fator do
sistema de seleção responsável por ver a diferença da quantidade total de elementos na
figura formada com a figura desejada é que acaba por prevalecer. Os gráficos e a imagem
referente a essa execução são os 127, 128, 129 e 130 do apêndice B.

4.9 Condições finais de execução

Com base nos resultados da seção anterior, as condições da execução de controle


foram alteradas para fator f de 0,745 (obtido experimentalmente), pois isso aumenta
o peso do formato final da figura formada, no processo de seleção. Dobrar as gerações
para 40 e a população para 400, a fim de aumentar as chances de que uma configuração
favorável apareça por variabilidade genética, ou por mutação. Os resultados da execução
de controle podem ser vistos nas figuras.

Figura 63 – 25 melhores resultados usando nas novas condições de execução

4.10 Testes para outras formas pré determinadas

4.10.1 Circulo

Figuras e gráficos de referência: 131,132,133,134,135,136 e 137 do apêndice B.


93

Figura 64 – Evolução da quantidade de espécimes que contém elemento randômico no parâmetro


de modelo de rotação, usando as novas condições de execução

Figura 65 – Evolução erro nas novas condições de execução


94

Figura 66 – Evolução do tipo de retorno nas novas condições de execução

Figura 67 – Evolução do modelo de rotação nas novas condições de execução


95

Figura 68 – Evolução da quantidade de individuos na figura final, de acordo com as novas


condições de execução

O algoritmo teve dificuldades em reproduzir o círculo. O que ele apresentou como


melhores resultados foi uma sequência de espécies, umas com grande taxa de crescimento
e outras com taxa mediana, porém, nenhuma dessas conseguiu expressar algum conjunto
de vértices que se assemelhasse a algum trecho do formato da figura desejada. Ainda
assim as espécies sem retorno se tornaram dominantes. Apesar das formas distorcidas, o
processo seletor reproduziu uma taxa de erro próxima a da execução de controle. Outro
aspecto importante é que a proporção dos modelos de rotação se mantiveram próximas
das inciais, apontando que talvez, nessa execução, o modelo de rotação não tenha sido
fator determinante para a seleção.

4.10.2 Linha horizontal

Figuras e gráficos de referência: 138,139,140,141,142,143 e 144 do apêndice B.


O algoritmo foi bem sucedido em representar a linha horizontal. O fato do mesmo
não ter completado a linha se deve às limitações de iterações. Todavia, para o sistema de
seleção, o erro foi maior do que o que ocorreu no caso do circulo. Uma hipótese para isso
é o fato das distâncias relativas na figura desejada serem todas valores inteiros, enquanto
nas figuras formadas, todos os elementos podem estar com distâncias em valores de ponto
flutuante, isso faria com que cada elemento somasse um valor ao erro. O aumento de
espécies com modelos de rotação contendo fator aleatório é outra característica inesperada.
É provável que o que tenha determinado o formato de reta nos espécimes tenha sido o vetor
de probabilidade de crescimento em conjunto com o de regeneração. Alguém espécime
inicial tinha tais vetores com as posições 1 e 3, com base na figura 46, com valores bem
próximos de zero. Tal espécime deveria carregar esse elemento aleatório no seu modelo
96

de rotação e como seus descendentes acabaram se tornando o espécime dominante essa


característica dominou a população final. O gráfico dos modelos de rotação reforçam essa
hipótese, mostrando que não houve muita variação nos mesmos ao longo das gerações.

4.10.3 Linha vertical

Figuras e gráficos de referência: 145,146,147,148,149,150 e 151 do apêndice B.


O desempenho do algoritmo para reproduzir linhas verticais foi parecido com os
resultados das linhas horizontais. A reprodução foi um sucesso, sendo limitada apenas
pelo número de iterações de crescimento. O erro final foi ligeiramente mais baixo que o
verificado nas linhas horizontais e neste caso o fator aleatório foi suprimido com o tempo.
É importante observar que esse mesmo fator teve um período de incremento no meio das
gerações e o gráfico que mostra os modelos de rotação celular ao longo do tempo revelam
que as proporções dos modelos se mantiveram próximas das iniciais, o que mais uma
vez demonstra que o fator responsável pela forma final possivelmente não é o modelo de
rotação.

4.10.4 Cruz

Figuras e gráficos de referência: 152,153,154,155,156,157, 158 e 159 do apêndice B.


A cruz foi outra figura na qual o algoritmo teve dificuldades de reproduzir, no
entanto teve um sucesso melhor que o círculo. Diversos espécimes conseguiram reproduzir
3 pequenos braços, enquanto pelo menos um, o da 2o linha e 5a coluna da figura 154
chegou a reproduzir uma cruz torta, mas de quatro braços. A taxa de erro foi próxima da
execução padrão (alguns elementos da execução padrão também geraram uma figura de
3 braços). A presença do fator aleatório foi variável durante as gerações, o que poderia
indicar que não há impacto do tipo de modelo de rotação no formato final, porém o gráfico
158 mostra uma convergência e dominância para os modelos 2ln, que possivelmente indica
algum impacto desse modelo no resultado final.

4.10.5 Quadrado oco

Figuras e gráficos de referência: 160,161,162,163,164,165 e 166 do apêndice B


O quadrado oco revelou a dificuldade do algoritmo em reproduzir quinas é possível
que os parâmetros existentes não sejam suficientes para tal elemento de formação. Os
espécimes apenas conseguiram reproduzir um dos lados do quadrado. Apesar disso a
taxa de erro, de acordo com o processo de seleção, foi considerada baixa e houve uma
convergência para espécimes com modelo de rotação 2ln e 2nlc.
97

4.10.6 Coração

Figuras e gráficos de referência: 167,168,169,170,171,172,173 e 174 do apêndice B


Apesar de não conseguir reproduzir o coração, o algoritmo conseguiu assimilar e
reproduzir o mesmo como uma inclinação com uma região de maior volume (lóbulo). O
espécime melhor adaptado conseguiu reproduzir uma forma que possui várias características
da figura desejada, como a diagonal esquerda, um princípio de lóbulo esquerdo e o
afunilamento inferior. Uma outra figura, a da 4a linha e 5a coluna da figura 169 se
assemelha bastante, em formato à metade esquerda do coração. A taxa de erro também
foi baixa em comparação aos demais, o fator randômico foi suprimido e as gerações finais
começaram a apresentar uma dominância de modelo de rotação do tipo l.
98

5 ANÁLISE FINAL DOS RESULTADOS E CONCLUSÃO

5.1 Análise final dos resultados do algoritmo

A primeira etapa do algoritmo, aqui implementada, claramente não tem condições


de gerar a maioria das formas desejadas e portanto, com o que foi feito, não é possível
passar para a próxima etapa e programar um enxame para gerar tais formas. A tentativa
de gerar um círculo 4.10.1 resultou por formas que não conservam nenhum dos aspectos da
estrutura desejada, enquanto a tentativa de gerar um quadrado oco 4.10.5, resultou apenas
em arestas do mesmo. É possível que os parâmetros das espécies não sejam o suficiente
para descrever vértices muito próximos, ou vértices em arestas de pouca espessura.
No entanto é possível afirmar que pelo menos parte desses parâmetros contribuem
para a morfogênese e que a variação de seus valores pode resultar em tendências para
formas diferentes, como é visto na execução das linhas 4.10.2, 4.10.3, da forma de cruz
4.10.4e do coração 4.10.6. Nessas elementos básicos e reconhecíveis da figura desejada
apareceram nas figuras finais. Ainda que o algoritmo tenha falhado, ele mostrou que o
conceito tem potencial de funcionar.
O fato da taxa de erros final não ter variado muito entre as execuções aponta que
o sistema de seleção não é o apropriado para a tarefa. Ele consegue classificar, até certo
ponto, as formas limitadas, mas devido a sua simplicidade ele acaba permitindo erros
grosseiros e vícios na fase de seleção. Isso, no entanto havia sido previsto na seção 4.6.
Para trabalhos posteriores, após a otimização do algoritmo de processamento das gerações
a primeira coisa que deverá ser modificada é esse sistema de comparação de figuras.

5.2 Análise do processo criativo

O processo criativo do algoritmo começou com a definição do problema: fazer


um enxame de robôs assumir uma determinada forma. O as peculiaridades e condições
do problema foram analisadas, chegando a conclusão que, em um espaço bidimensional,
uma figura pode ter protuberâncias, concavidades e regiões ocas. Em seguida um modelo
natural de morfogênese foi escolhido: o crescimento celular. Tal modelo foi estudado e
uma representação simples das células como máquina de estados finito foi feita. Essa
representação foi adaptada pra um modelo artificial, com autômatos celulares, sendo a
especialização celular e a ação hormonal implícitas nos parâmetros escolhidos. Por fim
a solução foi testada. Essa primeira linha de processos representa apenas o início do
desenvolvimento do algoritmo.
Uma vez testado, é preciso verificar os erros do modelo desenvolvido e a partir
deles identificar em qual etapa do processo criativo eles foram gerados. A figura 69
mostra o planejamento do projeto. Os quadros em azul são os elementos do processo
99

de desenvolvimento, já os em verde são as decisões tomadas e os em vermelho são uma


previsão de medidas para corrigir os erros encontrados em cada uma das etapas.

Situações
OBS_5 extraordinárias
Q_6

Busca por
OBS_4 mecanismos Q_5
próximos

Revisão das
condições em
OBS_3 que a solução
Q_4
natural opera

Outros
parâmetros que
OBS_2 possam Q_3
influenciar a
solução natural

Reavaliação
OBS_1 Q_2
do modelo

Mudança nos
OBS_0 parâmetros Q_1
de teste

Busca por Análise de como Modelagem Adaptação Teste da Implementação


Análise das
Definição do a solução e
particularidades analogias na natural resolve o
da solução para o meio solução Q_0
problema do problema aprimoramentos
natureza problema natural desejado adaptada sazonais

Crescimento Modelo com Definição dos Testes


Protuberâncias, Modelo
cavidades, ilhas
de tecidos esp e horm parâmetros executados
celular
vivos implícitos do A.C neste trabalho

Sim
Não

OBS_0: Implementar um sistema de comparação de imagens mais acurado Q_0: O teste da solução resolveu os problemas de forma satisfatória?
OBS_1: Eliminar as aleatoriedades do sistema celular e passar a simulação de Q_1: O teste retorna a taxa de erros devidamente?
ruído para o ambiente Q_2: Os parâmetros do modelo são suficientes para a tarefa?
OBS_2: Futuramente mudar para um sistema com especializações e hormônios Q_3: O modelo tem conseguido reproduzir às situações do análogo natural?
descritos de forma explícita. Q_4: O modelo apresenta regras muito complexas para resolver alguns pontos
OBS_3: O modelo celular parte do princípio de replicação e crescimento. Pode da tarefa desejada?
ser que não seja o ideal para aplicar para robôs que já existem e precisam se Q_5: O modelo natural realmente resolve esse tipo de problema?
agrupar. Q_6: O algoritmo falha para uma classe específica de problemas?
OBS_4: O DNA e às proteínas são formados por combinações moleculares. Às
moléculas “peças” se unem atravéz de leis químicas, formando macromoléculas
OBS_5: Fractais, projeções geométricas não euclidianas, modelos descitos em
4 dimensões

Figura 69 – Planejamento do desenvolvimento do algoritmo

O resultado dos testes obviamente não foram satisfatórios e um dos problemas


verificados é que a taxa de erros que o processo de seleção retorna não varia muito,
independente de quão parecida as figuras formadas são das figuras desejadas. A correção
prevista para isso é a implementação de um sistema de comparação de imagens mais
100

precisos. De modo geral, as falhas apresentadas na formação do círculo e do quadrado oco


levam a crer que foi um erro ter adaptado demais o modelo celular. Em trabalhos futuros,
talvez a melhor alternativa seja fazer com os parâmetros celulares não dependam tanto
de variáveis aleatórias, fazer com que as especializações celulares fiquem mais explícitas,
coisa que pode ser feita usando uma matriz de especializações e um dos parâmetros seja
exatamente um sinalizador de condições de como e quando uma célula vai mudar de
especialização e por fim tornar explicito os canais de comunicação celular, ou seja criar
matrizes de propagação hormonal e deixar a resposta a um determinado hormônico como
sendo um parâmetro celular.
O processo criativo prevê ainda problemas que poderão surgir depois que as
falhas atuais forem sanadas. Pode ser que o modelo celular só sirva para máquinas
autorreplicadoras. Nesse caso, um ponto de partida para procurar um novo processo
natural que sirva de inspiração para um algoritmo de morfogênese é são os processos que
compartilham características com o de crescimento celular. Vimos na seção 2.1.4 que o
modelo reação-difusão de Turing usa propriedades de síntese de substâncias químicas, mas
Turing usou um modelo biológico celular no seu artigo. Dentro das células a síntese de
proteínas, ou outras macromoléculas, como o DNA e o RNA, exploram as ligações de
aminoácidos, que são moléculas menores no que estão interior celular. Esse modelo de
síntese poderia ser um bom substituto, já que aproveitaria algumas características do
modelo celular, como geometria de crescimento e especialização.
Mesmo com todos os aspectos funcionais, é sempre necessário estudar e estabelecer
os limites do processo desenvolvido. O algoritmo aqui sugerido, foi pensado para um espaço
bidimensional, com elementos alinhados aos eixos e homogeneidade entre os elementos. É
possível que o algoritmo possa ser expandido para o espaço tridimensional, com elementos
desalinhados e não homogêneos sem ser necessário alguma grande mudança na lógica.
Todavia, existem situações que podem ser consideradas exóticas nas quais mesmo que o
algoritmo já esteja em um estágio funcional ele poderá não operar dentro da normalidade.
Nanorrobôs são estruturas de nível molecular e nessa ordem de grandeza, fatores que
costumamos ignorar na robótica, como a força de repulsão dos átomos das substâncias no
meio onde o robô está localizado, passam a ser relevantes.
E o que o plano de criação revela durante todas as etapas? Que para métodos meta-
heurísticos a interdisciplinariedade é um fator extremamente importante. Um cientista
da computação, ou um engenheiro, sabe que a fecundação gera uma célula ovo que vai se
dividindo e dando forma a um embrião, mas não tem como os mesmos saberem exatamente
os fatores que controlam esse processo se não forem buscar esse conhecimento nas ciências
biológicas e da saúde. O mesmo vale para um roboticista que tenha pretensão em trabalhar
com enxames de nanorrobôs. Este pesquisador vai precisar buscar na física das partículas e
na química conhecimentos sobre as particularidades de se trabalhar em escala tão diminuta.
101

5.3 Considerações sobre otimização

Durante todo o processo de implementação nesse trabalho, foi observado que a


execução dos algoritmos não é um processo rápido. Os programas mais rápidos tinham
seu tempo de execução na casa de segundos, enquanto os mais demorados, como a etapa 1
do algoritmo proposto teve seu tempo de execução na casa de dezenas de minutos, sendo
que uma execução chegou a demorar mais de uma hora para exibir os resultados. Isso
é algo esperado, enxames de robôs tem sua vantagem no processamento paralelo das
tarefas. Quando se manda um único computador simular esse comportamento, mesmo
tendo capacidade computacional superior à do robô, na maioria dos casos essa capacidade
não vai ser superior à do enxame.
Durante todo o processo de simulação de enxame, cada elemento do mesmo precisa
acessar toda diversas informações, como por exemplo a posição dos demais membros do
enxame, ou alguma variável contida no espaço. Durante as implementações dos algoritmos
existentes, foi observado que para determinadas situações é melhor tratar do enxame em
um vetor com as coordenadas de cada robô, em outras é melhor tratar da matriz espacial
com os robôs dispersos nela. Por exemplo, no calculo de colisões, apenas a vizinhança
em um raio igual ao da sua velocidade por iteração é que interessante e portanto, tratar
as informações de posição usando a matriz espacial é um método mais rápido do que
varrer todas as posições existentes e verificar se cada está, ou não, dentro do raio de
colisão. Já funções como as de atração e repulsão usam a posição de todos os elementos
do enxame e se a quantidade de robôs for menor que a raiz da quantidade de células da
matriz espacial, requer menos operações fazer com que as posições sejam computadas
por um vetor que armazene as coordenadas de cala elemento do enxame. Uma revisão e
reescrita no algoritmo desenvolvido pode levar a uma redução no tempo de processamento
do mesmo.
É interessante também, identificar e retirar variáveis que não estejam sendo uti-
lizadas. Por exemplo, os resultados da seleção mostram que independente da forma
desejada, há uma dominância das espécies que não utilizam regra de retorno. Se com
testes posteriores, essa convergência se confirmar e se as causas dela forem confirmadas
como realmente uma dominância de espécies desse tipo, é interessante criar um modelo de
autômato celular onde essa regra de retorno não seja variável, dessa forma é uma entrada
a menos que cada indivíduo do enxame precisa processar.
Todos os algoritmos desenvolvidos e implementados nesse trabalho foram escritos
na linguagem Python, que é uma linguagem interpretada de alto nível. Sendo assim,
é de se supor que ela vá consumir mais recursos computacionais que uma linguagem
compilada como o C, pois o código em Python precisa ser executado por um programa
interpretador para só então ser executado pelo sistema operacional. Além disso, não se
declara variáveis em Python, o tipo da variável é associado à mesma depois que ela recebe
102

seu valor. Isso dificulta um gerenciamento e alocação de memórias ótimo pelo sistema
operacional. Existem ferramentas, como o Cython, que é um compilador optimístico para
Python e C, que permite chamar funções em C e mesmo declarar variáveis em Python, o
que poderia poupar ainda mais tempo de processamento.
Além de revisão do código e mudanças na compilação e interpretação do mesmo,
outro processo que pode salvar tempo de processamento é reescrever o código de forma que
o mesmo possa ser executado em múltiplas threads. Por exemplo, ao invés do programa
de seleção natural executar espécime por espécime, é possível fazer com que diversos
espécimes sejam executados em paralelo, usando o módulo multiprocessing do Python.
Esses três procedimentos, somados, poderão permitir que execuções futuras do
algoritmo sejam mais rápidas, ou que possam ser feitas em espaços maiores, com enxames
maiores e com mais variáveis ambientais.

5.4 Trabalhos futuros

As próxima etapa nessa pesquisa será, como já foi dito diversas vezes nesse capítulo,
corrigir os problemas apontados, como o da precisão do processo seletor, otimizar o código
e testar novamente o algoritmo. Se a primeira etapa for bem sucedida, um próximo
trabalho seria testar a segunda etapa, ou seja implementar as configurações vencedoras da
primeira etapa em um cenário onde todos os elementos do enxame já se encontram no
espaço, ou seja, que não ha crescimento.
O sucesso do algoritmo como um todo, abre margem para trabalhos de comparação
de desempenho com os outros algoritmos de morfogênese existentes e testes de implemen-
tação em um enxame de robôs reais. Também será buscado no futuro, caso o algoritmo se
demonstre funcional e justificável, uma expansão do mesmo para modelos tridimensionais
e não alinhados às grades cartesianas.
103

REFERÊNCIAS

ALBERTS A. JOHNSON, J. L. M. R. K. R. P. W. B. Biologia Molecular da célula. 5. ed.


RS: Artmed, 2010.

ARBUCKLE, A. R. D. Self-assembly and self-repair of arbitrary shapes by a swarm of


reactive robots: algorithms and simulations. v. 28, n. 2, p. 197–211, Fev 2010.

ARTERO, A. O. Inteligência Artificial, Teórica e Prática. 1. ed. SP: Livraria da física,


2009.

BENI, G. From Swarm Intelligence to Swarm Robotics. In: Swarm Robotics. [S.l.: s.n.],
2004. v. 3342.

BENI, J. W. G. Swarm Intelligence in Cellular Robotic Systems. In: Robots and Biological
Systems: Towards a New Bionics? [S.l.: s.n.], 1993. v. 102, p. 703–712.

BOUFFANAIS, R. Design and Control of Swarm Dynamics. 1. ed. [S.l.]: Springer, 2016.
106 p.

CHEN, P. Resposta a uma pergunta no stackoverflow, acessado em 2018. 2017.


<https://stackoverflow.com/a/47905007>.

CHUNG J. H. EUM, J. E. L. S. H. S. V. S. S. W. H. Y. L. N. R. T. E. A. K. R. E. D. R.
L. D. R. L. Y. G. Human somatic cell nuclear transfer using adult cells. Cell Stem Cell,
v. 14, p. 777–780, 2014.

ESBERARD, C. A. Neurofisiologia. 1. ed. [S.l.]: Editora Campus, 1980. 730 p.

GAZI, V. Stability Analysis of Swarms. Tese (Doutorado) — The Ohio State University,
Columbus, Estados Unidos da América, 2002.

GRAY, S. P. Autocatalytic reactions in the isothermal, continuous stirred tank reactor:


isolas and other forms of multistability. v. 38, p. 29–43, 1983.

HUANG, C. ACTUALLY Improved Evolution Simulator. 2016. <https://www.


openprocessing.org/sketch/377698>.

JUNTER, J. D. Matplotlib: A 2D Graphics Enviroment. 2007. <https://matplotlib.org/


gallery/index.html>.

LINDEBERG, T. Scale-space for discrete signals. IEEE Transactions on Pattern Analysis


and Machine Intelligence, v. 12, p. 234–254, 1990.

MAMEI M. VASIRANI, F. Z. M. Experiments of morphogenesis in swarms of simple


mobile robots. v. 18, n. 9-10, p. 903–919, 2004.

MOELLER, F. J. D. Aggregating Swarms. 2018. <https://www.youtube.com/watch?v=


5lXiqeBMuvY&list=PLVPhVf6ThSwCY0b48gqmU8d7FHTdvZVUD>.

MOELLER, F. J. D. Boids. 2018. <https://www.youtube.com/watch?v=C2rbNaOE7V0>.

MOELLER, F. J. D. Boids vs Swarm. 2018. <https://www.youtube.com/watch?v=


25feGf42dhM>.
104

MOELLER, F. J. D. Cellular Automata. 2018. <https://www.youtube.com/watch?v=


JIPhG8L_wrM&list=PLVPhVf6ThSwCOXXesU4TH2F51buqe9epw>.

MOELLER, F. J. D. Digital Hormone Swarm. 2018. <https://www.youtube.com/watch?


v=OJwJ26V14sM&list=PLVPhVf6ThSwCApPquoOkT-kU7_KEbxbBC>.

MOELLER, F. J. D. Pattern Substitution. 2018. <https://www.youtube.com/watch?v=


PaqTIQfdvuE&list=PLVPhVf6ThSwB6Xr-lpXmCIx20a_r11LV0>.

MOELLER, F. J. D. Reaction-Diffusion Models. 2018. <https://www.youtube.com/


watch?v=oKiaxNFCrjo&list=PLVPhVf6ThSwB67U5PFDGzumg25lVredC6>.

MOELLER, F. J. D. Reactive Robots. 2018. <https://www.youtube.com/watch?v=


o-zUcd_XXPc>.

MOELLER, F. J. D. Social Foraging Swarms. 2018. <https://www.youtube.com/watch?


v=2TMMZWrnnQs&list=PLVPhVf6ThSwAWeXonV2eWi0BhwS0IP1wu>.

MOELLER, F. J. D. Swarm Formation. 2018. <https://www.youtube.com/watch?v=


fbWaoL9L9-A&list=PLVPhVf6ThSwALnwmzJmJN9yl9ZAX8_1D7>.

NIKU, S. B. Introdução à robótica. 1. ed. RJ: LTC, 2013.

NIU, H. W. B. Bacterial Colony Optimization. In: Discrete Dynamics in Nature and


Society. [S.l.: s.n.], 2012. v. 2012, p. 28.

OLIPHANT, T. E. A guide to NumPy. 2006. <http://www.numpy.org/>.

REYNOLDS, C. Flocks, herds and schools: A distributed behavioral model. In:


Proceedings of the 14th annual conference on Computer graphics and interactive techniques.
[S.l.: s.n.], 1987. p. 25–34.

ROSSUN, G. Linguagem de programação Python 3.4. 2015. <https://www.python.org/>.

R.P.MUNAFO. Stable localized moving patterns in the 2-D Gray-Scott model. p. 13, Dez
2014.

RUBENSTEIN A. CORNEJO, R. N. M. Programmable self-assembly in a thousand-robot


swarm. v. 345, n. 6198, p. 795–799, Ago 2014.

SHEN P. WILL, A. G. W. Hormone-Inspired Self-Organization and Distributed Control


of Robotic Swarms. v. 17, p. 93–105, 2004.

TURING, A. M. The chemical basis of morphogenesis. In: Philosophical Transactions of


the Royal Society of London, Series B (Biological Sciences). [S.l.: s.n.], 1952. v. 237, p.
37–72.

VALDEZ, F. Swarm intelligence: An introduction, history and applications. In: Handbook


on Computational Intelligence. [S.l.]: WORLD SCIENTIFIC, 2016. p. 587–606.

WOLFRAM, S. A New Kind of Science. Wolfram Media, 2002. ISBN 1579550088.


Disponível em: <http://www.wolframscience.com>.
105

A Algoritmos existentes implementados

Observações gerais:
Todos os algoritmos descritos aqui estão disponíveis online em <https://drive.
google.com/drive/folders/14SQIs_jCR9flUD_zYCYkaCwrs9NadKsD>
O módulo numpy(OLIPHANT, 2006) foi importado como np. Portanto, todas as
funções e objetos precedidos de "np."pertencem à esse módulo. O principal módulo deste
trabalho é o módulo TCC1605 e ele aparece nos códigos abaixo importado com o nome
de TCC. Os algoritmos desenvolvidos para o capítulo 4 não se encontram nesse apêndice,
pois a formatação dos mesmos para a inserção aqui é impraticável. Todavia as funções
estão no módulo TCC1605 que está disponibilizado no link acima.

A.1 Boids

Para padronização, a variável poMtr é uma matriz com as coordenadas de cada


elemento do bando e ind é o índice do elemento em questão na matriz. velMtr é a matriz
com as componentes de velocidade de cada pássaro do bando. As funções aqui descritas
estão presentes no módulo Boids da biblioteca deste trabalho.

A.1.1 Primeira regra

def regra1(poMtr,ind):
vpos = np.zeros(np.shape(poMtr[0])) #Gera uma matriz de zeros no mesmo
#tamanho da matriz com as coordenadas dos pássaros
for i in range(len(poMtr)):
if i!=ind:
vpos+=poMtr[i]
vpos = vpos/(len(poMtr)-1) -poMtr[ind]
return vpos

A.1.2 Segunda regra

A variável lim se refere ao limite de segurança do pássaro, ou seja, a partir de qual


distância ele vai começar a se repelir de um objeto.

def regra2(poMtr,ind,lim):
vpos = np.zeros(np.shape(poMtr[0]))
for i in range(len(poMtr)):
if i!=ind:
if TCC.return_dist(poMtr[i],poMtr[ind])<lim:
106

vpos+= poMtr[ind]-poMtr[i]
return vpos

A.1.3 Terceira regra

def regra3 (velMtr,ind):


vvel = np.zeros(np.shape(velMtr[0]))
for i in range(len(velMtr)):
if i!=ind:
vvel+=velMtr[i]
vvel = vvel/(len(velMtr)-1) -velMtr[ind]
return vvel

A.1.4 Boids com apenas as três regras

def atualiza_pos(poMtr,velMtr,lim=1):
nPos = poMtr.copy()
nVel = velMtr.copy()
for i in range(len(poMtr)):
v1 = regra1(poMtr,i) # Aplica a regra1
v2 = regra2(poMtr,i,lim) # Aplica a regra2
v3 = regra3(velMtr,i) # Aplica a regra 3
nVel[i] += v1/100 + v2 + v3/8 # Atualiza a velocidade
nPos[i] += nVel[i] # Atualiza a posição
return(nPos,nVel)

A.2 Enxames agregadores

As funções aqui descritas estão no módulo TCCss da biblioteca deste trabalho. É


possível encontrar funções parecidas no módulo TCC1605. As do módulo 1605 são de uso
mais amplo, já que não tem limitação de dimensões, porém apresentam alguns erros que
não foram corrigidos até a conclusão deste trabalho.

A.2.1 Função de módulo

def ymodule(ydiff):
return (ydiff[0]**2+ydiff[1]**2)**0.5

A.2.2 Função de atração e repulsão

As variáveis xi e xj são coordenadas de posição de dois elementos de um enxame.


107

def attRep(a,b,c,xi,xj):
ydiff = xi-xj
ymod = ymodule(ydiff)**2
rep = -b*np.exp(-(ymod/c))
return -ydiff*(a+rep)

A.2.3 Modelo do enxame

def agregating_swarm(poMtr,a,b,c,vel):
resultado = poMtr.copy()
for i in range(len(poMtr)):
for j in range(len(poMtr)):
if i!=j:
resultado[i] += vel*attRep(a,b,c,poMtr[i],poMtr[j])
return resultado

A.2.4 Estabilização de formação

def agregating_swarm_deltas(poMtr,a,b,c,vel,deltas=deltas):
resultado = poMtr.copy()
for i in range(len(poMtr)):
for j in range(len(poMtr)):
if i!=j:
resultado[i] += vel*attRep(a,b,c*deltas[i,j]**2,poMtr[i],poMtr[j])
return resultado

A.2.5 Deltas para a formação de uma cruz

deltas_crux = np.array([
[0,1,sq2,1,sq2,sq5,sq5,2,sq5,2*sq2,3,sq10],
[1,0,sq5,sq2,1,sq2,2*sq2,sq5,2,sq5,sq10,3],
[sq2,sq5,0,1,2,3,1,sq2,sq5,sq10,sq5,2*sq2],
[1,sq2,1,0,1,2,sq2,1,sq2,sq5,2,sq5],
[sq2,1,2,1,0,1,sq5,sq2,1,sq2,sq5,2],
[sq5,sq2,3,2,1,0,sq10,sq5,sq2,1,2*sq2,sq5],
[sq5,2*sq2,1,sq2,sq5,sq10,0,1,2,3,sq2,sq5],
[2,sq5,sq2,1,sq2,sq5,1,0,1,2,1,sq2],
[sq5,2,sq5,sq2,1,sq2,2,1,0,1,sq2,1],
[2*sq2,sq5,sq10,sq5,sq2,1,3,2,1,0,sq5,sq2],
[3,sq10,sq5,2,sq5,2*sq2,sq2,1,sq2,sq5,0,1],
108

[sq10,3,2*sq2,sq5,2,sq5,sq5,sq2,1,sq2,1,0]
])

A.2.6 Função para captura de valores do gradiente

A concentração de nutrientes e toxinas é dado na forma de uma matriz, com cada


linha e coluna representando uma unidade de distância. As posições dos elementos do
enxame, no entanto são dadas com valores de ponto flutuante. A função em questão pega
os valores do gradiente de concentração de toxinas e nutrientes do entorno da posição do
elemento do enxame e retorna o valor médio.

def take_val(pos,mtr):
val = 0
tam = len(mtr)
if pos[0]>=0 and pos[1]>=0:
if pos[0]<tam-1 and pos[1]<tam-1:
val += mtr[int(np.floor(pos[0])),int(np.floor(pos[1]))]
val += mtr[int(np.ceil(pos[0])),int(np.floor(pos[1]))]
val += mtr[int(np.floor(pos[0])),int(np.ceil(pos[1]))]
val += mtr[int(np.ceil(pos[0])),int(np.ceil(pos[1]))]
val = val/4
return val

A.2.7 Exames de forrageamento social

def agregating_swarm_ntr(poMtr,a,b,c,vel,ntr):
gntr = np.gradient(ntr)
resultado = poMtr.copy()
for i in range(len(poMtr)):
for j in range(len(poMtr)):
if i!=j:
resultado[i] += vel*attRep(a,b,c,poMtr[i],poMtr[j])
resultado[i]-=np.array([take_val(poMtr[i],gntr[0]),
take_val(poMtr[i],gntr[1])])
return resultado

A.2.8 Regras utilizadas para a criação das matrizes de nutrientes e toxinas

Os valores das variáveis em questão são para um das matrizes utilizadas no trabalho.
Os valores utilizados em cada experimento variaram. O código foi baseado na resposta do
usuário Paul Chen a uma resposta no site stackoverflow (CHEN, 2017).
109

def divergence(f): # função de divergência


num_dims = len(f)
return np.ufunc.reduce(np.add,
[np.gradient(f[i], axis=i) for i in range(num_dims)])

NY = 100 # define o tamanho da matriz


ymin = -4. # define a área dos "montes" e "vales"
ymax = 4.
dy = (ymax -ymin )/(NY-1.)

NX = NY
xmin = -4.
xmax = 4.
dx = (xmax -xmin)/(NX-1.)

y = np.array([ ymin + float(i)*dy for i in range(NY)]) # cria vetor y


x = np.array([ xmin + float(i)*dx for i in range(NX)]) # cria vetor x

x, y = np.meshgrid( x, y, indexing = ’ij’, sparse = False)


# faz uma malha com os vetores x e y

Fx = 80*np.sin(x + 2*y) # função ao longo do vetor x


Fy = 80*np.cos(x - 2*y) # função ao longo do vetor y

F = [Fx, Fy] # Reune as funções em uma lista python


g = divergence(F) # Calcula a divergência,
#este valor que é usado como a matriz ntr.

A.3 Algoritmos baseados no modelo reação-difusão de Turing

A função del2 implementada é relativamente extensa para ser incluída textualmente


neste trabalho. O código, no entanto, está disponível no módulo del2, dentro da pasta
disponível online com todos os arquivos do projeto.

A.3.1 Algoritmo de reação difusão baseado no modelo de Gray-Scott

def reac_dif_system(A,B,Da,Db,F,k,dt,filtro=filtro5):
na = np.zeros(np.shape(A))
nb = np.zeros(np.shape(B))
la = A.copy()
110

lb = B.copy()
la = del2(la,efiltro=filtro)
lb = del2(lb,efiltro=filtro)
for i in range(len(A)):
for j in range(len(A[i])):
a=A[i,j]
b=B[i,j]
na[i,j] = a +(Da*la[i,j]-(a*b*b)+F*(1-a))*dt
nb[i,j] = b + (Db*lb[i,j]+(a*b*b)-(k+F)*b)*dt
if na[i,j]<0:
na[i,j]=0
elif na[i,j]>1:
na[i,j]=1
if nb[i,j]<0:
nb[i,j]=0
elif nb[i,j]>1:
nb[i,j]=1
return [na,nb]

A.3.2 Hormone-Inspired Self-Organization and Distributed Control of Robotic Swarms

A.3.2.1 Função que aplica os campos hormonais

O nome da função tem um 2, pois a primeira implementada levava em conta a


matriz posicional dos robôs, enquanto esta versão leva em conta só a matriz espacial.

def aplica_campo2(matriz,campo):
resultado = np.zeros(np.shape(matriz))
cc = int(np.floor(len(campo)/2))
c1 = 0
c2 = 0
for i in range(len(matriz)):
for j in range(len(matriz[i])):
if matriz[i,j]==1:
c1 = 0
for k in range(i-cc,i+cc+1):
c2 = 0
for l in range(j-cc,j+cc+1):
if k>=0 and k<len(resultado):
if l>=0 and l<len(resultado):
resultado[k,l]=
111

resultado[k,l]+campo[c1,c2]
c2+=1
c1+=1
return resultado

A.3.2.2 Função de movimento dos robôs

def moverMtr(matriz,ntr):
resultado = matriz.copy()
ps = []
maxN = 0
for i in range(len(matriz)):
for j in range(len(matriz[i])):
if matriz[i,j]==1:
maxN = 0
for k in range(i-1,i+2):
for l in range(j-1,j+2):
if k>=0 and k<len(resultado):
if l>=0 and l<len(resultado):
if ntr[k,l]>maxN:
ps=[]
ps.append([k,l])
maxN = ntr[k,l]
elif ntr[k,l]==maxN:
ps.append([k,l])
if len(ps)<=0:
ps.append([i,j])
diceFace = len(ps)
dice = np.random.randint(diceFace)
nc = ps[dice]
if resultado[nc[0],nc[1]]==0:
resultado[nc[0],nc[1]]=1
resultado[i,j]=0
ps=[]
return resultado

A.3.2.3 Regras para a construção das matrizes hormonais utilizadas

Considere os perfis hormonais matrizes N por N. Como as linhas e colunas começam


a serem contadas do 0, a última linha vai ser a linha N-1, o mesmo vale para a coluna.
Sendo assim, um anel nessa matriz é a região formada pela união de duas linhas e duas
112

colunas opostas pelo centro. O 1o anel é formado pela união da linha 0 com a coluna 0,
com a linha N-1 e a coluna N-1. O segundo anel é formado pela união das linhas 1 e N-2,
colunas 1 e N-2. O P-ésimo anel é formado pela unidão das linhas P-1, N-P e colunas P-1
e N-P.
O centro de todos os perfis hormonais tem valor zero
Perfil usado nas execuções de densidade variável (9x9)

• 1o anel = -0,5

• 2o anel = 0

• 3o anel = 0,5

• 4o anel = 1

perfil1 = -0.5*np.ones((9,9))
perfil1[1:8,1:8] = 0
perfil1[2:7,2:7] = 0.5
perfil1[3:6,3:6] = 1
perfil1[4,4] = 0

Perfil de maior concentração de Inibidor(13x13)

• 1o anel = -0,5

• 2o anel = -1

• 3o anel = -1

• 4o anel = -0.5

• 5o anel = 0

• 6o anel = 2

perfilM_I = -0.5*np.ones((13,13))
perfilM_I[1:12,1:12]= -1
perfilM_I[3:10,3:10]=-0.5
perfilM_I[4:9,4:9]=0
perfilM_I[5:8,5:8]=2
perfilM_I[6,6]=0

Perfil balanceado (11x11)


113

• 1o anel = -0,5

• 2o anel = -0,5

• 3o anel = 0

• 4o anel = 0,5

• 5o anel = 1

perfilB = -0.5*np.ones((11,11))
perfilB[2:9,2:9] = 0
perfilB[3:8,3:8] = 0.5
perfilB[4:7,4:7] = 1
perfilB[5,5]=0

Perfil de maior concentração de ativador (11x11)

• 1o anel = -0,5

• 2o anel = 0

• 3o anel = 0,25

• 4o anel = 0,75

• 5o anel = 1,25

perfilM_A = -0.5*np.ones((11,11))
perfilM_A[1:10,1:10] = 0
perfilM_A[2:9,2:9] = 0.25
perfilM_A[3:8,3:8] = 0.75
perfilM_A[4:7,4:7] = 1.25
perfilM_A[5,5]=0

Perfil com apenas ativador (11x11)

• 1o anel = 0,25

• 2o anel = 0,75

• 3o anel = 1,25

• 4o anel = 2,25

• 5o anel = 3
114

perfilA_A = 0.25*np.ones((11,11))
perfilA_A[1:10,1:10] = 0.75
perfilA_A[2:9,2:9] = 1.25
perfilA_A[3:8,3:8] = 2.25
perfilA_A[4:7,4:7] = 3
perfilA_A[5,5] = 0

A.4 A new kind of science

A.4.1 Função de rotacionar vetor

A função é usada para guiar o crescimento das sementes e brotamentos

def rotaciona(vetor,grau):
grau *= np.pi/180
resultado = np.array([vetor[0]*np.cos(grau)+vetor[1]*np.sin(grau),
-vetor[0]*np.sin(grau)+vetor[1]*np.cos(grau)])
return resultado

A.4.2 Função de crescimento de árvore

def tree_g1(vertice,mDt=M):
resultado=[]
for i in vertice:
ri = i.copy()
if i[6]: # i[6] contém a informação se a semente
# ou brotamento estão ativos
pos = i[0]
for j in range(i[2]):
intG = rotaciona(np.array([-1,0]),i[1])+pos[j]
pos = np.append(pos,np.array([intG]),axis=0)
ri[0]=pos
ri[6]=False
resultado.append(ri)
for j in range(len(i[3])):
loc = i[3][j]
resultado.append([np.array([intG]),mDt[loc][1]+i[4][j]+i[1],
int(i[2]*i[5][j]),mDt[loc][3],mDt[loc][4],mDt[loc][5],True])
else:
resultado.append(ri)
return resultado
115

A.4.3 Função de conversão para binário

Converte o valor inteiro em uma lista binária de 8 elementos

def convert_bin(n):
L=[0,0,0,0,0,0,0,0]
bl = [int(x) for x in bin(n)[2:]]
s = 8-len(bl)
for i in bl:
L[s]=i
s+=1
return L

A.4.4 Autômato celular simples

def cell_automaton3(mtr,i,r=90):
resultado = np.zeros(np.shape(mtr))
B=convert_bin(r)
for j in range(len(mtr[i])):
r = [0,0,0]
if j==0:
r[0] = mtr[i,len(mtr[i])-1]
if j==len(mtr[i])-1:
r[2]==mtr[i,0]
c1=0
for k in range(j-1,j+2):
if k>=0 and k<len(mtr[i]):
r[c1]=mtr[i,k]
c1+=1
if i+1<len(mtr):
if r[0]==1:
if r[1]==1:
if r[2]==1:
resultado[i+1,j]=B[0]
else:
resultado[i+1,j]=B[1]
else:
if r[2]==1:
resultado[i+1,j]=B[2]
else:
resultado[i+1,j]=B[3]
116

else:
if r[1]==1:
if r[2]==1:
resultado[i+1,j]=B[4]
else:
resultado[i+1,j]=B[5]
else:
if r[2]==1:
resultado[i+1,j]=B[6]
else:
resultado[i+1,j]=B[7]
return resultado

A.5 Self-Assembly and Self-Repair of Arbitrary Shapes by a Swarm of Reactive Robots:


Algorithms and Simulations, 2010

A.5.1 Função que determina a velocidade dos grupos

def vel_grupos(robos):
grupos=[]
for i in robos:
if not(i[4] in grupos):
grupos.append(i[4])
for i in grupos:
dirM = np.random.randint(4)
for j in robos:
if j[4] == i:
if dirM==0:
j[2]=-1
j[3]=0
elif dirM==1:
j[2]=0
j[3]=1
elif dirM==2:
j[2]=1
j[3]=0
else:
j[2]=0
j[3]=-1
return robos
117

A.5.2 Função que checa a vizinhança do robô

def checa_vizinhos(robo_i,robos):
vizinhos=[]
for i in range(len(robos)):
if i!=robo_i:
if (robos[i][0]==robos[robo_i][0]-1)
and (robos[i][1]==robos[robo_i][1]):
vizinhos.append(i)
elif (robos[i][0]==robos[robo_i][0])
and (robos[i][1]==robos[robo_i][1]+1):
vizinhos.append(i)
elif (robos[i][0]==robos[robo_i][0]+1)
and (robos[i][1]==robos[robo_i][1]):
vizinhos.append(i)
elif (robos[i][0]==robos[robo_i][0])
and (robos[i][1]==robos[robo_i][1]-1):
vizinhos.append(i)
return vizinhos

A.5.3 Função que acusa vizinhos que não estão no mesmo grupo que o robô

def filtra_fora_grupo(robo_i,vizinhos,robos):
grupo = robos[robo_i][4]
n_vizinhos=[]
for i in vizinhos:
if robos[i][4]!=grupo:
n_vizinhos.append(i)
return n_vizinhos

A.5.4 Protocolo de decisão

def mede_forcas(robo_i,vf,robos):
forca = robos[robo_i][12]
## forcas = []
forcas = False
for i in vf:
if robos[i][12]>forca:
## forcas.append(False)
forcas = False
elif robos[i][12]<forca:
118

## forcas.append(True)
forcas = True
else:
if np.random.rand()>0.5:
## forcas.append(False)
forcas = False
else:
## forcas.append(True)
forcas = True
return forcas

A.5.5 Função de comportamento de vértice

def ver_beha(robo_i,vf,robos):
loc=robos[robo_i][6]
for i in vf:
if (robos[i][0]==robos[robo_i][0]-1)
and(loc[0]==1):
robos[i][5]=0
robos[i][8]=1
robos[i][9]=1
robos[i][10]=robos[robo_i][7][0]-1
robos[i][11]=[robos[robo_i][11][0],0,0,0]
robos[i][4]=robos[robo_i][4]
if (robos[i][1]==robos[robo_i][1]+1)
and(loc[1]==1):
robos[i][5]=0
robos[i][8]=1
robos[i][9]=2
robos[i][10]=robos[robo_i][7][1]-1
robos[i][11]=[0,robos[robo_i][11][1],0,0]
robos[i][4]=robos[robo_i][4]
if (robos[i][0]==robos[robo_i][0]+1)
and(loc[2]==1):
robos[i][5]=0
robos[i][8]=1
robos[i][9]=3
robos[i][10]=robos[robo_i][7][2]-1
robos[i][11]=[0,0,robos[robo_i][11][2],0]
robos[i][4]=robos[robo_i][4]
119

if (robos[i][1]==robos[robo_i][1]-1)
and(loc[3]==1):
robos[i][5]=0
robos[i][8]=1
robos[i][9]=4
robos[i][10]=robos[robo_i][7][3]-1
robos[i][11]=[0,0,0,robos[robo_i][11][3]]
robos[i][4]=robos[robo_i][4]
return robos

A.5.6 Função de comportamento de linha:

def line_beha(robo_i,vf,robos,Ver=V):
dirL = robos[robo_i][9]
if robos[robo_i][10]>0:
for i in vf:
if (robos[i][0]==robos[robo_i][0]-1)
and(dirL==1):
robos[i][5]=0
robos[i][8]=1
robos[i][9]=1
robos[i][10]=robos[robo_i][10]-1
robos[i][11]=[robos[robo_i][11][0],0,0,0]
robos[i][4]=robos[robo_i][4]
if (robos[i][1]==robos[robo_i][1]+1)
and(dirL==2):
robos[i][5]=0
robos[i][8]=1
robos[i][9]=2
robos[i][10]=robos[robo_i][10]-1
robos[i][11]=[0,robos[robo_i][11][1],0,0]
robos[i][4]=robos[robo_i][4]
if (robos[i][0]==robos[robo_i][0]+1)
and(dirL==3):
robos[i][5]=0
robos[i][8]=1
robos[i][9]=3
robos[i][10]=robos[robo_i][10]-1
robos[i][11]=[0,0,robos[robo_i][11][2],0]
robos[i][4]=robos[robo_i][4]
120

if (robos[i][1]==robos[robo_i][1]-1)
and(dirL==4):
robos[i][5]=0
robos[i][8]=1
robos[i][9]=4
robos[i][10]=robos[robo_i][10]-1
robos[i][11]=[0,0,0,robos[robo_i][11][3]]
robos[i][4]=robos[robo_i][4]
else:
for i in vf:
if (robos[i][0]==robos[robo_i][0]-1)
and(dirL==1):
robos[i][5]=1
robos[i][6]=V[robos[robo_i][11][0]][1]
robos[i][7]=V[robos[robo_i][11][0]][2]
robos[i][8]=0
robos[i][9]=0
robos[i][10]=0
robos[i][11]=V[robos[robo_i][11][0]][3]
robos[i][4]=robos[robo_i][4]
if (robos[i][1]==robos[robo_i][1]+1)
and(dirL==2):
robos[i][5]=1
robos[i][6]=V[robos[robo_i][11][1]][1]
robos[i][7]=V[robos[robo_i][11][1]][2]
robos[i][8]=0
robos[i][9]=0
robos[i][10]=0
robos[i][11]=V[robos[robo_i][11][1]][3]
robos[i][4]=robos[robo_i][4]
if (robos[i][0]==robos[robo_i][0]+1)
and(dirL==3):
robos[i][5]=1
robos[i][6]=V[robos[robo_i][11][2]][1]
robos[i][7]=V[robos[robo_i][11][2]][2]
robos[i][8]=0
robos[i][9]=0
robos[i][10]=0
robos[i][11]=V[robos[robo_i][11][2]][3]
121

robos[i][4]=robos[robo_i][4]
if (robos[i][1]==robos[robo_i][1]-1)
and(dirL==4):
robos[i][5]=1
robos[i][6]=V[robos[robo_i][11][3]][1]
robos[i][7]=V[robos[robo_i][11][3]][2]
robos[i][8]=0
robos[i][9]=0
robos[i][10]=0
robos[i][11]=V[robos[robo_i][11][3]][3]
robos[i][4]=robos[robo_i][4]
return robos

A.5.7 Função de destruição de grupos

def desfaz_grupos(robo_i,robos):
grupo = robos[robo_i][4]
grupos=[]
for i in robos:
if not(i[4] in grupos):
grupos.append(i[4])
grp=1
for i in robos:
grpOk= False
while not(grpOk):
if grp in grupos:
grp+=1
else:
grpOk = True
if i[4]==grupo:
i[4]=grp
grp+=1
return robos

A.5.8 Função de colisão

def ver_mov_gpg(gpr,robos,maxB=50):
livre = True
for i in range(len(robos)):
if robos[i][4]==gpr:
v=checa_vizinhos(i,robos)
122

vf=filtra_fora_grupo(i,v,robos)
relpos=[robos[i][0]+robos[i][2],
robos[i][1]+robos[i][3]]
if len(vf)>0:
for j in vf:
if TCC.compara_vec(np.array(relpos),
np.array([robos[j][0],robos[j][1]])):
livre = False
if relpos[0]<=0 or relpos[1]<=0:
livre = False
if relpos[0]>=maxB or relpos[1]>=maxB:
livre = False
if livre:
for i in range(len(robos)):
if robos[i][4]==gpr:
robos[i][0]+=robos[i][2]
robos[i][1]+=robos[i][3]
return robos

A.5.9 Função de formação de padrões

def patt_for(robos,verM=V,maxB=50):
for i in range(len(robos)):
v=checa_vizinhos(i,robos)
if len(v)>0:
vf=filtra_fora_grupo(i,v,robos)
if len(vf)>0:
rf = mede_forcas(i,vf,robos)
if rf:
if robos[i][5]==1:
robos = ver_beha(i,vf,robos)
else:
robos = line_beha(i,vf,robos,verM)
else:
robos = desfaz_grupos(i,robos)
robos = forca_grupo(robos)
robos = vel_grupos(robos)
ver_gpr=[]
for i in robos:
if not (i[4]in ver_gpr):
123

robos = ver_mov_gpg(i[4],robos,maxB)
ver_gpr.append(i[4])
return robos
124

B Figuras e gráficos complementares

B.1 Enxames agregadores

B.1.1  ≈ 38, 36

B.1.1.1 a = 0, 1

Figura 70 – Convergência do enxame com coeficiente a igual a 0,1

Figura 71 – Distâncias máxima, mínima e média dos elementos do enxame ao longo das iterações
com o coeficiente a igual a 0,1
125

Figura 72 – Distâncias máxima, mínima e média dos elementos do enxame ao longo das iterações
com o coeficiente a igual a 0,1, iterações = 0,01

Figura 73 – Distâncias máxima, mínima e média dos elementos do enxame ao longo das iterações,
foco no trecho final, com o coeficiente a igual a 0,1, iterações = 0,01
126

B.1.1.2 b = 200

Figura 74 – Convergência do enxame com coeficiente b igual a 200

Figura 75 – Distâncias máxima, mínima e média dos elementos do enxame ao longo das iterações
com o coeficiente b igual a 200
127

Figura 76 – Distâncias máxima, mínima e média dos elementos do enxame ao longo das iterações,
foco no trecho final, com o coeficiente b igual a 200

B.1.1.3 c = 20

Figura 77 – Convergência do enxame com coeficiente c igual a 20


128

Figura 78 – Distâncias máxima, mínima e média dos elementos do enxame ao longo das iterações
com o coeficiente c igual a 20

Figura 79 – Distâncias máxima, mínima e média dos elementos do enxame ao longo das iterações,
foco no trecho final, com o coeficiente c igual a 20
129

B.1.2 Outros valores de 

B.1.2.1 a = 0, 001

Figura 80 – Convergência do enxame com coeficiente a igual a 0,001

Figura 81 – Distâncias máxima, mínima e média dos elementos do enxame ao longo das iterações
com o coeficiente a igual a 0,001
130

Figura 82 – Distâncias máxima, mínima e média dos elementos do enxame ao longo das iterações,
foco no trecho final, com o coeficiente a igual a 0,001

B.1.2.2 b = 20000

Figura 83 – Convergência do enxame com coeficiente b igual a 20000


131

Figura 84 – Distâncias máxima, mínima e média dos elementos do enxame ao longo das iterações
com o coeficiente b igual a 20000

Figura 85 – Distâncias máxima, mínima e média dos elementos do enxame ao longo das iterações,
foco no trecho final, com o coeficiente b igual a 20000
132

B.1.2.3 c = 2000

Figura 86 – Convergência do enxame com coeficiente c igual a 2000

Figura 87 – Distâncias máxima, mínima e média dos elementos do enxame ao longo das iterações
com o coeficiente c igual a 2000
133

Figura 88 – Distâncias máxima, mínima e média dos elementos do enxame ao longo das iterações,
foco no trecho final, com o coeficiente c igual a 2000

B.1.3 Enxame de forrageamento com 200 elementos

Figura 89 – Enxame de forrageamento com 200 elementos presos em ilhas

B.2 Algoritmos baseados no modelo reação difusão de Turing

B.2.1 Resultados dos algoritmos baseados no modelo de Gray-Scott

B.2.1.1 Mesmos coeficientes, diferentes concentrações iniciais de B

Figura 90 – B em duas ilhas retangulares


134

Figura 91 – B em circulo

Figura 92 – B em cinco quadrados intercalados

Figura 93 – B em linha

B.2.1.2 Mesmas concentrações iniciais, variação de k

Figura 94 – Redução do valor de k para 0,06

Figura 95 – Aumento do valor de k para 0,064


135

B.2.1.3 Mesmas concentrações, variação de f

Figura 96 – Redução do valor de f para 0,03

Figura 97 – Redução do valor de f para 0,03 e k para 0,06

B.3 A new kind of science

B.4 Pattern Substitution

Figura 98 – Arvore do vídeo I

Figura 99 – Arvore do vídeo III

Figura 100 – Padrão em linhas do vídeo IV


136

Figura 101 – Padrão em linhas do vídeo V

B.4.1 Cellular Automata

Figura 102 – Regra 30

Figura 103 – Regra 90

Figura 104 – Regra 110

Figura 105 – Regra 250


137

B.5 Desenvolviemnto do algoritmo, variação na execução de controle

B.5.1 f=0,425

Figura 106 – Evolução da quantidade de indivíduos com modelo de rotação aleatório ao longo
das 20 gerações, com f = 0,425

Figura 107 – Evolução do tipo da classe de modelo de rotação ao longo das 20 gerações, com f =
0,425
138

Figura 108 – Evolução do erro ao longo das 20 gerações, com f = 0,425

Figura 109 – Evolução do tipo de retorno ao longo das 20 gerações, com f = 0,425
139

B.5.2 f=1,275

Figura 110 – Evolução do tipo da classe de modelo de rotação ao longo das 20 gerações, com f =
1,275

Figura 111 – Evolução da quantidade de indivíduos com modelo de rotação aleatório ao longo
das 20 gerações, com f = 1,275
140

Figura 112 – 25 melhores espécimes depois de 20 gerações, com f=0,1,275

B.5.3 pop=100

Figura 113 – Evolução do erro ao longo das 20 gerações, com pop = 100
141

Figura 114 – Evolução da quantidade de indivíduos com modelo de rotação aleatório ao longo
das 20 gerações, com pop = 100

Figura 115 – 25 melhores espécimes depois de 20 gerações, com pop = 100


142

Figura 116 – Evolução do tipo da classe de modelo de rotação ao longo das 20 gerações, com
pop = 100

B.5.4 pop=300

Figura 117 – Evolução do erro ao longo das 20 gerações, com pop = 300
143

Figura 118 – Evolução da quantidade de indivíduos com modelo de rotação aleatório ao longo
das 20 gerações, com pop = 300

Figura 119 – 25 melhores espécimes depois de 20 gerações, com pop = 300


144

Figura 120 – Evolução do tipo da classe de modelo de rotação ao longo das 20 gerações, com
pop = 300

B.5.5 pop=300, caso particular

Figura 121 – 25 melhores espécimes depois de 20 gerações, com pop = 300, caso particular
145

Figura 122 – Evolução do erro ao longo das 20 gerações, com pop = 300, caso particular

B.5.6 gerações = 10

Figura 123 – Evolução do erro ao longo das 10 gerações


146

Figura 124 – Evolução da quantidade de indivíduos com modelo de rotação aleatório ao longo
das 10 gerações

Figura 125 – 25 melhores espécimes depois de 10 gerações


147

Figura 126 – Evolução do tipo da classe de modelo de rotação ao longo das 10 gerações

B.5.7 gerações = 40

Figura 127 – Evolução do erro ao longo das 40 gerações


148

Figura 128 – Evolução da quantidade de indivíduos com modelo de rotação aleatório ao longo
das 40 gerações

Figura 129 – 25 melhores espécimes depois de 40 gerações


149

Figura 130 – Evolução do tipo da classe de modelo de rotação ao longo das 40 gerações

B.5.8 Circulo

Figura 131 – Figura desejada para a segunda execução

Figura 132 – Os 25 melhores resultados, figura desejada = circulo


150

Figura 133 – Evolução do erro, figura desejada = circulo

Figura 134 – Evolução da quantidade de espécies com fator aleatório no modelo de rotação,
figura desejada = circulo
151

Figura 135 – Evolução do tipo de retorno, figura desejada = circulo

Figura 136 – Evolução do tipo de modelo de rotação, figura desejada = circulo


152

Figura 137 – Evolução da quantidade de elementos na figura formada, figura desejada = circulo

B.5.9 Linha horizontal

Figura 138 – Figura desejada para a terceira execução

Figura 139 – Os 25 melhores resultados, figura desejada = linha horizontal


153

Figura 140 – Evolução do erro, figura desejada = linha horizontal

Figura 141 – Evolução da quantidade de espécies com fator aleatório no modelo de rotação,
figura desejada = linha horizontal
154

Figura 142 – Evolução do tipo de retorno, figura desejada = linha horizontal

Figura 143 – Evolução do tipo de modelo de rotação, figura desejada = linha horizontal
155

Figura 144 – Evolução da quantidade de elementos na figura formada, figura desejada = linha
horizontal

B.5.10 Linha vertical

Figura 145 – Figura desejada para a quarta execução

Figura 146 – Os 25 melhores resultados, figura desejada = linha vertical


156

Figura 147 – Evolução do erro, figura desejada = linha vertical

Figura 148 – Evolução da quantidade de espécies com fator aleatório no modelo de rotação,
figura desejada = linha vertical
157

Figura 149 – Evolução do tipo de retorno, figura desejada = linha vertical

Figura 150 – Evolução do tipo de modelo de rotação, figura desejada = linha vertical
158

Figura 151 – Evolução da quantidade de elementos na figura formada, figura desejada = linha
vertical

B.5.11 Cruz

Figura 152 – Figura desejada para a quinta execução

Figura 153 – Os 25 melhores resultados, figura desejada = cruz


159

Figura 154 – Do 75o ao 100o melhores resultados, figura desejada = cruz

Figura 155 – Evolução do erro, figura desejada = cruz


160

Figura 156 – Evolução da quantidade de espécies com fator aleatório no modelo de rotação,
figura desejada = cruz

Figura 157 – Evolução do tipo de retorno, figura desejada = cruz


161

Figura 158 – Evolução do tipo de modelo de rotação, figura desejada = cruz

Figura 159 – Evolução da quantidade de elementos na figura formada, figura desejada = cruz

B.5.12 Quadrado oco

Figura 160 – Figura desejada para a sexta execução


162

Figura 161 – Os 25 melhores resultados, figura desejada = quadrado oco

Figura 162 – Evolução do erro, figura desejada = quadrado oco


163

Figura 163 – Evolução da quantidade de espécies com fator aleatório no modelo de rotação,
figura desejada = quadrado oco

Figura 164 – Evolução do tipo de retorno, figura desejada = quadrado oco


164

Figura 165 – Evolução do tipo de modelo de rotação, figura desejada = quadrado oco

Figura 166 – Evolução da quantidade de elementos na figura formada, figura desejada = quadrado
oco

B.5.13 Coração

Figura 167 – Figura desejada para a ultima execução


165

Figura 168 – Os 25 melhores resultados, figura desejada = coração

Figura 169 – Do 50o ao 75o melhores resultados, figura desejada = coração


166

Figura 170 – Evolução do erro, figura desejada = coração

Figura 171 – Evolução da quantidade de espécies com fator aleatório no modelo de rotação,
figura desejada = coração
167

Figura 172 – Evolução do tipo de retorno, figura desejada = quadrado oco

Figura 173 – Evolução do tipo de modelo de rotação, figura desejada = quadrado oco
168

Figura 174 – Evolução da quantidade de elementos na figura formada, figura desejada = quadrado
oco

Você também pode gostar