UNIVERSIDADE DO VALE DO ITAJAÍ
CENTRO DE CIÊNCIAS TECNOLÓGICAS DA TERRA E DO MAR
CURSO DE CIÊNCIA DA COMPUTAÇÃO
REDE NEURAL ARTIFICIAL PARA O DESLOCAMENTO DE UM ROBÔ
AUTÔNOMO
Área de Inteligência Artificial
por
Marlos Roberto de Souza Filho
Rudimar Luiz Scaranto Dazzi, Dr.
Orientador
Itajaí (SC), novembro de 2009
UNIVERSIDADE DO VALE DO ITAJAÍ
CENTRO DE CIÊNCIAS TECNOLÓGICAS DA TERRA E DO MAR
CURSO DE CIÊNCIA DA COMPUTAÇÃO
REDE NEURAL ARTIFICIAL PARA O DESLOCAMENTO DE UM ROBÔ
AUTÔNOMO
Área de Inteligência Artificial
por
Marlos Roberto de Souza Filho
Relatório apresentado à Banca Examinadora do
Trabalho de Conclusão do Curso de Ciência da
Computação para análise e aprovação.
Orientador: Rudimar Luiz Scaranto Dazzi, Dr.
Itajaí (SC), novembro de 2009
"A luta pela verdade deve ter precedência sobre todas as outras."
Albert Einstein
"Possuímos em nós mesmos, pelo pensamento e a vontade, um poder de ação que se estende muito
além dos limites de nossa esfera corpórea."
Allan Kardec
"A compaixão para com os animais é das mais nobres virtudes da natureza humana."
Charles Darwin
"Embora ninguém possa voltar atrás e fazer um novo começo, qualquer um pode começar agora e
fazer um novo fim."
Francisco Cândido Xavier
“Há mais ventura em dar, que em receber.”
Jesus Cristo
"Não me sinto obrigado a acreditar que o mesmo Deus que nos dotou de sentidos, razão e intelecto,
pretenda que não os utilizemos."
Galileu Galilei
"A liberdade não é somente um direito que se reclama para si próprio: ela é também um dever que
se assume em relação aos outros."
João Paulo II
"Todos gostamos de belas palavras, porém poucos de nós as transformam em atos."
Sun Tzu
"Nossas dúvidas são traidoras e nos fazem perder o bem que, com freqüência, poderíamos ganhar,
por simples medo de arriscar."
William Shakespeare
"Não é o destino que importa, mas sim a viagem."
Autor Desconhecido
"Faça o bem a todas as criaturas em todos os locais da Terra, faça sem esperar nada em troca."
Autor Desconhecido
ii
DEDICATÓRIA
A Deus.
Aos Bons Espíritos.
Aos meus amados pais (Claudete e Enoir) por toda educação,
carinho e amor que sempre me deram,
e ao meu amado irmãozinho (Christian) pelo carinho.
iii
AGRADECIMENTOS
A Deus, por tudo;
Aos Bons Espíritos, pelo auxílio;
A minha amada mãe Claudete, que sempre reza e torce por mim;
Ao meu amado pai Enoir, que sempre acreditou em mim;
Ao meu amado irmãozinho Christian, pelo enorme carinho e companheirismo;
A minha família que sempre me apoiou e incentivou muito e por ser a minha maior fonte de
referência;
Ao meu amigo Nilson Debatin, pelo interesse e auxílio nos testes do ambiente de simulação
Khepera e no desenvolvimento do código construído em linguagem C utilizado no software de
testes da RNA;
Ao meu amigo Ricardo Erick Rebelo, pela ajuda no desenvolvimento do código na
linguagem C utilizado no software de testes da RNA;
Ao meu amigo Fábio Coelho, pelo apoio e ajuda na fase de implementação do ambiente
virtual desenvolvido em Java, construído sobre o software Simbad 3D.
Ao meu amigo Emerson Del Sent pelo auxílio no desenvolvimento do abstract deste projeto;
Ao meu orientador, professor Rudimar, pelo conhecimento passado, pelo incentivo, pela
confiança e principalmente pela paciência;
À Banca Examinadora, pelas sugestões e críticas que auxiliaram na elaboração final de um
documento maduro e consistente em relação à natureza do projeto;
Enfim, a todos que direta ou indiretamente auxiliaram na execução desse projeto.
iv
SOUZA FILHO, Marlos Roberto de. Rede Neural Artificial para o deslocamento de um Robô
Autônomo. 2009. 210 f. Trabalho de Conclusão de Curso (Bacharel) - Curso de Ciência da
Computação, Univali, Itajaí, 2009.
v
SUMÁRIO
LISTA DE ABREVIATURAS ................................................................. ix
LISTA DE FIGURAS ................................................................................ x
LISTA DE TABELAS ............................................................................ xiii
RESULMO............................................................................................... xiv
ABSTRACT .............................................................................................. xv
1 Introdução .............................................................................................. 1
1.1 INTELIGÊNCIA E AUTONOMIA................................................................... 1
1.2 NAVEGAÇÃO AUTÔNOMA DE ROBÔS E APRENDIZAGEM................ 2
1.3 ABORDAGENS PARA SISTEMAS AUTÔNOMOS INTELIGENTES ...... 4
1.4 PROBLEMATIZAÇÃO ..................................................................................... 7
1.4.1 Formulação do Problema ................................................................................. 7
1.4.2 Solução Proposta ............................................................................................... 8
1.5 OBJETIVOS ........................................................................................................ 8
1.5.1 Objetivo Geral ................................................................................................... 8
1.5.2 Objetivos Específicos ........................................................................................ 8
1.6 METODOLOGIA................................................................................................ 9
1.7 ESTRUTURA DO TRABALHO...................................................................... 10
2 Fundamentação Teórica ..................................................................... 11
2.1 ROBÔS ............................................................................................................... 11
2.1.1 Breve histórico dos robôs móveis................................................................... 11
2.1.2 Definições de robôs móveis............................................................................. 13
2.1.3 Robôs Inteligentes ........................................................................................... 13
2.2 INTELIGÊNCIA ARTIFICIAL ...................................................................... 13
2.3 REDES NEURAIS ARTIFICIAIS................................................................... 14
2.3.1 Neurônios Artificiais: Modelo MCP.............................................................. 15
2.3.2 Função de Ativação......................................................................................... 16
2.3.3 Topologias de Redes Neurais Artificiais ....................................................... 16
2.3.4 Principais Arquiteturas de Redes Neurais Artificiais ................................. 17
2.3.5 Aprendizado..................................................................................................... 19
2.3.5.1 Aprendizado Supervisionado ......................................................................... 20
2.3.5.2 Aprendizado Não-supervisionado .................................................................. 21
2.3.5.3 O Algoritmo Backpropagation ....................................................................... 21
2.4 SENSORES ........................................................................................................ 25
2.5 ATUADORES .................................................................................................... 26
2.6 CONTROLADORES ........................................................................................ 27
2.7 FERRAMENTAS PARA CRIAÇÃO DE RNAS ........................................... 28
2.7.1 Java Object Oriented Neural Engine – Joone.............................................. 28
vi
2.7.2 Stuttgart Neural Network Simulator – SNNS.............................................. 29
2.7.3 Java Neural Network Simulator – JavaNNS................................................ 31
2.8 SIMULADORES DE ROBÔS.......................................................................... 33
2.8.1 Robocode.......................................................................................................... 33
2.8.2 Khepera Simulator.......................................................................................... 36
2.8.3 Simbad 3D........................................................................................................ 38
2.9 FERRAMENTAS SIMILARES....................................................................... 40
2.9.1 Utilizando RNAs no Controle de Robôs Moveis Aplicados ao Combate de
Incêndios Florestais................................................................................................... 40
2.9.2 Estacionamento de um Veículo de Forma Autônoma Utilizando RNAs... 41
2.9.3 Dirigibilidade de Mini-Robôs com RNAs: Uma Experiência Acadêmica . 41
3 Projeto................................................................................................... 42
3.1
3.2
3.3
3.4
3.5
METODOLOGIA.............................................................................................. 44
REQUISITOS FUNCIONAIS .......................................................................... 46
REQUISITOS NÃO FUNCIONAIS ................................................................ 46
REGRAS DE DECISÃO DA REDE NEURAL ARTIFICIAL..................... 47
FUNCIONAMENTO DA RNA E DO VEÍCULO.......................................... 49
4 Implementação..................................................................................... 53
4.1 DEFINIÇÃO DO AMBIENTE DE MANIPULAÇÃO DA RNA ................. 53
4.1.1 Criação dos Arquivos de Padrões.................................................................. 55
4.1.2 Instalação e Detalhamento da Ferramenta JavaNNS ................................. 56
4.1.2.1 Criando a Rede Neural Artificial.................................................................... 56
4.1.2.2 Manipulando a Rede Neural Artificial ........................................................... 59
4.1.3 As Redes Neurais Artificiais Criadas no JavaNNS...................................... 61
4.1.3.1 Primeira RNA apresentada – GSC200901-A................................................. 62
4.1.3.2 Segunda RNA Apresentada – GSC200901-B................................................ 64
4.1.3.3 Terceira RNA Apresentada – GSC200901-C ................................................ 66
4.1.3.4 Quarta RNA Apresentada – GSC200901-D................................................... 70
4.1.4 Convertendo o Arquivo da RNA para a Linguagem C............................... 72
4.1.5 Analisando o Arquivo de Resultado da RNA............................................... 74
4.1.6 Comparando as RNAs apresentadas............................................................. 76
4.1.7 Utilizando a RNA em um aplicativo.............................................................. 77
4.2 DYNAMIC LINK LIBRARY – DLL. ............................................................. 80
4.2.1 Verificando o cabeçalho das DLLs criadas .................................................. 80
4.2.2 Validando as DLLs desenvolvidas................................................................. 81
4.3 DEFINIÇÃO DO AMBIENTE DE SIMULAÇÃO DO ROBÔ. ................... 82
4.3.1 A Biblioteca JNA. ............................................................................................ 83
4.3.2 Criação dos Mundos Virtuais e dos Robôs Virtuais.................................... 85
4.3.3 Chamada e Utilização da Biblioteca RNA. ................................................... 87
5 Resultados............................................................................................. 89
6 Dificuldades .......................................................................................... 92
vii
7 Conclusão.............................................................................................. 93
7.1 PROJETOS FUTUROS. ................................................................................... 93
Referências Bibliográficas....................................................................... 95
A Trabalhando com DLLs...................................................................... 99
B Criando a DLL Utilizando o C++ Borland 2010 ............................ 103
C Criando a DLL Utilizando o Dev C++ 4.......................................... 108
D Carregando uma DLL Estáticamente ............................................. 112
E Carregando uma DLL Dinâmicamente........................................... 115
F RNA gerada pelo Ambiente JavaNNS............................................. 119
G Arquivo de Treinamento da RNA.................................................... 121
H Arquivo de Validação da RNA......................................................... 142
I Arquivo de Resultado da RNA - Validação .................................... 147
J Código Fonte do Aplicativo Validador da RNA............................. 169
K Planilha com os Padrões de Entrada e Saída.................................. 174
L Código Fonte do Arquivo PDRNA.DLL ......................................... 179
M Código Fonte do Mundo MarlosObstaculo..................................... 190
N Código Fonte do Mundo MarlosLaberinto..................................... 191
O Alterações para Adaptar o Robô à RNA......................................... 193
viii
LISTA DE ABREVIATURAS
BP
CA
CC
DLL
GSC
GNU
GPL
IPVR
IA
JavaNNS
JNA
JNI
JOONE
MLP
Quickprop
PRNA
PDRNA
RBF
RCS
RProp
RNA
SNA
SNNS
TCC
TDNN
WSI
UNIVALI
VSC
VSD
VSE
X11R4
X11R5
XGUI
Backpropagation
Corrente Alternada
Corrente Contínua
Dynamic Link Library
Graduation in Science of the Computation
GNU is Not Unix
General Public Licence
Institute for Parallel and Distributed High Performance Systems
Inteligência Artificial
Java Neural Network Simulator
Java Native Access
Java Native Interface
Java Object Oriented Neural Engine
Multilayer Perceptron
Quickpropagation
Projeto Rede Neural Artificial
Projeto Dev Rede Neural Artificial
Generalized Radial Basis functions
Revision Control System
Resilient Backpropagation
Rede Neural Artificial
Sistema de Navegação Autônoma
Stuttgart Neural Network Simulator
Trabalho de Conclusão de Curso
time-delay neural networks
Wilhelm-Schickard-Institute for Computer Science
Universidade do Vale do Itajaí
Valor do Sensor Central
Valor do Sensor Direito
Valor do Sensor Esquerdo
X Window System - Version 11 release 4 of the X protocol
X Window System - Version 11 release 5 of the X protocol
X Graphical User Interface
ix
LISTA DE FIGURAS
Figura 1. Shakey, Kephera e Sojourmer. ...........................................................................................12
Figura 2. Neurônio de McCulloch e Pitts...........................................................................................16
Figura 3. Feedforward de uma camada. .............................................................................................18
Figura 4. Feedforward de duas camadas. ...........................................................................................18
Figura 5. Recorrência entre saída e intermediária..............................................................................18
Figura 6. Recorrência auto-associativa. .............................................................................................18
Figura 7. Aprendizado supervisionado ..............................................................................................20
Figura 8. Aprendizado não-supervisionado .......................................................................................21
Figura 9. Esquema de funcionamento do Algoritmo Backpropagation. ............................................23
Figura 10. Exemplo de uma superfície de erro para um treinamento usando backpropagation. .......24
Figura 11. Tipos de funções de ativação mais utilizados...................................................................25
Figura 12. Ambiente do Java Object Neural Engine – Joone. ...........................................................28
Figura 13. Ambiente do Stuttgart Neural Network Simulator – SNNS. ............................................31
Figura 14. Ambiente do Java Neural Network Simulator – JavaNNS...............................................32
Figura 15. Anatomia de um robô no simulador Robocode. ...............................................................33
Figura 16. Interface do ambiente de simulação do Robocode. ..........................................................35
Figura 17. Interface do ambiente de simulação do Khepera. .............................................................36
Figura 18. Interface do ambiente de simulação do Webots 6. ...........................................................37
Figura 19. Interface do ambiente de simulação Simbad 3D. .............................................................39
Figura 20. Exemplo de uma RNA da arquitetura MLP. ....................................................................42
Figura 21. Sensores do Veículo Móvel. .............................................................................................43
Figura 22. Direções do Veículo Móvel ..............................................................................................43
Figura 23. Exemplo de dados que obedece ao conjunto de regras apresentadas ...............................48
Figura 24. Layout explicativo quanto ao funcionamento do veículo.................................................49
Figura 25. Primeira seqüência de valores para análise. .....................................................................50
Figura 26. Segunda seqüência de valores para análise. .....................................................................50
Figura 27. Terceira seqüência de valores para análise. ......................................................................51
Figura 28. Quarta seqüência de valores para análise. ........................................................................52
Figura 29. Quinta seqüência de valores para análise. ........................................................................52
Figura 30. Layout oficial do arquivo de padrões do JavaNNS e SNNS. ...........................................55
Figura 31. Layout de padrões de arquivo simples aceito pelo JavaNNS e SNNS. ............................55
Figura 32. Criando camadas para a RNA no JavaNNS. ....................................................................57
Figura 33. Caixa de dialogo para a criação das camadas. ..................................................................58
Figura 34. Criando conexões entre as camadas de neurônios. ...........................................................58
Figura 35. Caixa de definição quanto ao tipo de conexões a serem criadas. .....................................59
Figura 36. RNA criada no ambiente JavaNNS. .................................................................................59
Figura 37. Abrindo o Painel de Controle. ..........................................................................................60
Figura 38. Painel de Controle do JavaNNS. ......................................................................................61
Figura 39. RNA GSC200901-A Treinada..........................................................................................63
Figura 40. Arquivo log de Treinamento e Validação da RNA GSC200901-A. ................................63
Figura 41. Gráfico de erro (∑e2) e validação da RNA GSC200901-A. .............................................64
Figura 42. RNA GSC200901-B Treinada. .........................................................................................65
Figura 43. Arquivo log de Treinamento e Validação da RNA GSC200901-B..................................66
Figura 44. Gráfico de erro (∑e2) e validação da RNA GSC200901-B. .............................................66
Figura 45. RNA GSC200901-C Treinada. .........................................................................................67
Figura 46. Arquivo log de Treinamento e Validação da RNA GSC200901-C..................................68
x
Figura 47. Gráfico de erro (∑e2) e validação da RNA GSC200901-C. .............................................69
Figura 48. RNA GSC200901-D Treinada..........................................................................................71
Figura 49. Arquivo log de Treinamento e Validação da RNA GSC200901-D. ................................71
Figura 50. Gráfico de erro (∑e2) e validação da RNA GSC200901-D ..............................................72
Figura 51. Convertendo a Rede para a Linguagem C com o snns2c.exe...........................................72
Figura 52. Comando de utilização do snns2c.exe. .............................................................................73
Figura 53. Trecho do arquivo de rede gerado pelo JavaNNS. ...........................................................74
Figura 54. Trecho do arquivo em linguagem C gerado pelo snns2c.exe. ..........................................74
Figura 55. Comando de utilização do analyse. ..................................................................................74
Figura 56. Trecho do Arquivo de Resultados da RNA GSC200901-B. ............................................75
Figura 57. Utilização do aplicativo analyzer......................................................................................76
Figura 58. Trecho do código em linguagem C referente ao programa principal. ..............................78
Figura 59. Formato do arquivo de entrada. ........................................................................................78
Figura 60. Formato do arquivo de saída.............................................................................................78
Figura 61. Visualização das funções contidas no arquivo PRNA.DLL. ............................................81
Figura 62. Visualização das funções contidas no arquivo PDRNA.DLL. .........................................81
Figura 63. Exemplo de definição de uma interface utilizando JNA. .................................................84
Figura 64. Exemplo de chamada de interface utilizando JNA...........................................................84
Figura 65. Código do arquivo interfacePrna.java. .............................................................................84
Figura 66. Chamada detalhada da interface interfacePrna.................................................................85
Figura 67. Invocando a função rede() através da interface “neural”..................................................85
Figura 68. Mundo virtual MarlosObstaculos. ....................................................................................86
Figura 69. Mundo virtual MarlosLaberinto. ......................................................................................86
Figura 70. Robô Virtual Simulado. ....................................................................................................87
Figura 71. Importação do pacote JNA para utilização no ambiente virtual.......................................87
Figura 72. Posição Inicial do Robô. ...................................................................................................90
Figura 73. Trajetória e posição Final do Robô...................................................................................90
Figura 74. Posição Inicial do Robô. ...................................................................................................91
Figura 75. Trajetória e posição Final do Robô...................................................................................91
Figura 76. Uma visão didática do conteúdo interno de uma dll.......................................................100
Figura 77. Vários programas em execução usando a mesma dll simultaneamente. ........................101
Figura 78. Chamando uma dll escrita em C++ através de várias linguagens. .................................101
Figura 79. Chamando uma dll dinamicamente em C++. .................................................................102
Figura 80. Caixa de diálogo Other, para escolher o que se deseja criar. .........................................104
Figura 81. Janela New Dynamic-link Library. .................................................................................104
Figura 82. Código fonte gerado automaticamente para começar o desenvolvimento de uma dll....105
Figura 83. Pasta contendo todos os arquivos gerados após a compilação do projeto......................105
Figura 84. Sintaxe para declaração de funções que poderão ser exportadas para fora da dll. .........106
Figura 85. Caixa de diálogo New Project. .......................................................................................108
Figura 86. Caixa de Diálogo New DLL Project. ..............................................................................109
Figura 87. Conteúdo alterado do arquivo PDRNA.dev. ..................................................................110
Figura 88. Código contido no arquivo PDRNA.H...........................................................................110
Figura 89. Pasta contendo todos os arquivos gerados após a compilação do projeto......................111
Figura 90. Fluxo genérico de carregamento estático de uma dll......................................................112
Figura 91. Código inserido no envento OnClick do objeto Button1................................................113
Figura 92. Declaração da função a ser importada estaticamente da dll: ..........................................113
Figura 93. Posição onde deve ser inserida a instrução contida na Figura 93...................................114
Figura 94. Declaração de um ponteiro para uma função. ................................................................115
Figura 95. Declarando um ponteiro para uma função com parâmetros. ..........................................116
xi
Figura 96. Fluxo genérico de carregamento dinâmico de uma DLL................................................117
xii
LISTA DE TABELAS
Tabela 1. Principais comandos do robô. ............................................................................................34
Tabela 2. Principais eventos utilizados pelo robô..............................................................................34
Tabela 3. Principais funções utilizadas para a obtenção de informações...........................................35
Tabela 4. Principais funções disponibilizadas pelo Simbad 3D. .......................................................40
Tabela 5. Regras de decisão da Rede Neural Artificial. ....................................................................48
Tabela 6. Análise e Pontuação dos Ambientes de Criação de RNAs. ...............................................54
Tabela 7. Resultados obtidos pelo Analyzer quanto ao Treinamento da RNA. .................................76
Tabela 8. Resultados obtidos pelo Analyzer quanto a Validação da RNA. .......................................76
Tabela 9. Análise e Pontuação dos Ambientes de Virtualização de Robôs. ......................................83
Tabela 10. Comandos que devem ser inseridos na construção de funções para dll.........................106
Tabela 11. Tipos redefinidos............................................................................................................107
Tabela 12. Ponteiro para Funções. ...................................................................................................115
Tabela 13. Ponteiros para Variáveis.................................................................................................116
Tabela 14. Protótipos de Funções. ...................................................................................................116
Tabela 15. Declaração de Ponteiro para Função. .............................................................................116
Tabela 16. Sintax e Descrição da Função LoadLibrary(). ...............................................................117
Tabela 17. Sintax e Descrição da Função FreeLibrary()..................................................................118
Tabela 18. Sintax e Descrição da Função GetProcAddress()...........................................................118
xiii
RESULMO
SOUZA FILHO, Marlos Roberto de. Rede Neural Artificial para o Deslocamento de um Robô
Autônomo. Itajaí, 2009. 210 f. Trabalho de Conclusão de Curso (Graduação em Ciência da
Computação)–Centro de Ciências Tecnológicas da Terra e do Mar, Universidade do Vale do Itajaí,
Itajaí, 2009.
A crescente necessidade de desenvolvimento de mecanismos capazes de auxiliar o ser humano, e o
desejo de criar sistemas capazes de substituir o homem em tarefas consideradas inadequadas ou que
representem risco à sobrevivência do mesmo, aliadas ao crescente avanço de ciências aplicadas
como a Robótica e a Inteligência Artificial (IA), criaram um ambiente propício ao desenvolvimento
de robôs que sejam, até certo ponto, autônomos o suficiente para executarem tarefas tipicamente
humanas. O deslocamento autônomo ainda é o maior obstáculo enfrentado pela IA, todavia essa
dificuldade tem sido superada, com certo grau de sucesso, por aquela que é uma das técnicas mais
antigas de IA, as Redes Neurais Artificiais (RNA). Esse projeto teve como objetivo o
desenvolvimento de uma RNA capaz de propiciar a um robô o deslocamento necessário ao mesmo,
tornando-o capaz de se deslocar de forma autônoma através de um ambiente terrestre plano. Para tal
finalidade, foi utilizada uma RNA feedforward, treinada através do algoritmo backpropagation.
Para o desenvolvimento da RNA foram analisados e documentados seis (6) ambientes de
desenvolvimento de redes neurais, além de aplicativos utilizados para analisar arquivos de resultado
e para converter os arquivos de arquitetura de RNA para arquivos fonte em linguagem C. Após os
arquivos de arquitetura terem sido convertidos para arquivos fonte em linguagem C, esses arquivos
fontes foram utilizados para a criação de um aplicativo capaz de ler um arquivo de padrões de
entrada, analisá-los utilizando o código fonte da RNA e gerar um arquivo de padrões de saída com a
resposta da RNA. Foram ainda desenvolvidas bibliotecas de ligação dinâmicas (BLD) utilizando os
arquivos fonte da RNA, detalhes quanto às bibliotecas de ligação dinâmica, sua criação e utilização
estão documentadas em detalhes. A biblioteca JNA foi utilizada para realizar a ligação entre a
biblioteca de ligação dinâmica e o ambiente de simulação de robôs, sua utilização e funcionamento
estão documentados em detalhes. Para a simulação do robô utilizando a rede neural artificial
desenvolvida foram analisados e documentados seis (6) ambientes de simulação de robôs. Por fim,
apresentam-se os resultados obtidos, as dificuldades encontradas e sugestões para novos projetos.
Na seção de Apêndices encontram-se além de informações adicionais do projeto, dados utilizados
no treinamento e na validação da RNA, além de alguns códigos fonte completos, em linguagem C e
java.
Palavras-chave: Redes Neurais Artificiais. RNA. Robótica. Robôs. Backpropagation. Inteligência
Artificial. IA. Dynamic-link library. DLL. Biblioteca de ligação dinâmica. Java Native Access.
JNA. Simbad 3D.
xiv
ABSTRACT
Nowadays there has been an increasing necessity of developing mechanisms in order to help people
to accomplish several tasks, as well as the wish to create systems effective enough to replace people
regarding risky and harmful activities. Furthermore, applied sciences - such as Robotics an
Artificial Intelligence (AI) - have advanced in such a way that there are now the ideal conditions to
project robots which, until a certain point, would be independent enough to carry on with typical
human work. Autonomous moving is still the greatest obstacle to be overcome by AI, however this
challenge has been faced, successfully so to speak, by the AI technique is the oldest among all: the
Artificial Neural Networks (ANN). The aim of this project is develop an ANN able to give any robot
adaptative motion skills, allowing it to go anywhere, plan, in earthly environment. For this ANN
development, (6) neural networks development enviroments have been analyzed and documented,
besides applicatives commonly used to analyze result files and to convert ANN architeture files into
source files in C language. After such a conversion these source files have been used to create an
applicative able to read an entry patterns file, analyze them using the ANN source code and
generate an exit patterns file along the ANN response. Dynamic Link Libraries (DLL) have been
developed using the ANN source files. Details from the BLD – their creation and utilization have
been documented in detail. The JNA libray has been used to link the DLL and the robots simulation
enviroment, also reported in detail. For the simulation of the robot with the artificial neural
network developed, (6) robot simulations enviroments have been analyzed and documented. Finally,
the results obtained, the challenges faced and suggestions for new projetcs are presented. In the
appendix section data used in the ANN training and validation, besides additional informations of
the project and full source codes in C and Java language.
Keywords: Artificial Neural Networks. ANN. Robotics. Robots. Backpropagation. Artificial
Intelligence. Dynamic-Link Library. DLL. Java Native Access. Simbad 3D.
xv
1 INTRODUÇÃO
1.1 Inteligência e Autonomia
A evolução científica e tecnológica tem trazido inovações e descobertas cada vez mais
freqüentes e surpreendentes. No entanto, há áreas do conhecimento que sempre foram e ainda hoje
continuam sendo desafiadoras e intrigantes. É o caso da inteligência: o que a caracteriza, de que
forma e quando ela opera e como reproduzi-la artificialmente (CAZANGI, 2004)?
Considerando a possibilidade de graduar a manifestação de inteligência em vários níveis e
escalas, a natureza é fonte inesgotável de mecanismos, comportamentos e organismos que podem
ser considerados inteligentes. Dos seres extremamente simples aos mais complexos há vestígios de
inteligência, seja em indivíduos isolados ou então no comportamento coletivo de um grupo de
indivíduos. São estes aspectos que atraem a atenção de pesquisadores das mais diversas áreas, como
biologia, psicologia e engenharia da computação, na busca pela compreensão e reprodução artificial
dos sistemas biológicos que expressam algum grau de inteligência (CAZANGI, 2004).
Não é possível estudar a inteligência de forma isolada, dado que ela interligada a outras
propriedades presentes nos organismos biológicos. Uma das principais propriedades diretamente
conectadas à existência de inteligência é a autonomia. Um agente artificial não autônomo não
possui capacidade de inteligência própria. Na verdade, ele incorpora aspectos de inteligência
especificados por quem o projetou. Sistemas biológicos são em geral autônomos, isto é, suas
estruturas não são impostas por agentes externos, mais sim desenvolvidas e mantidas por eles
próprios por meio de mecanismos como auto-organização, evolução, adaptação e aprendizagem.
Considera-se, portanto, que a manifestação de algum grau de inteligência pode ser vista como um
atributo de agentes autônomos (Steels, 1995 apud CAZANGI, 2004).
Dizer que um agente é autônomo implica em afirmar que ele, além de agir por si só,
consegue se auto-regular gerando as próprias regras que regem sua atuação. Esta definição distingue
autônomo de automático. Ser automático é ser capaz de atuar em um ambiente: percebê-lo e
impactá-lo visando o cumprimento de tarefas definidas. Um agente autônomo é antes de tudo
automático, mas vai além disso: ele deve se autodirigir com base na sua capacidade própria de
aprender e adaptar seus comportamentos. Além disso, os processos de aprendizagem e adaptação
devem ocorrer enquanto o agente está operando no ambiente, e não fora dele (por exemplo, em fase
de projeto) (CAZANGI, 2004).
Da mesma maneira adotada para o conceito de inteligência, é possível considerar a
existência de níveis de autonomia, até pelo fato de não existir um ser totalmente autônomo. Os
animais em geral, e o ser humano, em particular, dependem de fatores externos para sobreviverem.
Estes organismos dependem do ambiente em que vivem para obter alimento e oxigênio, por
exemplo. Logo, quando se afirma que um agente é autônomo, deve-se ter em mente que ele detém
certo nível de autonomia, e não que ele é completamente autônomo. Desta forma, é possível
comparar agentes em termos de autonomia, sendo que quanto mais autônomo for o agente, menos
auxílio externo ele necessita (CAZANGI, 2004).
Pfeifer & Sheier (1999 apud CAZANGI, 2004) afirmam que agentes autônomos artificiais
são ideais para se estudar os princípios da inteligência. Segundo eles, uma das motivações para o
emprego desses agentes envolve a idéia de emergência. Agentes autônomos apresentam
comportamentos chamados emergentes, ou seja, comportamentos que surgem pela interação do
agente com o ambiente sem que tenham sido programados a priori pelo projetista. Por exemplo,
processos de navegação autônoma envolvendo múltiplos robôs podem promover a emergência de
comportamentos organizados que não são expressos por nenhum destes robôs quando isolados dos
demais (CRESTANI, 2001 apud CAZANGI, 2004).
1.2 Navegação Autônoma de Robôs e Aprendizagem
A pesquisa de sistemas inteligentes por intermédio de agentes autônomos é classificada
como uma metodologia sintética, cuja idéia se resume em “construir para entender”. A abordagem
sintética consiste em criar sistemas artificiais que reproduzam aspectos dos sistemas naturais, de
modo a entender seus mecanismos internos e assim descobrir como e por que certos eventos
ocorrem. O outro paradigma de abordagem, conhecido como analítico, prega a realização de
experimentos em um sistema já existente (um ser humano, ou uma colônia de formigas, por
exemplo) para então analisar os resultados visando desenvolver um modelo que seja capaz de
prever os efeitos de experimentos futuros (PFEIFER & SHEIER, 1999 apud CAZANGI, 2004).
Um dos problemas de engenharia mais complexos, desafiadores e propícios à pesquisa de
sistemas autônomos inteligentes é a navegação autônoma de robôs. O problema consiste,
basicamente, em desenvolver mecanismos de tomada de decisão para um ou mais robôs móveis,
dispostos em um ambiente arbitrário junto ao qual devem atuar de forma autônoma, visando
cumprir certas tarefas. Muito embora a navegação de robôs possa ser descrita com base nesta breve
definição, existem muitos aspectos de projeto envolvidos: configurações do ambiente, modelo do
2
robô, elenco de tarefas e critérios de desempenho. Sendo assim, o desenvolvimento de critérios de
navegação autônomos envolve desafios extremamente complexos para o trabalho do projeto
(FIGUEIREDO, 1999 apud CAZANGI, 2004).
Devido à grande variedade de situações com que o robô pode se defrontar ao longo da
navegação, sendo algumas inéditas e não previsíveis (sobretudo em ambientes desconhecidos), o
desempenho de um sistema de navegação depende de sua capacidade de aprendizagem e adaptação.
Ou seja, somente aprimorando sai estratégia de navegação, por meio da incorporação de
conhecimento (adquirido por experimentação) e ajuste de parâmetros, um sistema de navegação
torna-se apto a guiar eficientemente o robô visando maximizar o atendimento dos objetivos de
navegação. Justamente devido à importância da aprendizagem, intensos esforços de pesquisa têm
sido dedicados ao aperfeiçoamento desta potencialidade em sistemas de navegação (FIGUEIREDO,
1999 apud CAZANGI, 2004). Já no tocante aos mecanismos de adaptação (ajuste de parâmetros),
mecanismos sofisticados e eficientes derivados da teoria de controle automático (KUO, 1991 apud
CAZANGI, 2004) podem ser prontamente empregados.
Um robô controlado por um sistema que possua capacidade de aprendizagem vai vivenciar
suas próprias experiências, adquirindo conhecimento ao longo do tempo e por meios próprios, não
pela imposição de um agente externo. Fica evidente, portanto, que um robô com capacidade de
aprendizado é potencialmente mais autônomo que outro incapaz de aprender. Um benefício da
aprendizagem pode ser observado na seguinte situação: supondo que o agente encontre as mesmas
circunstâncias pelas quais já passou antes, depois de uma fase de aprendizado ter ocorrido, seu
sistema pode reagir de forma diferente da anterior e, possivelmente, com melhores resultados. Fica
explícita então a relevância dos mecanismos de aprendizagem na construção de sistemas autônomos
inteligentes (CAZANGI, 2004).
Nolfi & Floreano (2000 apud CAZANGI, 2004)explicam que a aprendizagem de robôs
baseia-se na idéia de que um sistema de controle pode se tornar apto a atuar eficientemente diante
de novas situações, sustentando-se na sua capacidade de generalizar conhecimentos adquiridos
anteriormente, mesmo que estes sejam diversos e incompletos. Entretanto, generalização não e a
única propriedade de um sistema com aprendizagem, existem outras propriedades importantes.
Alguns atributos básicos relacionados a abordagens que contemplam aprendizagem são descritos a
seguir (PFEIFER & SHEIER, 1999 apud CAZANGI, 2004):
·
O sistema deve ser robusto em relação a ruídos;
3
·
Os mecanismos devem convergir rapidamente e têm que permitir a aprendizagem
durante a operação do sistema (on-line);
·
A aprendizagem deve ser incremental e continuada;
·
O processo de aprendizagem precisa ser computacionalmente tratável, isto é, deve
possibilitar sua execução em tempo real; e
·
O aprendizado deve depender apenas de informações obtidas pelo próprio robô, por
meio de sua capacidade sensorial.
1.3 Abordagens para Sistemas Autônomos Inteligentes
A pesquisa em torno do desenvolvimento de sistemas autônomos inteligentes é intensa e
apresenta diversas abordagens. Algumas abordagens promissoras envolvem: sistemas dinâmicos,
economia comportamental e esquemas. Entretanto, a abordagem mais consolidada e amplamente
utilizada, particularmente em sistemas de navegação autônomos (como são denotados os sistemas
autônomos inteligentes dedicados ao problema de navegação de robôs) é a Inteligência Artificial
(CAZANGI, 2004).
A Inteligência Artificial pode ser dividida em duas partes: a IA clássica (tradicional) e a
inteligência computacional. A IA clássica reúne técnicas baseadas em lógica proposicional e na
manipulação algorítmica de estruturas simbólicas. Já a inteligência computacional, a qual engloba
redes neurais artificiais, computação evolutiva, sistemas nebulosos e, mais recentemente, outros
mecanismos de computação bio-inspirada, se caracteriza pela síntese de estruturas flexíveis para
armazenagem e fluxo de informação, podendo apresentar processamento distribuído, controle
descentralizado, auto-organização, não-linearidade, além de recorrer a uma grande variedade de
mecanismos de inferência e buscas em espaços de atributos (DE CASTRO & YON ZUBEN, 2004
apud CAZANGI, 2004).
Existe um consenso em grande parte da comunidade de pesquisa em sistemas inteligentes de
que as técnicas clássicas de IA falham em alguns aspectos relativos à aprendizagem e interação com
o ambiente. A maioria desses aspectos tem sido bastante discutida na literatura (CAZANGI, 2004).
Note que, neste projeto, quando se fala em sistemas de IA clássica , refere-se a sistemas
puramente simbólicos. A principal razão para o problema encontrado na IA clássica é que os
4
sistemas nem sempre levam suficientemente em consideração as características do mundo real.
Muitos trabalhos de IA clássica têm sido dedicados a espaços abstratos, virtuais, cujos espaços e
variações são precisamente definidos, o que, em geral, ocorre raramente no mundo real. Outras
deficiências estão relacionadas à organização hierárquica, processamento centralizado e
direcionamento a tarefas bastante específicas (PFEIFER & SHEIER apud CAZANGI, 2004).
Steells (1995 apud CAZANGI, 2004) vai ainda mais longe,
afirmando que sistemas
construídos com base na IA clássica não são autônomos, embora sejam automáticos. A afirmação se
justifica pelo fato do conhecimento presente neste sistema
ser geralmente fornecido por
especialistas e embutido de forma explícita. Neste sentido, o sistema não tem seus próprios
objetivos e motivações, tem apenas os de seus criadores (CAZANGI, 2004).
Todos estes aspectos conceituais da IA clássica se refletem na ausência ou deficiência da
capacidade de aprendizagem pelos sistemas que a utilizam, o que, conseqüentemente, implica em
uma redução drástica de sua autonomia. Por isso, críticas têm sido feitas a propostas de sistemas de
navegação incapazes de aprender suas estratégias a partir da interação com o ambiente, visto que
seus desempenhos estão limitados ao conhecimento neles implantado a priori. Supondo que o robô
se depare com situações que não estejam previstas pelo sistema de navegação implementado, é
provável que seu desempenho sofra degradações significativas e recorrentes frente à repetição do
mesmo cenário. Apesar dos problemas, vale ressaltar que existem muitas aplicações bem sucedidas
das técnicas de IA em outros tipos de problemas. (CAZANGI, 2004).
Propostas de sistema de navegação baseadas em técnicas de inteligência computacional têm
apresentado resultados promissores, sobretudo devido a elas possuírem características essenciais à
concepção de sistemas autônomos inteligentes. Estas técnicas contemplam as seguintes
propriedades:
·
O emprego de mecanismos de aprendizado na aquisição de conhecimento e
adaptação de comportamento a partir da interação com o ambiente;
·
A capacidade de encontrar soluções factíveis, que atendam simultaneamente a
múltiplos objetivos, possivelmente conflitantes, utilizando o conhecimento
adquirido; e
5
·
A habilidade para operar em condições adversas, tais como: ausência de um conjunto
de informações completo para um planejamento prévio de seu comportamento,
imprevisibilidade na interação com seu ambiente (suposto ser de topologia
desconhecida) e ruído nos sensores e atuadores (CRESTANI, 2001 apud CAZANGI,
2004).
Dentre as técnicas de inteligência computacional, as redes neurais artificiais, cuja inspiração
vem do sistema nervoso dos organismos superiores, especificamente do cérebro dos mamíferos, têm
um papel muito relevante junto a sistemas de navegação autônomos. As redes neurais artificiais se
mostram muito eficazes na síntese de arquitetura de controle em navegação de robôs, por
apresentarem um grande poder de representação de conhecimento e por serem excelentes modelos
de aprendizagem e generalização. A seguir, são descritos alguns sistemas de navegação autônomos
(SNAs) fundamentados em redes neurais artificiais. Figueiredo (1997 apud CAZANGI, 2004)
apresenta uma proposta inovadora e eficaz com base em técnicas avançadas de redes neurais
artificiais e sistemas nebulosos, capazes de realizar processamento híbrido, com etapas de natureza
numérica e simbólica. A arquitetura do sistema é hierárquica e dividida em três módulos principais:
dois devotados a tomada de decisão e um terceiro a coordenação. Em Crestani (2001 apud
CAZANGI, 2004), procedi-se à extensão do trabalho de Figueiredo (1997 apud CAZANGI, 2004),
mantendo a arquitetura básica e incluindo extensões como novas formas de operação interna dos
módulos da rede, etapas mais elaboradas de coordenação e aprendizado, além de controle de
velocidade. Mais recentemente, Haydu (2003 apud CAZANGI, 2004) implementa um SNA baseado
em uma rede neural multicamadas, com diferentes tipos de conexões sinápticas e que realiza
aprendizagem por reforço (CAZANGI, 2004).
Outra ferramenta de inteligência computacional são os sistemas imunológicos artificiais. A
idéia é ter uma rede de anticorpos que reage à presença de antígenos, modificando a configuração
da rede e tomando ações. Suas maiores virtudes são a capacidade de auto-organização e operação
distribuída, conferindo requisitos fundamentais para a síntese de processos cognitivos baseados em
comportamento dinâmico. Watanabe et al. (1999 apud CAZANGI, 2004) investiga um SNA
baseado nesta técnica, em que os anticorpos realizam reconhecimento de padrões e estão associados
a comportamentos básicos do robô e os antígenos carregam os estímulos capturados pelos sensores.
Aperfeiçoamentos do SNA de Watanabe el al. (1999 apud CAZANGI, 2004) são propostos em
Michelan (2003 apud CAZANGI, 2004), incluindo a aplicação de um mecanismo evolutivo para
determinação das conexões da rede imunológica (CAZANGI, 2004).
6
De fato, as técnicas de computação evolutiva merecem um grande destaque em navegação
autônoma, sendo a principal delas os algoritmos genéticos. Estas técnicas se inspiram basicamente
na teoria da evolução das espécies e comungam uma estrutura básica: realizam reprodução, impões
variações aleatórias, promovem competição e executam seleção de indivíduos de uma dada
população. Suas principais características são: grande robustez, diversidade e capacidade de busca
associada ao atendimento de objetivos específicos (CAZANGI, 2004).
A grande eficiência dos métodos evolutivos viabiliza seu emprego na proposição estrutural
de modelos, e não apenas em seu ajuste paramétrico, no desenvolvimento integral de sistemas de
controle e na concepção e operação de robôs autônomos. Esta última utilização, conhecida como
Robótica Evolucionária (NOLFI & FLOREANO, 2000 apud CAZANGI, 2004), é bastante
ambiciosa, embora não esteja ainda totalmente consolidada. Ela propõe que todos os módulos do
robô, desde seu sistema de controle até sua carcaça, sejam obtidos por métodos evolutivos
(CAZANGI, 2004).
Um quesito muito forte em prol dos sistemas evolutivos se refere à autonomia. Ao se
construir um sistema autônomo, seja robótico ou computacional, normalmente designa-se esta
atividade a engenheiros. Porém, a própria evolução pode assumir o papel de projetista do sistema
(DAWKINS, 1998 apud CAZANGI, 2004), de forma eficiente. Além disso, agentes que possuam
características evolutivas podem, em princípio, ter seu nível de autonomia bastante incrementado. A
evolução torna o agente mais independente de seu projetista e, portanto, propicia a ele potencial
para ser mais autônomo que agentes cujos sistemas de controle não contemplam o evolucionismo
(PFEIFER & SHEIER, 1999 apud CAZANGI, 2004).
1.4 Problematização
1.4.1 Formulação do Problema
O desenvolvimento de sistemas de controle para robôs móveis autônomos tem se mostrado
um grande desafio para a Inteligência Artificial. Diferentes abordagens para o projeto de sistema de
controle para robôs móveis autônomos vêm sendo utilizadas em diversas áreas de pesquisa. Por
muitos anos os pesquisadores de Inteligência Artificial têm construído sistemas de controle que
apresentam um comportamento inteligente, mas normalmente não no mundo real e somente em
ambientes controlados. Alguns pesquisadores desenvolveram certos sistemas de controle para serem
7
utilizados no mundo real, mas geralmente estes sistemas são limitados e não apresentam um
comportamento autônomo ou inteligente (HEINEN, 2002).
A utilização de robôs móveis está diretamente associada ao grau de autonomia que os
mesmos apresentam, desta forma quanto maior a autonomia de um robô, maiores serão as
possibilidades de utilização deste na realização de diversos objetivos, ainda assim, resolver o
problema de deslocamento evitando obstáculos ainda é uma área de intensa pesquisa.
Várias técnicas são utilizadas com o intuito de resolver o problema, algumas mais
promissoras que outras, mas ainda nenhum robô completamente autônomo (capaz de se deslocar
sem a intervenção humana) foi criado.
1.4.2 Solução Proposta
Este Trabalho de Conclusão de Curso (TCC) propõe-se a modelar e implementar uma
solução em software capaz de auxiliar um veículo móvel a se deslocar em um ambiente plano de
forma autônoma, através da utilização da técnica de Inteligência Artificial denominada Redes
Neurais Artificiais (RNA).
1.5 Objetivos
1.5.1 Objetivo Geral
O objetivo geral deste projeto é desenvolver uma rede neural artificial para controlar o
deslocamento de um robô autônomo sobre uma superfície plana.
1.5.2 Objetivos Específicos
Os objetivos específicos deste projeto de pesquisa são:
·
Pesquisar e analisar as técnicas de aprendizado de redes neurais disponíveis;
·
Pesquisar e analisar os mecanismos de hardware disponíveis;
·
Pesquisar e analisar soluções similares;
·
Determinar os requisitos de software e hardware do sistema;
·
Compreender a metodologia de desenvolvimento de RNAs;
8
·
Compreender a metodologia de desenvolvimento de robôs inteligentes;
·
Realizar a modelagem conceitual do sistema;
·
Realizar a modelagem da RNA;
·
Programar o sistema de RNA;
·
Treinar o sistema RNA;
·
Testar a utilidade/funcionamento do sistema RNA;
·
Validar o funcionamento do sistema RNA; e
·
Documentar o desenvolvimento e os resultados do sistema RNA.
1.6 Metodologia
Para a Fundamentação Teórica, pesquisas foram realizadas para compreender os princípios e
metodologias envolvidas no método de Inteligência Artificial denominado Redes Neurais
Artificiais, compreender os diversos tipos de RNAs existentes, suas características e métodos de
aprendizado. Foram pesquisadas ferramentas de simulação de ambientes para o treinamento de
robôs, suas características e seu nível de complexidade.
Também foram realizadas pesquisas referentes à robótica, mapeamento de ambientes e
projetos similares ao proposto, essas pesquisas foram realizadas através de livros, artigos
científicos, sites de instituições de pesquisa e de órgãos governamentais, alem de trabalhos
acadêmicos e documentários científicos. As características identificadas nas metodologias e
ferramentas foram analisadas para serem consideradas no desenvolvimento do projeto. Essa
pesquisa serviu ainda para refinar o projeto proposto tornando-o mais eficiente.
Procurou-se apresentar o que deve ser realizado de forma clara e objetiva em cada uma das
etapas. O desenvolvimento do projeto foi iniciado com uma análise de todos os requisitos que o
sistema deveria atender, alguns requisitos foram acrescentados após ser constatado sua ausência nos
projetos similares encontrados.
Depois de modelada, a RNA foi treinada e validade em um ambiente virtual, o qual simulará
o ambiente externo no qual o protótipo virtual deverá se deslocar.
9
1.7 Estrutura do trabalho
Este trabalho esta estruturado em quatro capítulos. O Capitulo 1, Introdução, apresentou
uma visão inicial sobre o tema abordado, a formulação do problema e a proposta para a solução do
mesmo.
No Capítulo 2, Fundamentação Teórica é apresentada um sucinto histórico sobre os robôs,
suas definições e o que se considera um robô inteligente. Apresentam-se ainda algumas definições
de Inteligência Artificial e definições importantes referentes a Redes Neurais Artificiais, como
modelo MCP, função de ativação, topologias, arquiteturas e aprendizado, alem de uma revisão
bibliográfica sobre Redes Neurais Artificiais. Finalizando esse capítulo, apresentam-se ainda
algumas ferramentas similares ao projeto aqui proposto.
No Capítulo 3, apresenta-se uma descrição do projeto proposto, sua arquitetura e modelo,
além do método de aprendizagem escolhido. Há também uma seção onde é detalhada a forma de
funcionamento da rede neural artificial, considerando seus padrões de entrada e seus respectivos
padrões de saída
No Capítulo 4 trata-se da implementação do projeto, a definição do ambiente de
manipulação da RNA, a criação dos arquivos de padrões, a criação das RNAs, sua conversão para
linguagem C, sua utilização em aplicativo e em bibliotecas de ligação dinâmica. Também é definido
o ambiente de simulação do robô virtual, sua integração com a biblioteca JNA e a construção dos
mundos virtuais.
O Capítulo 5 apresenta os resultados obtidos em cada fase do projeto, descrevendo de forma
sucinta e apresentando-os ordenadamente.
O Capítulo 6 apresenta as dificuldades encontras durante a realização deste projeto,
detalhando-as para uma melhor compreensão de sua complexidade.
O Capítulo 7 refere-se às conclusões finais quanto ao projeto em questão, considerando seus
resultados e suas dificuldades, e propõe projetos futuros baseados na experiência obtida com o
desenvolvimento deste.
Por fim, na seção de apêndices encontram informações adicionais referentes à elaboração
deste projeto.
10
2 FUNDAMENTAÇÃO TEÓRICA
2.1 Robôs
Desde tempos remotos, o homem sonha em poder criar um ser semelhante, esse desejo fica
evidente ao analisarmos os diversos exemplos de imagens humanizadas de criaturas, como as
descritas na obra de Homero, onde Hefesto, deus grego das forjas, possuía duas mulheres feitas em
ouro, capazes de realizar tarefas humanas (ASIMOV, 1994 apud VIEIRA, 1999, p. 10).
Jacques de Vaucanson, um mecânico Francês que viveu no século 18, se tornou célebre por
criar autômatos que tocavam música (GROOVER, WEISS, NAGEL et al, 1988).
A história da robótica se confunde com a história da literatura de ficção científica, de onde
inclusive se tirou seu próprio nome. Em 1921, apesar de já existirem aplicações de sistemas que
reproduziam ações de humanos, em certos aspectos menos sofisticados e extremamente
especializados se comparadas aos dias de hoje, o teatrólogo tcheco Karel Capek, na sua peça “Os
Robôs Universais de Rossum” utilizou pela primeira vez o termo robô (que em eslovaco significa
trabalhador), para identificar homens artificialmente fabricados pela sua personagem principal para
executar todas as tarefas árduas do mundo (ASIMOV, 1994; GROOVER,WEISS, NAGEL et al,
1988).
Para David Nitzan (NITZAN, 1985 apud VIEIRA, 1999, p. 10) “Um robô é uma máquina de
uso geral que, como um humano, pode executar uma variedade de diferentes tarefas sob condições
que não necessitam ser conhecidas a priori”. Gevarter ainda complementa (GEVARTER, 1984 apud
VIEIRA, 1999, p. 10) “... são máquinas flexíveis capazes de controlar suas próprias ações em uma
variedade de tarefas utilizando uma programação armazenada.”.
2.1.1 Breve histórico dos robôs móveis
Segundo a bibliografia, o primeiro robô construído e reconhecido é o Shakey, desenvolvido
pelo Stanford Research Institute, em 1968, ele possuía uma enorme variedade de sensores,
incluindo uma câmera de vídeo e sensores de toque, binários, (GROOVER; WEISS; NAGEL et al,
1988) e navegava entre as salas do laboratório, enviando sinais de rádio ao seu ‘cérebro’, um
computador DEC DP-10, que permitia efetuar algumas tarefas como empurrar caixas e evitar
obstáculos (NITZAN, 1985 apud VIEIRA, 1999). Deve-se atentar para o fato de que a unidade de
processamento embarcada no robô apenas coletava os sinais sensoriais e os enviava para um
computador remoto que executava o processamento, transmitindo ao robô o comando que geraria a
ação desejada.
Em todo o mundo foram desenvolvidos importantes trabalhos durante a década de 80. Um
dos mais importantes estudos sobre robôs móveis foi o desenvolvimento do robô Kephera, do KTeam, do Microcomputing Laboratory do Swiss Federal Institute of Technology, com o apoio de
outras entidades de pesquisa da Europa.
Com apenas 55 mm de diâmetro por 30 mm de altura, o Kephera tem a capacidade de
desviar de obstáculos e seguir ou evitar fontes luminosas, além de permitir a utilização de algumas
extensões, como um sistema de visão e um pequeno manipulador. Seu tamanho reduzido e seu
custo relativamente baixo, em comparação a outros robôs no mercado, têm feito do Kephera um
sucesso dentro das universidades, sendo objeto de pesquisa inclusive no Brasil (BOTELHO, 1996).
No entanto, uma das mais espetaculares aplicações de robôs móveis deste século é a família
Rocky, resultado das pesquisas do Jet Propulsion Laboratory do Califórnia Institute of Technology
(HAYATI, 1996; HAYATI; VOLPE; BACKES et al, 1997 apud VIEIRA, 1999). Com dimensões
comparadas a um brinquedo de rádio controle, um modelo Rocky 4, carinhosamente batizado como
Sojourner (hóspede temporário, em inglês), foi capaz de realizar uma das maiores façanhas da
pesquisa no espaço, a exploração, à distância, do planeta Marte.
Figura 1. Shakey, Kephera e Sojourmer.
A empresa LunaCorp (www.lunacorp.com), juntamente com o Robotics Institute, da
Carnegie Mellon University pretendem lançar, até a virada do século, dois veículos móveis
12
autônomos à lua. O objetivo da empresa é criar um parque temático na Terra, de onde as pessoas
poderão comandar os veículos e sentir-se virtualmente explorando o solo lunar.
Os protótipos da LunaCorp já vêm sendo testados no deserto de Atakama, no Chile, sob
supervisão do Robotics Institute, com financiamento da NASA.
2.1.2 Definições de robôs móveis
Segundo McComb, existem duas vertentes na definição de robôs móveis: a primeira afirma
ser o robô completo, auto contido, autônomo, que necessita instruções de seu mestre apenas
ocasionalmente. Já a segunda é aquela que define robô como sendo qualquer equipamento que se
mova por seus próprios meios, com o objetivo de executar tarefas próximas às humanas.
(MCCCOMB, 1987 apud VIEIRA, 1999).
2.1.3 Robôs Inteligentes
Determinados autores classificam robôs inteligentes como aqueles que são capazes de tomar
decisões em tempo real, suportadas por técnicas de inteligência artificial, baseados em sensores
(KOREN, 1985 apud VIEIRA, 1999), o que lhes possibilita trabalharem em ambientes
completamente imprevisíveis.
Ao compararmos as técnicas de controle de robôs que não fazem uso de inteligência
artificial com aquelas que utilizam os recursos proporcionados pela mesma, podem-se classificar
essas ultimas como hierarquicamente superiores as primeiras (GEVARTER, 1984 apud VIEIRA,
1999). No caso de aplicação em máquinas autônomas, o emprego de inteligência artificial em robôs
não os tornará apenas mais flexíveis nas linhas de montagem, mas também os tornaram cada vez
mais aptos a executarem atividades fora do ambiente industrial (GERVARTER, 1984 apud
VIEIRA, 1999) mais próxima das humanas, no conceito de Schalkoff (SCHALKOFF, 1990 apud
VIEIRA, 1999).
2.2 Inteligência Artificial
Para Oswaldo Ludwig Jr e Eduard Montgomery (LUDWIG, MONTGOMERY, 2007), para
uma máquina ser considerada inteligente, deve apresentar as seguintes habilidades:
·
Capacidade de realizar inferência e resolver problemas;
13
·
Capacidade de planejamento;
·
Capacidade de acumular e manipular conhecimento;
·
Compreensão de linguagem natural;
·
Capacidade de aprender com ou sem supervisão; e
·
Capacidade de interpretar estímulos sensoriais.
Arnold e Bowie (1986 apud MIOTTO, 2006), definem Inteligência Artificial (IA) como a
parte da Ciência da Computação concernente ao projeto de sistemas computacionais que exibem
inteligência humana: aprender novas informações, entender linguagens, raciocinar e resolver
problemas.
Segundo Feigenbaum (1992 apud FERNANDES, 2003), a Inteligência Artificial (IA) é a
parte da Ciência da Computação voltada para o desenvolvimento de sistemas de computadores
inteligentes, isto é, sistemas que exibem características, as quais se associam com a inteligência no
comportamento humano, por exemplo: compreensão da linguagem, aprendizado, raciocínio,
resolução de problemas, etc.
2.3 Redes Neurais Artificiais
Segundo Fernandes (2003), é possível se chegar a diversas definições do que seja uma Rede
Neural Artificial, contudo, as três palavras “chaves”: neurônio, arquitetura e aprendizado, requerem
um entendimento, à priori, em qualquer definição de Rede Neural Artificial. Ainda segundo
Fernandes (2003), o neurônio é a unidade computacional básica da rede em questão; a arquitetura é
a estrutura topológica de como os neurônios são conectados; e a aprendizagem é um processo que
adapta a rede de modo a computar uma função desejada ou realizar uma tarefa.
Para Loesch (1996 apud FERNANDES, 2003), Redes Neurais Artificiais são sistemas
computacionais, de implementação em hardware e software, que imitam as “habilidades
computacionais” do sistema nervoso biológico, utilizando para isso um grande número de simples
neurônios artificiais interconectados.
Lippmann (1997 apud FERNANDES, 2003) afirma que as Redes Neurais Artificiais são
sistemas físicos que podem adquirir, armazenar e utilizar conhecimentos experimentais, que podem
14
alcançar uma boa performance, devido a sua densa interconexão entre os nós da rede, Elas também
são conhecidas por: modelos conexionistas, modelos de processamentos paralelo distribuído e
sistemas neuromorfológicos.
No entanto, Haykin (HAYKIN, 2001), adapta a definição de rede neural de Aleksander e
Morton (1990 apud HAYKIN, 2001. p. 28), na qual afirma:
Uma rede neural é um processador maciçamente paralelamente distribuído
constituído de unidades de processamento simples, que tem a propensão natural
para armazenar conhecimento experimental e torná-lo disponível para uso. Ela se
assemelha ao cérebro em dois aspectos:
1.
O conhecimento é adquirido pela rede a partir de seu ambiente através de
um processo de aprendizado.
2.
Forças de conexão entre neurônios, conhecidas como pesos sinápticos, são
utilizados para armazenar o conhecimento adquirido.
2.3.1 Neurônios Artificiais: Modelo MCP
O modelo de McCulloch e Pitts (MCCULLOCH; PITTS, 1943 apud BRAGA;
CARVALHO; LUDERMIR, 2007) é uma simplificação do que se sabia na época, a respeito do
neurônio biológico. Sua representação matemática resultou em um modelo com n terminais de
entrada (dendritos) que recebem os valores x1, x2..., xn (que representam as ativações dos neurônios
anteriores) e apenas um terminal de saída y (representando o axônio).
Para representar o comportamento das sinapses, os terminais de entrada do neurônio têm
pesos acoplados w1, w2,..., wn, cujos valores podem ser positivos ou negativos, dependendo de as
sinapses correspondentes serem inibitórias ou excitatórias. O efeito de uma sinapse particular i no
neurônio pós-sináptico é dado por xiwi. Os pesos determinam “em que grau” o neurônio deve
considerar sinais de disparo que ocorram naquela conexão. (BRAGA; CARVALHO; LUDERMIR,
2007).
Uma descrição do modelo está ilustrada na Figura 2, no qual ∑ representa a soma ponderada
das entradas e f(.) a função de ativação.
15
Figura 2. Neurônio de McCulloch e Pitts.
Fonte: Braga, Carvalho e Ludermir, 2007
2.3.2 Função de Ativação
A função de ativação é responsável por gerar a saída y do neurônio a partir dos valores dos
vetores de peso w = (w1, w2,... wn)T e de entradas x = (x1, x2,... Xn)T. Dependendo do tipo de
problema a ser abordado, neurônios com funções de ativação lineares, podem também ser
utilizados, já as Redes Neurais Artificiais do tipo RBF (Radial Basics Functions) utilizam neurônios
com funções de ativação radiais. (BRAGA; CARVALHO; LUDERMIR, 2007)
2.3.3 Topologias de Redes Neurais Artificiais
Segundo Rummelhart (1986 apud FERNANDES, 2003), uma Rede Neural Artificial deve
possuir no mínimo duas camadas: a camada de entrada e a camada de saída dos resultados. Com
duas camadas, somente, a rede apresenta um desempenho muito limitado, a adição de uma camada
intermediária faz-se necessária. Neste tipo de configuração, cada neurônio está ligado com todos os
outros das camadas vizinhas, mas neurônios da mesma camada não se comunicam, além da
comunicação ser unidirecional, apresentando, assim, um comportamento estático.
A Rede Neural Artificial de Hopfield (1982 apud FERNANDES, 2003), apresenta
comportamento dinâmico e fluxo de dados multidirecional, devido à integração total dos neurônios,
desaparecendo assim, a idéia de camadas bem distintas. Com isso, seu funcionamento é mais
complexo, havendo certas complicações, seja na fase de aprendizado quanto na fase de testes, seu
uso é direcionado a problemas de minimização e otimização de percursos.
16
Para Hecht-Nielsen (1987 apud FERNANDES, 2003), com a presença de apenas uma
camada oculta (intermediária), já é possível calcular uma função arbitrária qualquer, a partir de
dados fornecidos.
Cybenko (1989 apud FERNANDES, 2003), afirma que é necessária a presença de duas
camadas ocultas para o cálculo das funções. Observa-se que para cada três neurônios da primeira
camada oculta é preciso um neurônio da segunda camada.
Todavia para Lippmann (1987 apud FERNANDES, 2003), a segunda camada oculta deve
ter o dobro de neurônios da camada de saída, no caso de apenas uma camada oculta, ela deverá ter
s(i+1) neurônios, onde s é o número de neurônios de saída e i é o número de neurônios de entrada.
2.3.4 Principais Arquiteturas de Redes Neurais Artificiais
Independente da função de ativação escolhida, neurônios individuais possuem capacidade
computacional limitada. No entanto, um conjunto de neurônios conectados na forma de uma rede
(neural) é capaz de resolver problemas de complexidade elevada.
A estrutura mais simples é apresentada na Figura 3, que corresponde a uma RNA de camada
única alimentada para frente (feedfoward). Estruturas como essas são capazes de resolver problemas
multivariáveis de múltiplas funções acopladas, mas com algumas restrições de complexidade, por
serem de uma única camada. A estrutura apresentada na Figura 4 é semelhante a da Figura 3, com a
diferença de que possui uma camada adicional. A camada intermediaria confere a RNA uma maior
capacidade computacional e universalidade na aproximação de funções contínuas.
As redes neurais artificiais apresentadas nas Figuras 3 e 4 são consideradas estáticas, já que
não possuem recorrência em sua estrutura: as suas saídas em um determinado instante dependem
apenas de suas entradas atuais. Já as estruturas das Figuras 5 e 6 possuem conexões recorrentes
entre neurônios de um mesmo nível ou entre neurônios de saída e de camada anteriores.
No exemplo da Figura 5, a saída depende não somente das entradas, mas também de seu
valor atual. Essa estrutura de rede neural artificial é utilizada na resolução de problemas que
envolvam processamento temporal, como em previsão de eventos futuros. Já a estrutura da Figura 6
possui um único nível de neurônios, em que a saída de cada um deles está conectada as entradas de
todos os outros. A rede não possui entradas externas, e sua operação se dá em função da dinâmica
de mudança de estados dos neurônios, Que operam de forma auto-associativa.
17
Figura 3. Feedforward de uma camada.
Figura 4. Feedforward de duas camadas.
Fonte: Braga, Carvalho e Ludermir, 2007
Fonte: Braga, Carvalho e Ludermir, 2007
Figura 5. Recorrência entre saída e intermediária.
Figura 6. Recorrência auto-associativa.
Fonte: Braga, Carvalho e Ludermir, 2007
Fonte: Braga, Carvalho e Ludermir, 2007
A definição da estrutura de uma rede neural artificial para a solução de um determinado
problema depende de vários fatores, entre eles:
·
Complexidade do problema;
·
Dimensionalidade do espaço de entrada;
·
Características dinâmicas ou estáticas;
18
·
Conhecimento à priori sobre o problema; e
·
Representatividade dos dados.
As redes neurais artificiais podem ser distinguidas com base na direção na qual o sinal flui,
basicamente, há dois tipos de redes neurais artificiais: feedforward e feedback. Nas redes neurais
feedforward, os sinais se propagam em apenas uma direção a partir do sinal de entrada, passando
pela camada intermediária até a saída. Nas redes neurais feedback, os sinais de entrada podem
propagar da saída de qualquer neurônio para a entrada em outro neurônio (FERNANDES, 2003).
Para Anderson (1972 apud FERNANDES, 2003), os neurônios são ligados por conexões,
cada um com um peso (w) associado, que corresponde à influência do neurônio no processamento
do sinal de saída.
2.3.5 Aprendizado
A propriedade mais importante das redes neurais artificiais é a habilidade de “aprender de
seu ambiente” e, com isso, melhorar seu desempenho (FERNANDES, 2003).
Segundo Ackley (1985 apud FERNANDES, 2003), a habilidade de aprender ocorre através
de um processo interativo de ajustes aplicados a seus pesos, o treinamento. O aprendizado ocorre
quando a rede neural atinge uma solução generalizada para uma classe de problemas.
Para Haykin (2001), as redes neurais artificiais podem ser classificadas de acordo com o seu
tipo de aprendizagem:
·
Não supervisionada - a rede aprende a classificar a entrada em conjuntos, sem que
haja monitoramento; e
·
Supervisionada - a rede ajusta os pesos com base na diferença dos valores entre as
unidades de saída e os valores desejados.
Para Gurney (1985 apud FERNANDES, 2003), uma rede neural artificial não executa uma
serie de instruções, ela responde em paralelo às entradas apresentadas. O resultado não é
armazenado em um local especifico da memória, mas consiste de todos os estados da rede, após
encontrar uma condição de equilíbrio.
19
Na abordagem conexionista o conhecimento não é adquirido através de regras explícitas,
como na Inteligência Artificial simbólica, mas através dos ajustes das intensidades das conexões
entre os neurônios. A etapa de aprendizado de uma rede neural artificial consiste em um processo
iterativo de ajuste de parâmetros da rede, os pesos das conexões, que guardam, ao final do processo,
o conhecimento que a rede adquiriu do ambiente externo (BRAGA; CARVALHO; LUDERMIR,
2007). Segundo Mendel e McLaren (1970 apud BRAGA; CARVALHO; LUDERMIR, 2007), uma
definição geral do que vem a ser aprendizado pode ser expressa da seguinte forma:
“Aprendizado é o processo pelo qual os parâmetros livres de uma rede neural são ajustados
por meio de uma forma continuada de estímulo pelo ambiente externo, sendo o tipo específico de
aprendizado definido pela maneira particular como ocorrem os ajustes dos parâmetros livres”.
É importante ressaltar que o conceito de aprendizado está relacionado com a melhoria do
desempenho da rede segundo algum critério preestabelecido. O erro quadrático médio da resposta
da rede em relação ao conjunto de dados fornecidos pelo ambiente, por exemplo, é utilizado como
critério de desempenho pelos algoritmos de correção de erros. Assim, quando estes algoritmos são
utilizados no treinamento de redes neurais artificiais, espera-se que o erro diminua à medida que o
aprendizado prossiga (BRAGA; CARVALHO; LUDERMIR, 2007)
2.3.5.1
Aprendizado Supervisionado
Aprendizagem supervisionada implica, necessariamente, a existência de um supervisor, ou
professor externo, o qual é responsável por estimular as entradas da rede por meio de padrões de
entrada e observar a saída calculada pela mesma, comparando-a com a saída desejada, (BRAGA;
CARVALHO; LUDERMIR, 2007) conforme Figura 7.
Figura 7. Aprendizado supervisionado
Fonte: Braga, Carvalho e Ludermir, 2007
20
2.3.5.2
Aprendizado Não-supervisionado
No aprendizado não-supervisionado, como o próprio nome sugere, não há um professor ou
supervisor externo para acompanhar o processo de aprendizado. Neste esquema de treinamento
somente os padrões de entrada estão disponíveis para a rede, ao contrário do aprendizado
supervisionado, cujo conjunto de treinamento possui pares de entrada e saída. Durante o processo
de aprendizado os padrões de entrada são apresentados continuamente a rede, e a existência de
regularidades nesses dados fazem com que o aprendizado seja possível. Regularidade e redundância
nas entradas são características essenciais para haver aprendizado não-supervisionado.
Um esquema genérico do aprendizado não-supervisionado é apresentado na Figura 8.
Figura 8. Aprendizado não-supervisionado
Fonte: Braga, Carvalho e Ludermir, 2007
2.3.5.3
O Algoritmo Backpropagation
O método backpropagation ( BEALE, 1994 apud REIS; ALBUQUERQUE; CASTRO,
2001), utilizado neste trabalho, pode ser usado para várias aplicações de redes neurais. Ele é um
método de treinamento do tipo supervisionado, onde o padrão de entrada é apresentado à rede
juntamente com a sua saída desejada. O objetivo é treinar a rede e atingir um meio-termo entre a
habilidade de responder corretamente aos padrões de entrada que são usados para o treinamento
(memorização) e a habilidade de fornecer uma resposta coerente a uma entrada que é similar, mas
não idêntica, àquelas utilizadas no treinamento. O método backpropagation envolve 3 estágios: a
propagação dos padrões de entrada, a retropropagação do erro associado e o ajuste de pesos.
O desenvolvimento do algoritmo de aprendizagem backpropagation foi um dos mais
importantes avanços da área de redes neurais nos últimos tempos. Neste algoritmo, usamos a função
sigmóide como função de ativação:
F(x) = 1/1 + e – (x - θ) sendo θ (Teta) o theshold.
21
Uma das razões de se usar a função sigmóide como função de ativação é que ela fornece
uma informação mais precisa quando o threshold e a soma dos pesos têm valores parecidos. Ou
seja, o valor de saída de um neurônio não é simplesmente 1 ou 0, mas varia no intervalo de 0 a 1.
Esta informação é importante para o ajuste de pesos.
Os estágios do algoritmo são os seguintes (BEALE, 1994 apud REIS; ALBUQUERQUE;
CASTRO, 2001):
1. Inicializar os pesos e os thresholds com valores randômicos pequenos;
2. Apresentar as entradas Xp = x0, x1,x2, xn-1 e a saída desejada Tp = t0, t1,t2, tm-1, onde n
é o número de nós de entrada e m é o número de nós de saída. Atribua a w0 o valor -θ
e a x0 o valor 1. Para a associação do padrão, Xp e Tp representam os padrões a serem
associados. Para a classificação, Tp é definido como 0, exceto para um dos nós,
definido como 1 que corresponde a classe que Xp pertence;
3. Calcular a saída atual. Para cada camada, calcule yp = f [∑wjxi], e passe este
resultado para a próxima camada. A camada final fornece a saída opj;
4. Adaptar os pesos. Começando pela camada de saída e trabalhando de trás para frente.
wij(t+1) = wij(t) + ηδpjopj,
onde wij representa o peso do nó i para o nó j no instante t, η (Eta) é a taxa de
aprendizagem e δpj é um termo de erro para o padrão p no nó j.
Para neurônios de saída,
δij = kopj (1 - opj)(tpj - opj),
e para neurônios intermediários,
δpj = kopj(1 – opj)∑kδpkwjk
onde a soma é sobre os k nós na camada acima do nó j.
5. Repetir os passos 2 a 4 até a rede convergir, ou seja, até que o erro decline a um nível
aceitável (Previsão do preço da soja utilizando redes neurais, 1999).
22
Durante o treinamento com o algoritmo backpropagation, a rede opera em uma seqüência de
dois passos, como mostra a Figura 9. Primeiro, um padrão é apresentado à camada de entrada da
rede. A atividade resultante flui através da rede, camada por camada, até que a resposta seja
produzida pela camada de saída. No segundo passo, a saída obtida é comparada à saída desejada
para esse padrão particular. Se estas não forem iguais, o erro é calculado. O erro é retropropagado
da camada de saída até a camada de entrada. Os pesos das conexões das unidades da camada de
saída e das camadas intermediárias vão sendo modificados conforme o erro é retropropagado.
Figura 9. Esquema de funcionamento do Algoritmo Backpropagation.
Fonte: (REIS; ALBUQUERQUE; CASTRO, 2001)
As redes que utilizam backpropagation trabalham com uma variação da regra delta,
apropriada para redes com múltiplas camadas: a regra delta generalizada. A regra delta padrão
essencialmente implementa um gradiente descendente no quadrado da soma do erro para funções de
ativação lineares.
Entretanto, a superfície do erro pode não ser tão simples, como a ilustrada na Figura 10, e
suas derivadas mais difíceis de serem calculadas. Nestes casos, devem ser utilizadas redes com
camadas intermediárias. Ainda assim, as redes ficam sujeitas aos problemas de procedimentos hillclimbing, ou seja, ao problema de mínimos locais. A figura também ilustra o processo de redução
dos erros utilizando o backpropagation.
23
O erro cometido pela rede vai sendo progressivamente diminuído, podendo chegar ao
mínimo global.
Figura 10. Exemplo de uma superfície de erro para um treinamento usando backpropagation.
Fonte: (REIS; ALBUQUERQUE; CASTRO, 2001)
A regra delta generalizada funciona quando são utilizadas na rede unidades com uma função
de ativação semi-linear, que é uma função diferenciável e não decrescente. Note que a função
threshold não se enquadra nesse requisito. Uma função de ativação amplamente utilizada, nestes
casos, é a função sigmoid.
O verdadeiro gradiente descendente requer que sejam tomados passos infinitesimais. Assim
quanto maior for essa constante, maior será a mudança nos pesos, aumentando a velocidade do
aprendizado, o que pode levar a uma oscilação do modelo na superfície de erro. O ideal seria
utilizar a maior taxa de aprendizado possível que não levasse a uma oscilação, resultando em um
aprendizado mais rápido.
O treinamento das redes MLP com backpropagation pode demandar muitos passos no
conjunto de treinamento, resultando um tempo de treinamento consideravelmente longo. Se for
encontrado um mínimo local, o erro para o conjunto de treinamento pára de diminuir e estaciona em
um valor maior que o aceitável. Uma maneira de aumentar a taxa de aprendizado sem levar à
oscilação é modificar a regra delta generalizada para incluir o termo momentum, uma constante que
determina o efeito das mudanças passadas dos pesos na direção atual do movimento no espaço de
pesos.
24
Desta forma, o termo momentum leva em consideração o efeito de mudanças anteriores de
pesos na direção do movimento atual no espaço de pesos. O termo momentum torna-se útil em
espaços de erro que contenham longas gargantas, com curvas acentuadas ou vales com descidas
suaves, como o apresentado na Figura 10.
As respostas geradas pelas unidades são calculadas através de uma função de ativação.
Existem vários tipos de funções de ativação, as mais comuns são: Hard limiter, Threshold Logic e
Sigmoid, como mostra a Figura 11 (REIS; ALBUQUERQUE; CASTRO, 2001).
Figura 11. Tipos de funções de ativação mais utilizados.
Fonte: (REIS; ALBUQUERQUE; CASTRO, 2001)
2.4 Sensores
Os sensores usados como dispositivos periféricos na robótica incluem tanto tipos simples,
tais como chaves limites, quanto tipos sofisticados, tais como sistemas de visão de máquina.
Evidentemente os sensores são usados também como componentes integrais do sistema de controle
de realimentação do robô. Sua função como dispositivos periféricos em uma célula de trabalho
robótica e a de permitir que as atividades do robô sejam coordenadas com outras atividades na
célula. Os sensores na robótica incluem as seguintes categorias gerais:
·
Sensores de tato: São sensores que respondem a forças de contato com outro objeto.
Alguns desses dispositivos são capazes de medir o nível de força envolvido;
·
Sensores de proximidade e distância: Um sensor de proximidade é um dispositivo
que indica quando um objeto está próximo (mas antes que o contato tenha sido
25
estabelecido). Quando a distância entre os objetos pode ser detectada, o dispositivo é
chamado de sensor de alcance;
·
Sensores de tipos diversos: A categoria diversos inclui os tipos restantes de sensores
que são usados na robótica. Incluem sensores de temperatura, pressão e outras
variáveis; e
·
Sensores de visão de máquina: Um sistema de visão de máquina é capaz de
visualizar o espaço de trabalho e interpretar o que vê. Esses sistemas são utilizados
na robótica para realizar inspeção, reconhecimento de peças e outras tarefas
similares.
Os sensores são um importante componente no controle da célula de trabalho e em sistemas
de monitoração de segurança (GROOVER et al., 1989).
2.5 Atuadores
Atuadores são dispositivos que fornecem a força motriz efetiva para as juntas do robô.
Geralmente recebem sua força de uma das três fortes: ar comprimido, fluido pressurizado ou
eletricidade. São chamados, respectivamente, atuadores pneumáticos, hidráulicos ou elétricos.
·
Atuadores pneumáticos e hidráulicos: Tanto os atuadores pneumáticos quanto
hidráulicos são acionados por fluidos em movimento. No primeiro caso, o fluido é o
ar comprimido e, no segundo caso, o fluido é geralmente óleo pressurizado. A
operação desses acionamentos é geralmente semelhante, exceto em sua capacidade
para contem a pressão do fluido. Os sistemas pneumáticos tipicamente operam a
aproximadamente 100 lb/in² 68,96N/cm² e sistemas hidráulicos a 68,96N/cm² até
3000 lb/in² 2068,8N/cm²; e
·
Atuadores elétricos: À medida que suas características evoluem, os motores elétricos
se tornam cada vez mais o atuador escolhido no projeto de robôs. Propiciam
excelente controlabilidade com o mínimo de manutenção. Existe uma variedade de
tipos de motores em uso nos robôs, os mais comuns são os servomotores, motores de
passo e servomotores de CA (GROOVER et al., 1989).
26
2.6 Controladores
A finalidade do controlador é comparar a saída efetiva da planta com o comando de entrada
e propiciar um sinal de controle que reduz o erro a zero ou ao mais próximo de zero possível.
Existem quatro ações de controle básicas que são usadas isoladamente ou em combinação, para
propiciar seis tipos comuns de controlador: controle liga-desliga, controle proporcional, controle
derivado e controle integral. Os seis tipos de controlador são:
·
Controle liga-desliga: Nesse controlador, o elemento de controle fornece apenas dois
níveis de controle, plenamente ligado ou plenamente desligado;
·
Controle proporcional: Em casos em que é requerida uma ação de controle mais
suave, pode ser usado um controlador proporcional. O controlador proporcional
propicia um sinal de controle que é proporcional ao erro;
·
Controle integral: Num controlador empregando uma ação de controle integral, o
sinal de controle é mudado a uma taxa proporcional ao sinal do erro. Isto é, se o sinal
do erro é grande, o sinal de controle aumenta rapidamente, se é pequeno, o sinal de
controle aumenta lentamente;
·
Controle proporcional-integral: Às vezes é necessário combinar ações de controle.
Um controlador proporcional é incapaz de neutralizar uma carga sobre o sistema sem
um erro. Um controlador integral pode propiciar erro zero, mas geralmente fornece
resposta lenta. Um modo de superar isto é com o controlador proporcional-integral,
que é capaz de ajustar tanto o ganho do integrador quanto o ganho proporcional;
·
Controle proporcional-derivativo: A ação de controle derivativo fornece um sinal de
controle proporcional à taxa de mudança do sinal de erro. Já que este não geraria
qualquer saída, a menos que o erro esteja mudando, raramente é usado sozinho. O
efeito da ação de controle derivado é prever mudanças no erro e propiciar uma
resposta mais rápida às perturbações; e
·
Controle
proporcional-integral-derivativo:
O
controle
proporcional-integral-
derivativo é o tipo de controle mais genérico e provavelmente o mais comumente
usado. Fornece resposta rápida, bom controle de estabilidade do sistema e baixo erro
de regime permanente (GROOVER et al., 1989).
27
2.7 Ferramentas para Criação de RNAs
Durante o desenvolvimento deste projeto, foram estudadas diversas ferramentas para a
criação de RNAs, dentre as quais três delas se destacaram, e serão explicadas a seguir.
2.7.1 Java Object Oriented Neural Engine – Joone
Joone é um framework gratuito, para a criação, treinamento e teste de redes neurais
artificiais. O objetivo foi criar um poderoso ambiente de desenvolvimento, tanto para entusiastas
quanto para profissionais da área, baseado nas mais recentes tecnologias Java.
Joone é formado por um motor central que funciona como uma central de comando para
todos os aplicativos que são desenvolvidos com o mesmo. A rede neural criada com o Joone pode
ser construída na máquina local, ser treinada em um ambiente distribuído e executada em qualquer
dispositivo. Qualquer individuo pode implementar novos módulos para implementar novos
algoritmos ou novas arquiteturas partindo de um simples componente distribuído com o motor
central. A idéia fundamental é criar uma base para promover a criação de incontáveis aplicações em
Inteligência Artificial em torno do núcleo do framework (MARRONE, 2009).
Figura 12. Ambiente do Java Object Neural Engine – Joone.
28
Fonte: (MARRONE, 2009)
2.7.2 Stuttgart Neural Network Simulator – SNNS
SNNS (Stuttgart Neural Network Simulator) é um software simulador para redes neurais em
estações de trabalho Unix desenvolvido pelo IPVR (Institute for Parallel and Distributed High
Performance Systems) na Universidade de Stuttgart. A meta do projeto SNNS é criar um ambiente
de simulação eficiente e flexível para aplicação em pesquisas de redes neurais.
O simulador SNNS consiste em dois componentes principais:
1. O núcleo do simulador, escrito na linguagem C.
2. Interface gráfica do usuário sob X11R4 ou X11R5.
O núcleo do simulador opera ligado a rede interna de dados de estruturas de redes neurais e
realiza todas as operações de aprendizagem e sensibilidade. Também pode ser utilizado sem as
outras partes, como um programa C incorporado em aplicações personalizadas. Ele suporta várias
topologias de rede e, como RCS (Revision Control System), suporta o conceito de sites. O SNNS
pode ser estendido pelo usuário com a definição de funções de ativação, funções de saída, funções
de peso e procedimentos de aprendizagem. Que são escritas como simples programas em C e
ligadas ao núcleo do simulador.
Atualmente, a seguintes arquiteturas de rede e procedimentos de aprendizagem estão
incluídos no simulador:
·
Backpropagation (BP) para redes feedforward;
o Vanilla (online) BP;
o BP dinâmico com prazo fixo local e de eliminação; e
o Lote BP.
·
Counterpropagation;
·
Quickprop;
·
Backpercolation 1;
29
·
RProp;
·
RBF (Generalized radial basis functions);
·
ART1;
·
ART2;
·
ARTMAP;
·
Cascade Correlation;
·
Recurrent Cascade Correlation;
·
Dynamic LVQ;
·
Backpropagation through time (para redes recorrentes);
·
Quickprop through time (para redes recorrentes);
·
Self-organizing maps (mapas de Kohonen);
·
TDNN (time-delay neural networks) com Backpropagation;
·
Redes de Jordan;
·
Redes de Elman e redes de Elman com hierarquia estendida; e
·
Memória Associativa.
A interface gráfica XGUI (X Graphical User Interface), construída sobre o núcleo, oferece
uma representação gráfica em 2D ou 3D das redes neurais e dos controles do núcleo durante a
execução da simulação. Além disso, a interface do usuário em 2D possui um editor de redes
integrado, que pode ser utilizado diretamente para criar, manipular e visualizar redes neurais, de
varias maneiras (ZELL et al., 2009).
Na Figura 13 é possível visualizar o ambiente de desenvolvimento do SNNS.
30
Figura 13. Ambiente do Stuttgart Neural Network Simulator – SNNS.
Fonte: (ZELL et al., 2009).
2.7.3 Java Neural Network Simulator – JavaNNS
Java Neural Network Simulator (JavaNNS) é um simulador para redes neurais desenvolvido
no Wilhelm-Schickard-Institute for Computer Science (WSI) em Tübingen, Alemanha. Ele é
baseado no núcleo do Stuttgart Neural Network Simulator (SNNS) 4.2, com uma nova interface
gráfica do usuário escrita em Java sobre ele. Como conseqüência, as capacidades do JavaNNS são
iguais a maioria das capacidades do SNNS, considerando que a interface com o usuário foi
recentemente desenvolvida e tornou-se mais fácil e intuitiva de usar. Algumas características
complexas do SNNS, mas não utilizadas (e. g. visualização de redes neurais em três dimensões)
foram deixadas de fora ou sua inclusão foi adiada para uma versão posterior, todavia, algumas
características novas, como o painel de log, foram introduzidas.
31
Além da nova interface de usuário, uma grande vantagem do JavaNNS é o aumento de sua
independência quanto a plataforma de utilização. Considerando que o SNNS foi desenvolvido
principalmente com estações de trabalho Unix em mente, o JavaNNS também funciona em
computadores pessoais, desde que o Java Runtime Environment esteja instalado (ZELL et al.,
2009).
O JavaNNS foi testado em Windows NT, Windows 2000, Windows XP, RedHat Linux 6.1,
Solaris 7 e Mac OS X (ZELL et al., 2009).
Na Figura 14 é possível visualizar o ambiente de desenvolvimento do JavaNNS.
Figura 14. Ambiente do Java Neural Network Simulator – JavaNNS.
Fonte: (ZELL et al., 2009).
32
2.8 Simuladores de Robôs
Durante o desenvolvimento deste projeto, foram estudadas diversas ferramentas para a
simulação de robôs, dentre as quais três delas se destacaram, e serão explicadas a seguir.
2.8.1 Robocode
O Robocode foi desenvolvido pela AlphaWorks, uma divisão da IBM que tem como
finalidade difundir novas tecnologias de desenvolvimento. O Robocode é um projeto hospedado
pela SourceForge e pode ser encontrado em http://robocode.sourceforge.net/. A idéia básica é
fornecer um ambiente de simulação de batalhas entre robôs que seja executado em qualquer
plataforma Java. O usuário pode utilizar as classes básicas disponibilizadas pelo ambiente para criar
um robô e colocá-lo em batalha contra outros robôs desenvolvidos por outros programadores. Com
ele é possível aprimorar conceitos como herança, polimorfismo, eventos, entre outros, além de
servir para testes de heurísticas de combate e de movimentação (PASSOS, 2008).
No Robocode, um robô é composto por: (i) um veiculo (body), que prove movimentação e
rotação ao robô; (ii) um canhão (gun), que serve para atacar os robôs inimigos; (iii) um radar, que é
utilizado para localizar outros robôs no campo de batalha e para movimentar-se de forma
independente do canhão, conforme Figura 15. E tem como restrições: (i) energia, que é utilizada
para realizar as operações no robô e nos disparos, onde é possível definir a quantidade de energia
que será utilizada e sendo recuperada quando se acerta outro robô; (ii) calor, onde um canhão só
dispara quando seu nível de calor estiver em zero, sendo que o calor produzido é proporcional a
potencia do disparo (PASSOS, 2008).
Figura 15. Anatomia de um robô no simulador Robocode.
Fonte: (PASSOS, 2008).
33
O Robocode apresenta certas características físicas, como: (i) tempo, que é medido no
Robocode através dos “ticks” que são equivalentes aos frames, que são os quadros do jogo por
segundo, iniciados na tela; (ii) distância, a distância é medida através dos pixels, com duas
exceções, na primeira as distâncias são medidas com precisão “double”, permitindo que se possa
mover uma fração de um pixel, na segunda o Robocode pode alterar automaticamente a escala para
que as mesmas possam caber na tela, sendo nesse caso a unidade de medida menor que um pixel; a
(iii) aceleração do robô é feita na taxa de 1 pixel/tick e a desaceleração na taxa de 2 pixel/tick, sendo
que o robocode determina automaticamente a aceleração baseada na distancia que se pretende
movimentar o robô; (iv) velocidade, é representada por uma equação v=em, sendo que a velocidade
máxima não pode exceder o nível 8 (SOURCEFORGE, 2007 apud PASSOS, 2008).
Os principais comandos do robô são apresentados na Tabela 1.
AÇÃO DO ROBÔ
MÉTODO
turnRight(double degree)
turnLeft(double degree)
Ahead(double distance)
back(double distance)
turnGunRight(double degree)
turnGunLeft(double degree)
setAdjustGunForRobotTurn(boolean flag)
setAdjustRadarForRobotTurn(boolean flag)
setAdjustRadarForGunTurn(boolean flag)
Virar o robô
Move o robô e finaliza caso bata em uma parede
Move o canhão independente do veiculo
Se verdadeiro, vira o canhão junto com o veiculo
Se verdadeiro, vira o radar junto com o veiculo
Se verdadeiro, vira o radar junto com o canhão
Tabela 1. Principais comandos do robô.
Fonte: (PASSOS, 2008).
Os principais eventos realizados pelo robô são descritos na Tabela 2.
DESCRIÇÃO
MÉTODO
Chamado quando o robô é detectado pelo radar
Chamado quando o robô é atingido por uma bala
Chamado quando ocorre uma colisão entre robôs
Chamado quando o robô colide contra uma parede
onScannedRobot(ScannedRobotEvent)
onHitByBullet(HitByBulletEvent)
onHitRobot(HiRobotEvent)
onHitWall(HitWallEvent)
Tabela 2. Principais eventos utilizados pelo robô.
Fonte: (PASSOS, 2008).
As principais funções para se obter informações são descritas na tabela 3.
34
DESCRIÇÃO
Coordenadas correntes do robô
Direção corrente do robô
Dimensões do campo de batalha
MÉTODO
get(x)
get(y)
getHeading()
getGunHeading()
getRadarHeading()
getBattleFieldWidth()
getBattleFieldHeight()
Tabela 3. Principais funções utilizadas para a obtenção de informações.
Fonte: (PASSOS, 2008).
Os robôs comuns executam apenas uma tarefa de cada vez, todavia é possível criar robôs
mais avançados, nos quais ações assíncronas são definidas e executadas, permanecendo em
execução paralelamente a outras possíveis ações. As principais vantagens nesse tipo de
programação são: (i) execução de múltiplos movimentos simultâneos; (ii) pode-se definir uma
estratégia diferente a cada tique do relógio; (iii) pode-se definir eventos customizados.
Existe também a opção de se criar equipes de robôs cooperativos entre si, nos quais os robôs
podem trocar mensagens através dos métodos broadcastMessage (Serializable msg) e
onMessageReceived (MessageEvent Event) (PASSOS, 2008).
Na Figura 16 pode-se visualizar o ambiente de simulação do Robocode.
Figura 16. Interface do ambiente de simulação do Robocode.
Fonte: (NELSON et al., 2009).
35
2.8.2 Khepera Simulator
O simulador Khepera foi desenvolvido na Universidade Nice Sophia, por Oliver Michel.
Trata-se de um software freeware desenvolvido em C que pode ser adquirido gratuitamente no site
http://diwww.epfl.ch/lami/team/michel/khep-sim/. Ele foi projetado para desenvolver algoritmos de
controle utilizando a linguagem C ou C++ e conta com uma biblioteca de funções para realizar a
movimentação do robô e obter os resultados. Sendo caracterizado pela habilidade de dirigir um robô
Khepera real, sendo possível transferir facilmente os resultados da simulação para o robô físico
(MICHEL et al., 2009).
O simulador opera apenas em sistemas baseados na plataforma Unix, apresentando uma
interface gráfica colorida e agradável. A interface do simulador Khepera se divide em duas partes:
(i) a primeira, localizada à esquerda na Figura 17, representa o ambiente simulado, onde é possível
visualizar o comportamento do robô, (ii) a segunda, apresentada a direita na mesma figura,
representa o robô, onde é possível observar o que ocorre internamente no robô (sensores, atuadores
e controladores). Na Figura 17 pode-se visualizar o ambiente de simulação Khepera (MICHEL et
al., 2009).
Figura 17. Interface do ambiente de simulação do Khepera.
Fonte: (MICHEL et al., 2009).
36
O simulador conta com diversos ambientes de simulação já disponíveis em seus diretórios,
que podem ser utilizados para a realização de simulações. Sendo que o mesmo ainda permite ao
usuário a edição e criação de novos ambientes de simulação. O robô simulado pelo simulador
Khepera conta com oito sensores infravermelhos, que tem como finalidade detectar objetos e medir
o nível de luz do ambiente. Ele também simula motores diretos, movendo o robô de acordo com a
velocidade estipulada pelo usuário (MICHEL et al., 2009).
Embora esteja disponível para download e seja um software freeware, o Khepera simulador
deixou de receber atualizações em 1996, quando deu origem a uma versão comercial batizada como
Webots, pertencente a empresa Cyberbotic. Esse novo simulador tornou-se referencia no mercado e
foi adotado pelas maiores empresas de robótica do Japão, e possui uma versão de demonstração
disponível em http://www.cyberbotics.com/. Uma licença comercial deste simulador custa U$
9.000,00, entretanto há uma licença acadêmica mais em conta, no valor de U$ 400,00. Atualmente
mais de 500 universidades e centros de pesquisa utilizam este simulador. Na Figura 18 é
apresentado o ambiente de simulação do Webots 6 (MICHEL et al., 2009).
Figura 18. Interface do ambiente de simulação do Webots 6.
Fonte: (MICHEL et al., 2009).
37
2.8.3 Simbad 3D
O Simbad é um projeto Open Source (tipo de software cujo código fonte é visível
publicamente), que utiliza a plataforma JAVA 3D e tem como objetivo gerar um ambiente para
simulação de robôs que forneça aos desenvolvedores uma base simples para estudos na área de IA,
no contexto de robótica autônoma e agentes autônomos (SIMBA, 2007 apud PASSOS, 2008).
Conforme Hugues e Bredeche (2006), o Simbad possui dois pacotes adicionais, são eles:
·
PicoNode. Contém bibliotecas de Redes Neurais (feed-forward, recorrentes, etc.);
·
PicoEvo. É uma estrutura de evolução artificial para algoritmos genéticos, estratégias
evolutivas e programação genética.
Esses pacotes são direcionados para robôs evolutivos.
O pacote Simbad possui um simulador de robôs móveis com complexa modelagem de cena
em 3D (simbad), uma biblioteca de Redes Neurais (feed-forward, recorrentes), bem como uma
completa biblioteca de algoritmos evolutivos (algoritmo genético, estratégia evolutiva, programação
genética com árvores ou grafos). Todas as ferramentas foram escritas para serem eficientes e fáceis
de usar por programadores em Java ou em Pyton, permitindo a eles escrever seus próprios
controladores de robôs, modificar o ambiente e utilizar sensores disponíveis ou construir novos
sensores (HUGUES; BREDECHE, 2006).
O Simbad está disponível a partir do site http://simbad.sourceforge.net/ sob as condições da
GPL (GNU General Public Licence) e necessita da plataforma Java (versão 1.4.2 ou superior) e Sun
Java 3D (versão 1.3.1 ou superior). Estes dois componentes estão disponíveis para uma ampla gama
de plataformas (Windows, Mac OS X, Linux, IRIX, AIX). Após o Java ser instalado e configurado
de acordo com o sistema operacional e depois do Java 3D ser instalado, basta executar o comando
java -jar simbad-[versão].bin.jar, para iniciar o simulador (SIMBA, 2007).
Em relação a simulação, o usuário somente utilizará um ambiente derivado da classe
EnvironmentDescription e um controlador de robô derivado da classe Robot. Esta última tem um
método de inicialização (initBehavior) e um método a ser chamado a cada etapa da simulação
(performBehavior). Em seguida são executadas as ordens de controle motor de forma semelhante a
38
um verdadeiro controlador de robô, isto é, repetitivas chamadas para o micro-controlador,
(HUGUES; BREDECHE, 2006).
Na Figura 19 é possível ver a interface do simulador Simbad 3D.
Figura 19. Interface do ambiente de simulação Simbad 3D.
Fonte: (HUGUES; BREDECHE, 2009).
39
As principais funções disponibilizadas pelo simulador Simbad são descritas na Tabela 4.
DESCRIÇÃO
MÉTODO
Define o tamanho do quadro que receberá o mundo
Cria um objeto caixa no ambiente
Classe que auxilia na construção de robôs e sensores
Define a velocidade translacional em metro por
segundo
Define a velocidade rotacional em radianos por
segundo
Retorna a posição do robô em coordenadas
setWorldSize(float size)
Box(Vector3d, Vector3f, EnvironmentDescription)
RobotFactory()
setTranslationalVelocity(double TV)
setRotationalVelocity(double TV)
getCoords(javax.vecmath.Point3d cood)
Tabela 4. Principais funções disponibilizadas pelo Simbad 3D.
Fonte: (PASSOS, 2008).
2.9 Ferramentas Similares
Nesta seção serão mostradas as ferramentas que se mostraram relevantes ao escopo deste
projeto, visando facilitar o entendimento das mesmas e permitindo que se extraía delas sugestões
para solucionar os possíveis problemas desse projeto.
2.9.1 Utilizando RNAs no Controle de Robôs Moveis Aplicados ao Combate de
Incêndios Florestais
O objetivo deste trabalho foi detalhar o projeto e o desenvolvimento de um sistema multiagente que opera em um ambiente virtual de simulação realística. Onde uma equipe heterogênea de
agentes autônomos trabalha cooperativamente a fim de realizar com sucesso a identificação e o
combate de incêndios em áreas florestais, sem intervenção humana. A abordagem implementada
adota estratégia centralizada, mas com controle de ação distribuído, onde cada agente possui
autonomia na execução das tarefas que lhe são passadas. Os robôs de combate são fisicamente
simulados com a biblioteca ODE e as informações sensoriais de cada robô (e.g. GPS, bússola,
sonar) servem de entrada para uma Rede Neural que controla os atuadores do veículo para assim
realizar navegação com desvio de obstáculos de um ponto aleatório até um ponto de atuação no
combate ao incêndio. O ambiente desenvolvido apresenta simulação de propagação de fogo baseado
em tipos de vegetação, orientação e intensidade do vento. Os resultados das simulações demonstram
que a Rede Neural controla satisfatoriamente os robôs móveis e que o sistema proposto pode vir a
ter um papel muito importante no planejamento e execução de operações reais de combate a
incêndios florestais e possivelmente em outras tarefas similares, como acidentes nucleares ou
desastres ambientais (PESSIN, G. et al., 2007).
40
2.9.2 Estacionamento de um Veículo de Forma Autônoma Utilizando RNAs
Este artigo teve como objetivo descrever o sistema SEVA3D, que é um simulador utilizado
para o controle de veículos autônomos durante o estacionamento em vagas paralelas, utilizando um
ambiente tridimensional realista e sensores do tipo Sonar. Os resultados obtidos nas simulações
demonstraram que o sistema de controle possui a capacidade de controlar corretamente o veículo,
cumprindo seu objetivo principal: estacionar o veículo de modo autônomo corretamente na vaga,
sem se chocar contra os demais elementos presentes no ambiente. As verificações, tanto numéricas
quanto visuais, permitiram constatar que a tarefa pôde ser corretamente executada na maioria das
simulações realizadas, demonstrando que o sistema de controle do SEVA3D é bastante estável.
Atualmente o veículo real que serviu de modelo para o veículo virtual está sendo equipado com os
sensores do tipo sonar, a fim de validar o sistema de controle do SEVA3D (HEINEM, et al., 2006).
2.9.3 Dirigibilidade de Mini-Robôs com RNAs: Uma Experiência Acadêmica
Trata-se do desenvolvimento de um mini-robô (LEGO Mindstorm (LEGO®)), simulando o
movimento em um ambiente desconhecido. Para controlar o movimento desse conjunto
mecatrônico, utiliza-se a estratégia do paradigma SPA (sentir-planejar-agir), proposto por
Kortenkamp. Uma rede neural artificial, implementada pelo framework JOONE e um programa de
controle dos sensores de rotação que tem o objetivo de contar a variação de coordenadas
provocadas pelo movimento do robô. Os programas foram desenvolvidos em leJOS e um conjunto
de APIs que permitem a programação do RCX 1.0 da LEGO® Mindstorm™, numa linguagem
diferente da nativa. A escolha se justifica pelo interesse de usar as vantagens do JAVA no ambiente
do LEGO®, englobando uma JVM (Java Virtual Machine), a TinyVM, que substitui o firmware
original do RCX, e um conjunto de outras classes que interagem com a TinyVM e são usadas para
programar o robô. O programa controla sensores, atuadores e uma bússola embarcada, monitorada
por um sensor de luz, viabilizando a orientação e o posicionamento geográfico do robô. Fica para a
Rede Neural Artificial (RNA) a responsabilidade pela navegação diante dos obstáculos encontrados
no ambiente, ditando como o robô se movimentará ao encontrar uma obstrução na sua rota
planejada. (DINIZ, M. V. C., 2006).
41
3 PROJETO
Trata-se do projeto de uma Rede Neural Artificial capaz de comandar o deslocamento de um
veículo através de uma superfície plana, permitindo que o mesmo seja capaz de prever e assim optar
por um caminho no qual não ocorram obstáculos em seu trajeto.
A arquitetura escolhida para implementação da RNA foi o Perceptron de Múltiplas Camadas
(MLPs – Multilayer Perceptron). Foi realizada a implementação de diversas RNAs apresentando
cada uma delas uma configuração específica. Todas as RNAs foram treinadas e validadas com os
mesmos conjuntos de padrões (training.pat e validation.pat). Um exemplo de uma rede MLP é
visualizado na Figura 20.
Figura 20. Exemplo de uma RNA da arquitetura MLP.
Fonte: Braga, Carvalho e Ludermir, 2007.
Após diversas configurações quanto ao veículo no que diz respeito à quantidade e
localização dos sensores de entrada e das direções possíveis de serem tomadas pelo veículo, optouse pela implementação de uma RNA capaz de atender a um veículo autônomo dotado de três (3)
sensores do tipo sonares como entrada de dados, conforme Figura 21, e capacidade de direcionar-se
42
em oito (8) direções pré-programadas apresentadas em graus, são elas: 0 graus, 30 graus, 90 graus,
120 graus, 180 graus, 240 graus, 270 graus e 330 graus, como pode ser visualizado na Figura 22.
Figura 21. Sensores do Veículo Móvel.
Figura 22. Direções do Veículo Móvel
Os sensores de entrada trabalharam com valores entre 0 e 1, sendo 0 a total ausência de
obstáculo e 1 a presença de obstáculo imediatamente à frente. A RNA decide a direção do veículo
através da combinação entre os três valores de entrada e da respectiva proximidade que cada um
deles apresentar do valor 1.
Quando aos neurônios de saída da RNA, cada um deles corresponde a uma direção
específica do veículo, sendo que cada neurônio pode assumir o valor de 0, que significa que a
respectiva direção não será tomada, e 1, que assume ser esta a direção na qual o veículo deverá se
deslocar.
O método de treinamento adotado pela RNA é o backpropagation, e a função de ativação
escolhida é a função logística, recomendada quando se trabalha com valores entre 0 e 1.
43
3.1 Metodologia
A realização deste projeto seguiu a seguinte metodologia:
1) Estudo das RNAs MLPs: Realizado estudo aprofundado desta arquitetura de RNAs,
já que a mesma foi escolhida para ser utilizada neste projeto;
2) Estudo e definição do sensor a ser utilizado pela RNA neste projeto: Após ampla
pesquisa, optou-se por utilizar sensores do tipo sonar, devido à forma e amplitude
com a qual mapeiam o ambiente disponível;
3) Definição da quantidade de neurônios das camadas de entrada e saída: Após estudo
quanto ao comportamento esperado pelo veiculo planejado para utilização da RNA
criada nesse projeto, analise das possíveis direções que o mesmo deveria tomar, e
levando em conta o objetivo de criar uma RNA o menos exigente possível quanto ao
fator processamento, optou-se por uma rede com três neurônios na camada de
entrada e oito neurônios na camada de saída;
4) Definição da função de ativação a ser utilizada pela RNA: Considerando o fato da
RNA operar basicamente com valores em um intervalo entre 0 e 1, considerou-se
como melhor opção a função de ativação logística;
5) Definição do ambiente a ser utilizado na manipulação da RNA: Após análise de seis
(6) ambientes de desenvolvimento de RNAs, a serem especificados na seção 2.7,
optou-se pelo ambiente desenvolvido na Wilhelm Schickard Institute for Computer
Science (WSI) em Tübingen, Alemanha, denominado Java Neural Network
Simulator (JavaNNS);
6) Definição do ambiente a ser utilizado na virtualização do veiculo a utilizar a RNA
desenvolvida neste projeto: Após análise de alguns ambientes de simulação de robôs,
a serem especificados na seção 2.8, optou-se pelo ambiente em Java denominado
Simbad 3D;
7) Criação dos arquivos de padrões da RNA: Definida a quantidade de neurônios na
camada de entrada e na camada de saída, e escolhido o ambiente a ser utilizado para
a manipulação da RNA, realizou-se o estudo do layout dos arquivos de treinamento e
44
validação utilizados pelo ambiente. Com base nesse estudo, foram criados
manualmente dois arquivos de padrões, um arquivo para treinamento, denominado
training.pat, com 911 entradas de dados, e um arquivo para validação, denominado
validation.pat, composto por 200 entradas de dados;
8) Definição da quantidade de neurônios da camada intermediária da RNA: Após
realizar pesquisas na literatura de RNAs, ler trabalhos similares e realizar diversos
testes no ambiente JavaNNS utilizando diferentes configurações quando ao número
de camadas e quantidade de neurônios concluiu-se que a camada de neurônios
intermediaria deveria possuir entre 25 a 30 neurônios;
9) Criação, Treinamento e Validação da RNA no JavaNNS: Foram criadas diversas
RNAs no ambiente JavaNNS, com diversas configurações quanto à quantidade de
neurônios na camada intermediaria, todavia todas sofreram o processo de
treinamento e validação utilizando os mesmo arquivos de padrões;
10) Geração do Código em Linguagem C utilizando o arquivo de topologia gerado pelo
ambiente JavaNNS: Após finalizado o treinamento e validação da RNA no ambiente
JavaNNS, foi utilizada a ferramenta snns2c.exe, disponibilizado no kernel do
software SNNS para converter o arquivo criado pelo JavaNNS contendo a RNA para
um arquivo fonte na linguagem C;
11) Análise estatística do arquivo de resultado gerado pelo ambiente JavaNNS: Após o
Treinamento e Validação da rede realizado pelo ambiente JavaNNS. Para isso foi
utilizado o software analyser.exe, disponibilizado no Kernel do software SNNS;
12) Desenvolvimento de um software contendo o código gerado pelo snns2c.exe: A
partir desse fonte foi criado um software em C capaz de ler um arquivo de padrões
de entrada e gerar um arquivo de padrões de saída, contendo a saída da RNA em
questão, que foi comparado com a saída esperada da rede;
13) Desenvolvimento de uma DLL contendo o código gerado pelo snns2c.exe: Foram
criado dois (02) arquivos DLL, ambos utilizando o código fonte criado pelo software
snns2c.exe, uma foi criada no ambiente Embarcadero C++ Builder 2010 e outra no
ambiente Bloodshed Dev-C++ 4;
45
14) Desenvolvimento de uma aplicação capaz de utilizar as DLLs criadas: Foi
desenvolvida uma aplicação em linguagem C capaz de utilizar as DLLs previamente
criadas a fim de analisar a saída gerada pelas mesmas;
15) Simulação do veículo que utiliza a RNA: Criação de um ambiente virtual no
simulador Simbad 3D com a finalidade de demonstrar o funcionamento da RNA,
utilizando a DLL já criada através da utilização da biblioteca JNA; e
16) Documentação do projeto: Todo o projeto está detalhadamente documentado, os
dados de entrada e saída da rede, assim como os códigos fonte encontram-se nos
apêndices desse documento.
3.2 Requisitos Funcionais
Os requisitos funcionais descrevem as funcionalidades que o sistema deve atender, são eles:
·
RF01: O sistema deve se locomover sem o auxílio humano;
·
RF02: O sistema deve desviar de obstáculos antes de se chocar com os mesmos;
·
RF03: O sistema deve evitar caminhos que apresentarem um diâmetro de passagem
menor do que o diâmetro do próprio veículo que utiliza a RNA; e
3.3 Requisitos não Funcionais
Os requisitos não funcionais são aqueles que não estão relacionados com a funcionalidade
do sistema, são eles:
·
RNF01: A RNA deve ser desenvolvida e manipulada em um ambiente não
proprietário;
·
RNF02: O código fonte gerado através do arquivo da RNA deve ser independente de
plataformas.
46
3.4 Regras de Decisão da Rede Neural Artificial
As regras de decisão da RNA foram criadas para auxiliar na criação dos arquivos de padrões
usados no treinamento e na validação da RNA, trata-se de um conjunto de normas que tem como
finalidade reger o comportamento da RNA, é um espelho quanto ao comportamento que o sistema
deve possuir. As regras são apresentadas em ordem decrescente, sendo a primeira a regra mais geral
e a última a mais específica.
Se ((Sensor Esquerdo <= 0.90) e (Sensor Central <= 0.90) e (Sensor Direito <= 0.90)) então:
•Se (Sensor Central = Sensor Esquerdo) e (Sensor Central < Sensor Direito) Faça (Direção = 0º)
•Se (Sensor Central = Sensor Direito) e (Sensor Central < Sensor Esquerdo) Faça (Direção = 0º)
•Se (Sensor Central = Sensor Esquerdo) e (Sensor Central > Sensor Direito) Faça (Direção = 30º)
•Se (Sensor Central = Sensor Direito) e (Sensor Central > Sensor Esquerdo) Faça (Direção = 330º)
•Se (Sensor Central < Sensor Esquerdo) e (Sensor Direito > Sensor Esquerdo) Faça (Direção = 0º)
•Se (Sensor Central < Sensor Direito) e (Sensor Direito < Sensor Esquerdo) Faça (Direção = 0º)
•Se (Sensor Direito = Sensor Esquerdo) e (Sensor Central < Sensor Esquerdo) Faça (Direção = 0º)
•Se (Sensor Direito < Sensor Esquerdo) e (Sensor Central > Sensor Esquerdo) Faça (Direção = 30º)
•Se (Sensor Direito = Sensor Esquerdo) e (Sensor Central > Sensor Direito) Faça (Direção = 90º)
•Se (Sensor Direito > Sensor Esquerdo) e (Sensor Central > Sensor Direito) Faça (Direção = 330º)
Se ((Sensor Esquerdo >= 0.91) e (Sensor Central <= 0.90) e (Sensor Direito <= 0.90)) Faça: Direção = 90º
Se ((Sensor Esquerdo <= 0.90) e (Sensor Central <= 0.90) e (Sensor Direito >= 0.91)) Faça: Direção = 270º
Se ((Sensor Esquerdo <= 0.90) e (Sensor Central >= 0.91) e (Sensor Direito <= 0.90)) Faça:
•Se (Sensor Direito > Sensor Esquerdo) Então (Direção = 90º)
•Se (Sensor Esquerdo < Sensor Direito) Então (Direção = 270º)
Se ((Sensor Esquerdo >= 0.91) e (Sensor Central >= 0.91) e (Sensor Direito <= 0.90)) Faça: Direção = 90º
Se ((Sensor Esquerdo <= 0.90) e (Sensor Central >= 0.91) e (Sensor Direito >= 0.91)) Faça: Direção = 270º
Se ((Sensor Esquerdo >= 0.91) e (Sensor Central <= 0.90) e (Sensor Direito >= 0.91)) Faça: Direção = 180º
Se ((Sensor Esquerdo >= 0.91) e (Sensor Central >= 0.91) e (Sensor Direito >= 0.91)) Faça: Direção = 180º
Se ((Sensor Esquerdo <= 0.98) e (Sensor Central >= 0.98) e (Sensor Direito >= 0.98)) Faça: Direção = 240º
Se ((Sensor Esquerdo >= 0.98) e (Sensor Central >= 0.98) e (Sensor Direito <= 0.98)) Faça: Direção = 120º
Se ((Sensor Esquerdo >= 0.98) e (Sensor Central >= 0.98) e (Sensor Direito >= 0.98)) Faça: Direção = 180º
Se ((Sensor Esquerdo <= 0.90) e (Sensor Central >= 0.91) e (Sensor Direito <= 0.90)) Faça:
•Se (Sensor Esquerdo = Sensor Direito) Faça (Direção = 90º)
Caixa de Texto 1. Regras de Comportamento da Rede Neural Artificial.
A Figura 23 apresenta um conjunto de entradas e saídas que obedecem as regras
apresentadas na Caixa de Texto 1:
47
Figura 23. Exemplo de dados que obedece ao conjunto de regras apresentadas
Uma alternativa mais simples de se visualizar o conjunto de regras apresentado é através da
Tabela 5, que é apresentada a seguir:
Sensor Esquerdo
A (<= 0.90)
>= 0.98
>= 0.98
<= 0.98
>= 0.91
>= 0.91
<= 0.90
>= 0.91
<= 0.90
Sensor Central
>= 91º
>= 0.98
>= 0.98
>= 0.98
>= 0.91
<= 0.90
>= 0.91
>= 0.91
Sensor Direito
A (<= 0.90)
>= 0.98
<= 0.98
>= 0.98
>= 0.91
>= 0.91
>= 0.91
<= 0.90
>= 0.91
VSE < VSD
VSD < VSE
Direção
90º
180º
120º
240º
180º
180º
270º
90º
<= 0.90
270º
90º
<= 0.90
>= 0.91
<= 0.90
<= 0.90
>= 0.91
<= 0.90
<= 0.90
<= 0.90
<= 0.90
VSD > VSE
VSD = VSE
VSD < VSE
VSD = VSE
VSC < VSD
VSC < VSE
VSC = VSD
VSC = VSE
VSC = VSD
VSC = VSE
VSC > VSD
VSC > VSD
VSC > VSE
VSC < VSE
VSD < VSE
VSD > VSE
VSC > VSE
VSC > VSD
VSC < VSE
VSC < VSD
Tabela 5. Regras de decisão da Rede Neural Artificial.
48
270º
90º
330º
90º
30º
0º
0º
0º
330º
30º
0º
0º
3.5 Funcionamento da RNA e do Veículo
Para uma melhor compreensão quanto ao funcionamento do veículo, é apresentado a seguir
em detalhes como o mesmo se comporta em relação aos dados de entrada enviados pelos três (3)
sensores do veículo e quanto aos oito (8) sinais de saída retornados pela rede neural artificial. A
Figura 24 apresenta um layout contendo os três (3) valores de entrada seguidos dos oito (8) valores
de retorno da RNA, acima de cada valor de entrada encontra-se uma seta indicando sua direção, e
sobre cada valor de retorno há o indicador referente à direção que o mesmo representa.
Figura 24. Layout explicativo quanto ao funcionamento do veículo.
A seguir são apresentados cinco (5) seqüências de valores contendo os três (3) valores de
entradas e seus respectivos oito (8) valores de saída. Após será apresentado o layout explicativo
quanto ao significado de cada uma dessas saídas.
Na Primeira seqüência, apresentada na Figura 25, é possível perceber que os valores
esquerdo (0.30), central (0.24) e direito (0.68) são valores considerados neutros, pois são valores
inferiores à 0.80, isso significa que não há risco de choque imediato, por esse motivo é considerado
como melhor opção de direção a seguir o sensor que retornar o menor valor, no caso da Figura 25,
tal valor refere-se ao sensor central (0.24).
49
Figura 25. Primeira seqüência de valores para análise.
Figura 26. Segunda seqüência de valores para análise.
50
Na segunda seqüência de valores, apresentada na Figura 26, é possível perceber que os
valores esquerdo (0.56), central (0.61) e direito (0.05) são valores considerados neutros, todavia o
valor retornado pelo sensor direito é extremamente baixo, e sendo assim, é a melhor opção no que
diz respeito a qual direção o veículo deve seguir.
Na terceira seqüência de valores, apresentada na Figura 27, é possível perceber que os
valores esquerdo (0.65) e direito (0.27) são valores neutros enquanto o valor central (0.91) é
consideravelmente alto, ao considerarmos os três (3) valores, torna-se evidente que a direção a ser
tomada é à direita, todavia o valor do sensor central implica em alta possibilidade de choque, o que
exige que o veículo realize uma curva mais fechada, esse fato pode ser visto na Figura 27.
Figura 27. Terceira seqüência de valores para análise.
Na quarta seqüência de valores, apresentada na Figura 28, é possível perceber que os valores
esquerdo (0.62), central (0.76) e direito (0.67) são valores considerados neutros, todavia o valor
retornado pelo sensor esquerdo é o mais baixo, e sendo assim, é a melhor opção no que diz respeito
a qual direção o veículo deve seguir.
Na quinta seqüência de valores, apresentada na Figura 29, é possível perceber que os valores
esquerdo (0.19) e central (0.43) são valores neutros enquanto o valor direito (0.91) é
consideravelmente alto, ao considerarmos os três (3) valores, torna-se evidente que a direção a ser
51
tomada é à direita, todavia o valor do sensor direito implica em alta possibilidade de choque, o que
exige que o veículo realize uma curva mais fechada, esse fato pode ser visto na Figura 29.
Figura 28. Quarta seqüência de valores para análise.
Figura 29. Quinta seqüência de valores para análise.
52
4 IMPLEMENTAÇÃO
Nesta seção é apresentada a implementação do sistema, incluindo métodos e componentes
utilizados para isso. Serão também apresentados os procedimentos utilizados para treinamento,
validação e teste do mesmo. Essa seção abrange tanto os aspectos virtuais quanto os aspectos
físicos relacionados com o projeto.
A seção 4.1 e suas subseções estão relacionadas à utilização do ambiente de criação e
manipulação da Rede Neural Artificial JavaNNS e dos aplicativos relacionados ao mesmo, como o
snns2c.exe (utilizado para converter o arquivo de padrões da Rede Neural Artificial gerado pelo
JavaNNS para um arquivo fonte na linguagem C) e o analyzer.exe (utilizado para analisar o arquivo
de resultado gerado pelo JavaNNS de forma a retornar de forma estatística as informações
referentes aos acertos, erros e padrões não reconhecidos pela Rede Neural Artificial). Aqui é criada,
treinada e validada a Rede Neural Artificial.
A seção 4.2 e suas subseções estão relacionadas à criação e utilização de Bibliotecas de
ligação Dinâmica ou, como são mais conhecidas, Dinamic Link-library (DLL). São detalhadas sua
criação a partir do código fonte gerado pelo snns2c.exe, sua utilização em um aplicativo
desenvolvido em linguagem C e até a verificação do layout de suas funções internas antes mesmo
de utilizá-la.
A seção 4.3 e suas subseções estão relacionadas à utilização do ambiente de simulação de
Robôs Simbad 3D e dos aplicativos e bibliotecas relacionados com o mesmo, como o Java3D (uma
biblioteca gráfica necessária para a utilização do Simbad 3D) e o JNA (uma biblioteca utilizada
para realizar chamadas de bibliotecas externas de forma simples e eficiente, sem que seja necessário
a utilização do JNI). Aqui são criados os mundos e robôs virtuais onde é demonstrado o
desempenho da Rede Neural Artificial em um ambiente simulado.
4.1 Definição do Ambiente de Manipulação da RNA
Para definir qual seria o ambiente a ser utilizado neste projeto para realizar toda a
manipulação da RNA, foi realizada uma pesquisa, na qual foram analisados um total de seis (6)
ambientes de desenvolvimento, sendo que os três (3) de maior destaque foram o Java Neural
Network Simulator (JavaNNS), o Stuttgart Neural Network Simulator (SNNS) e o Java Object
53
Neural Engine (Joone), já mencionados e apresentados na seção 2.7 deste documento. Os demais
ambientes testados foram os seguintes:
·
Artificial Neural Networks Framework (ANNeF): trata-se de um framework,
implementado em linguagem Java, que oferece condições de realizar inúmeras
aplicações portáveis usando uma API bastante simplificada, cujo usuário poderá
adaptar este conjunto de classes para as suas necessidades ou criar outros modelos de
redes neurais. Está disponível em: http://www.inf.unisinos.br/~jrbitt/annef/.
·
Fast Artificial Neural Network Library (FANN): trata-se de uma biblioteca livre de
redes neurais com código aberto, que implementa redes neurais artificiais de
múltiplas camadas em linguagem C. Ele inclui um framework para simples
manipulação do conjunto de dados de treinamento. Esta biblioteca livre encontra-se
disponível em: http://leenissen.dk/fann/.
·
Scilab: é um pacote de software científico para computações numéricas fornecendo
um poderoso ambiente computacional aberto para aplicações científicas e de
engenharia. Trata-se de um software de código aberto. Desde 1994 tem sido
distribuído gratuitamente junto com o código fonte, através da Internet. Atualmente,
é utilizado em ambientes industriais e educacionais em todo o mundo. Esse software
está disponível em: http://www.scilab.org/platform/.
Embora todos os seis (6) ambientes apresentem-se como ótimas opções para o
desenvolvimento de RNAs, a escolha baseou-se na disponibilidade de recursos oferecidos, na
simplicidade de manipulação da mesma e no reconhecimento da ferramenta no meio acadêmico.
Após análise desses três (3) fatores, optou-se pela ferramenta denominada JavaNNS, conforme
tabela 6.
Ambiente
JavaNNS
SNNS
JOONE
ANNeF
FANN
Scilab
Recursos Oferecidos
(1 a 3)
3
3
2
2
2
2
Simplicidade de Uso
(1 a 3)
3
2
2
1
1
1
Reconhecimento Acadêmico
(1 a 3)
3
3
2
2
2
3
Tabela 6. Análise e Pontuação dos Ambientes de Criação de RNAs.
54
Total
9
8
6
5
5
6
4.1.1 Criação dos Arquivos de Padrões
Após definida a ferramenta a ser utilizada para a manipulação da RNA, iniciou-se o estudo
quanto aos layouts de arquivos aceitos pela ferramenta, os mesmos apresentaram grande
simplicidade. São constituídos por um cabeçalho padrão, onde são inseridas algumas informações
quanto à quantidade de neurônios de entrada e de saída da RNA, a quantidade de entradas de
treinamento e os dados de treinamento. A Figura 30 apresenta o formato padrão oficial do arquivo
de padrões.
Figura 30. Layout oficial do arquivo de padrões do JavaNNS e SNNS.
Todavia, os padrões de treinamento podem ser apresentados de forma ainda mais simples
para o ambiente JavaNNS, como demonstrado na Figura 31.
Figura 31. Layout de padrões de arquivo simples aceito pelo JavaNNS e SNNS.
Observe que, como é informada no arquivo, a quantidade de neurônios na camada de
entrada (No. of input units) e a quantidade de neurônios na camada de saída (No. of output units), a
55
ferramenta reconhece os três (3) primeiros valores da seqüência como dados de entrada da rede,
enquanto os demais oito (8) valores da seqüência são automaticamente reconhecidos como dados de
saída da RNA. O campo posicionado na quarta linha do arquivo (No. of patterns) informa a
quantidade de entradas de treinamento contidas no arquivo. Após abrir o arquivo no formato
simples na ferramenta JavaNNS, em qualquer momento você pode salva-lo, através do menu “File –
Save Data...”, e automaticamente ele será salvo no formato padrão oficial, conforme apresentado na
Figura 24.
Os arquivos de treinamento e validação foram criados manualmente, seguindo as regras
especificadas neste documento, na seção 3.4. O arquivo de treinamento possui novecentos e onze
(911) padrões de entrada, enquanto o arquivo de validação possui duzentos (200) padrões de
entrada. Cada arquivo foi verificado oito (8) vezes, em dias distintos, sempre observando as regras
citadas na seção 3.4.
4.1.2 Instalação e Detalhamento da Ferramenta JavaNNS
Para iniciar a utilização do ambiente JavaNNS, basta descompactá-lo em qualquer diretório,
a ferramenta pode ser executada digitando a seguinte linha de comando no command prompt:
“java -jar JavaNNS.jar” ou clicando duas vezes no arquivo JavaNNS.jar.
O JavaNNS utiliza as seguintes extensões para seus arquivos:
4.1.2.1
·
.net
arquivos de rede (unidades e ligações);
·
.pat
arquivos de padrões;
·
.cfg
arquivo de configurações;
·
.txt
arquivos de texto (log files); e
·
.res
arquivos de resultados (ativações de unidades).
Criando a Rede Neural Artificial
Já com o ambiente JavaNNS sendo executado, escolha o menu Tools, a opção Create,
depois a opção Layers, como visto na Figura 32:
56
Figura 32. Criando camadas para a RNA no JavaNNS.
O ambiente apresenta uma caixa de diálogo para a criação das camadas, como demonstra a
Figura 33. Nesta caixa as seguintes informações são solicitadas:
·
Width: o número de neurônios a serem criados na posição horizontal;
·
Height: o número de neurônios a serem criados na posição vertical;
·
Top left position: posição inicial na qual devem ser criados os neurônios;
·
Unit type: define o tipo de neurônio a ser criado, pode-se escolher entre a camada de
entrada, a camada oculta, a camada de saída, entre outras;
·
Activation function: define qual será a função de ativação a ser utilizada.
·
Output function: define qual será a função de saída a ser utilizada.
·
Layer number: número da camada a ser criada; e
·
Subnet number: número da rede interna a ser criada.
57
Figura 33. Caixa de dialogo para a criação das camadas.
Após a criação das camadas da RNA, devem ser criadas as conexões entre as camadas. Para
tal, escolha o menu Tools, a opção Create, depois a opção Connections, como pode ser visualizado
na Figura 34.
Figura 34. Criando conexões entre as camadas de neurônios.
O ambiente apresenta uma caixa para definição quanto ao tipo de conexões a serem criadas,
apresentada na Figura 35, na qual são apresentadas as seguintes opções:
·
Connect selected units: permite selecionar os neurônios desejados e criar as conexões
manualmente;
·
Connect feed-forward: cria conexões feed-forward; e
58
·
Auto-associative: cria conexões auto associativas.
Figura 35. Caixa de definição quanto ao tipo de conexões a serem criadas.
Na Figura 36 é apresentada uma RNA criada no ambiente JavaNNS, mas ainda não treinada.
Figura 36. RNA criada no ambiente JavaNNS.
4.1.2.2
Manipulando a Rede Neural Artificial
Após criada a RNA, deve-se inicializar, treinar, manipular entradas e validar a mesma, para
executar essas tarefas, deve-se abrir o “Painel de Controle”. Para isso, escolha no menu Tools a
opção Control Panel, como visto na Figura 37.
59
Figura 37. Abrindo o Painel de Controle.
Será exibida a caixa de diálogo do “Painel de Controle”, que contém as seguintes abas:
1) Initializing: inicia os pesos da RNA. A função de inicialização deve ser escolhida em
Initializing function, feito isso basta definir os parâmetros da função escolhida. Podese inicializar a RNA nessa aba clicando no botão Init.
2) Updating: define a função de atualização. A função deve ser escolhida em Updating
function, feito isso basta definir os parâmetros da função escolhida.
3) Learning: define as opções para a aprendizagem da rede. A função de aprendizado
deve ser escolhida em Learning function, feito isso, basta definir os parâmetros da
função escolhida. Nessa aba há três (3) botões:
·
Init: que inicializa a rede da mesma forma que ocorre na aba Initializing;
·
Learn Current: se selecionado, a rede é treinada utilizando apenas uma
entrada do arquivo de padrões; e
·
Learn All: que inicia o treinamento da rede utilizando todas as entradas
contidas no arquivo de padrões.
Existem ainda dois campos, são eles:
·
Cicles: que especifica o número de ciclos de aprendizagem; e
·
Steps: que especifica o número de passos de atualização da rede. Em redes
comuns (topological order, por exemplo), um passo é suficiente. Em redes
recursivas, ou com outros modos de atualização, mais de um passo pode ser
necessário.
60
Por último há o checkbox Shuffle que caso esteja desmarcado, os padrões serão
lidos do arquivo ordenadamente, e caso esteja marcado, os mesmos padrões serão
lidos do arquivo aleatoriamente.
4) Pruning: define as opções de poda para a RNA. O método de poda deve ser definido
em Method, feito isso deve-se definir os parâmetros do método escolhido e então
clicar no botão Prune.
5) Patterns: define os conjuntos ou arquivos de entrada e saída da RNA, trata-se dos
arquivos de treinamento e validação. A função de re-mapeamento deve ser definida
em Remapping function, feito isso deve-se definir os parâmetros da função escolhida.
Em Training set escolha o arquivo de treinamento a ser utilizado pela RNA e em
Validation set defina o arquivo a ser utilizado pela RNA para validação. Para
carregar os arquivos no ambiente escolha o menu File e a opção Open, em seguida
selecione os arquivos, que devem possuir a extensão .pat e carregue-os no sistema.
6) Subpatterns: apresenta o parâmetros referentes aos subconjuntos de entrada e saída,
quando utilizados.
Figura 38. Painel de Controle do JavaNNS.
4.1.3 As Redes Neurais Artificiais Criadas no JavaNNS.
Nesta seção serão apresentadas as RNAs criadas no ambiente JavaNNS. São apresentados
quatro (4) RNAs, os respectivos dados e resultados apresentados por elas no ambiente JavaNNS.
61
4.1.3.1
Primeira RNA apresentada – GSC200901-A
A primeira RNA apresentada nesse documento, denominada GSC200901-A, definida assim
para uma melhor organização deste documento, foi criada com as seguintes especificações:
·
Camada de Entrada (Input): contém três (3) neurônios ativados pela função de
ativação Act Identity e utilizando a função de saída Out Identity.
·
Camada Oculta (Hidden): contém uma (1) camada composta por vinte e sete (27)
neurônios ativados pela função de ativação Act Logistic e utilizando a função de
saída Out Identity.
·
Camada de Saída (Output): contém oito (8) neurônios ativados pela função de
ativação Act Logistic e utilizando a função de saída Out Identity.
·
Conexões: feed-forward.
·
Inicialização: inicializada com valores entre 0 e 1, utilizando a função de
inicialização Random Weights.
·
Função de Atualização: topological order.
·
Função de Aprendizado: backpropagation, com taxa de aprendizado (η) de 0.2 e erro
acumulado (dmax) de 0.1.
·
Ciclos: 20000 SSE.
·
Passos: 1
·
Função de Re-mapeamento: não foi utilizada.
·
Arquivo de Padrões de Treinamento: training.pat com 911 padrões de entrada.
·
Arquivo de Padrões de Validação: validation.pat com 200 padrões de entrada.
A Figura 39 apresenta a RNA após o treinamento e validação no ambiente JavaNNS.
62
Figura 39. RNA GSC200901-A Treinada.
Figura 40. Arquivo log de Treinamento e Validação da RNA GSC200901-A.
63
A Figura 40 apresenta os resultados do treinamento e validação realizados no JavaNNS
enquanto a Figura 41 nos apresenta o gráfico de erro (∑e2).
Figura 41. Gráfico de erro (∑e2) e validação da RNA GSC200901-A.
4.1.3.2
Segunda RNA Apresentada – GSC200901-B
A segunda RNA apresentada nesse documento, a GSC200901-B possui basicamente a
mesma configuração da rede GSC200901-A, exceto pela quantidade de neurônios na camada oculta
e pelo total de ciclos realizados:
·
Camada de Entrada (Imput): contém três (3) neurônios ativados pela função de
ativação Act Identity e utilizando a função de saída Out Identity.
·
Camada Oculta (Hidden): contém uma (1) camada composta por dezessete (17)
neurônios ativados pela função de ativação Act Logistic e utilizando a função de
saída Out Identity.
·
Camada de Saída (Output): contém oito (8) neurônios ativados pela função de
ativação Act Logistic e utilizando a função de saída Out Identity.
·
Conexões: feed-forward.
·
Inicialização: inicializada com valores entre 0 e 1, utilizando a função de
inicialização Random Weights.
·
Função de Atualização: topological order.
·
Função de Aprendizado: backpropagation, com taxa de aprendizado (η) de 0.2 e erro
acumulado (dmax) de 0.1.
64
·
Ciclos: 30000 SSE.
·
Passos: 1
·
Função de Re-mapeamento: não foi utilizada.
·
Arquivo de Padrões de Treinamento: training.pat com 911 padrões de entrada.
·
Arquivo de Padrões de Validação: validation.pat com 200 padrões de entrada.
Embora essa RNA possua menos neurônios na camada oculta, ela apresentou melhores
resultados de validação que a rede anterior, a GSC200901-B. A Figura 42 apresenta a arquitetura da
RNA, a Figura 43 apresenta os resultados do treinamento e validação e a Figura 44 apresenta o
gráfico de erro (∑e2).
Figura 42. RNA GSC200901-B Treinada.
65
Figura 43. Arquivo log de Treinamento e Validação da RNA GSC200901-B.
Figura 44. Gráfico de erro (∑e2) e validação da RNA GSC200901-B.
4.1.3.3
Terceira RNA Apresentada – GSC200901-C
A terceira RNA apresentada nesse documento, a GSC200901-C é uma RNA com duas
camadas ocultas e uma quantidade reduzida de neurônios em cada uma delas.
66
·
Camada de Entrada (Imput): contém três (3) neurônios ativados pela função de
ativação Act Identity e utilizando a função de saída Out Identity.
·
Camada Oculta (Hidden): contém duas (2) camadas ocultas, cada uma com dez (10)
neurônios ativados pela função de ativação Act Logistic e utilizando a função de
saída Out Identity.
·
Camada de Saída (Output): contém oito (8) neurônios ativados pela função de
ativação Act Logistic e utilizando a função de saída Out Identity.
·
Conexões: feed-forward.
·
Inicialização: inicializada com valores entre 0 e 1, utilizando a função de
inicialização Random Weights.
·
Função de Atualização: topological order.
·
Função de Aprendizado: backpropagation, com taxa de aprendizado (η) de 0.2 e erro
acumulado (dmax) de 0.1.
·
Ciclos: 50000 SSE.
·
Passos: 1
·
Função de Re-mapeamento: não foi utilizada.
·
Arquivo de Padrões de Treinamento: training.pat com 911 padrões de entrada.
·
Arquivo de Padrões de Validação: validation.pat com 200 padrões de entrada.
Figura 45. RNA GSC200901-C Treinada.
67
A RNA GSC200901-C, utilizando o método de parada padrão do ambiente JavaNNS,
apresentou problemas de aprendizado, o método mais indicado para o treinamento dessa rede seria
o método conhecido como validação cruzada, porém o JavaNNS não trabalha com esse método. A
arquitetura da RNA é apresentada na Figura 45, os resultados do treinamento e validação realizados
no JavaNNS são apresentados na Figura 46 enquanto a Figura 47 apresenta o gráfico de erro (∑e2).
Figura 46. Arquivo log de Treinamento e Validação da RNA GSC200901-C.
68
É possível perceber que a validação está ocorrendo inversamente ao treinamento, para essa
rede o mais indicado seria utilizar o método de validação cruzada, a fim de interromper o
treinamento. Considerando o arquivo de log apresentado na Figura 46, é provável que o método
interrompe-se o treinamento da RNA GSC200901-C no passo 5000. Na Figura 47 é possível
confirmar a situação da RNA em seu gráfico de erro (∑e2).
Figura 47. Gráfico de erro (∑e2) e validação da RNA GSC200901-C.
Como pode ser visualizado no gráfico de erro, embora a RNA apresente uma diminuição no
erro quanto ao treinamento, a validação não acompanha a queda, pelo contrário, segue em caminho
inverso, há ainda certa instabilidade no gráfico de erro, picos durante o treinamento, é uma situação
ideal para o uso da técnica de validação cruzada.
Este método consiste em uma técnica estatística, para validar o modelo obtido durante o
treinamento da rede, utilizando um conjunto de dados diferentes dos usados, para estimar os
parâmetros durante o treinamento (HAYKIN, 2001). O método consiste em acompanhar a evolução
do aprendizado nas curvas correspondentes aos subconjuntos de dados de treinamento e de
69
validação. Deste modo, o treinamento é interrompido, quando a curva de validação decresce a um
erro mínimo, e antes de começar a crescer, conforme o treinamento continua. (MÓDULO DE
VALIDAÇÃO CRUZADA PARA TREINAMENTO DE REDES NEURAIS ARTIFICIAIS COM
ALGORITMOS BACKPROPAGATION E RESILIENT PROPAGATION, 2007)
4.1.3.4
Quarta RNA Apresentada – GSC200901-D
A quarta RNA apresentada nesse documento, a GSC200901-D é uma RNA com duas
camadas ocultas e uma quantidade maior de neurônios em cada uma delas.
·
Camada de Entrada (Imput): contém três (3) neurônios ativados pela função de
ativação Act Identity e utilizando a função de saída Out Identity.
·
Camada Oculta (Hidden): contém duas (2) camadas ocultas, cada uma com vinte e
sete (27) neurônios ativados pela função de ativação Act Logistic e utilizando a
função de saída Out Identity.
·
Camada de Saída (Output): contém oito (8) neurônios ativados pela função de
ativação Act Logistic e utilizando a função de saída Out Identity.
·
Conexões: feed-forward.
·
Inicialização: inicializada com valores entre 0 e 1, utilizando a função de
inicialização Random Weights.
·
Função de Atualização: topological order.
·
Função de Aprendizado: backpropagation, com taxa de aprendizado (η) de 0.2 e erro
acumulado (dmax) de 0.1.
·
Ciclos: 20000 SSE.
·
Passos: 1
·
Função de Re-mapeamento: não foi utilizada.
·
Arquivo de Padrões de Treinamento: training.pat com 911 padrões de entrada.
·
Arquivo de Padrões de Validação: validation.pat com 200 padrões de entrada.
Essa RNA apresentou a maior diferença entre o erro apresentado pelo treinamento e a taxa
apresentada na validação. A Figura 48 apresenta a arquitetura da RNA GSC200901-D, a Figura 49
apresenta os resultados obtidos no arquivo de log e a Figura 50 apresenta o gráfico de erro (∑e2) da
RNA.
70
Figura 48. RNA GSC200901-D Treinada.
Figura 49. Arquivo log de Treinamento e Validação da RNA GSC200901-D.
71
Figura 50. Gráfico de erro (∑e2) e validação da RNA GSC200901-D
4.1.4 Convertendo o Arquivo da RNA para a Linguagem C
Ao utilizar o ambiente JavaNNS para a criação e manipulação de RNAs, tem-se a opção de
salvar diversos arquivos relacionados com a rede então manipulada, conforme já mencionado na
seção 3.2.3, uma das extensões criadas pelo ambiente são os arquivos net, que são os responsáveis
por armazenar a topologia da RNA, suas unidades e ligações. Por ser uma ferramenta derivada do
SNNS 4.2, os arquivos gerados pelo JavaNNS são idênticos aos arquivos gerados pelo SNNS, por
essa razão, pode-se utilizar os aplicativos que acompanham o SNNS para manipular arquivos
gerados no JavaNNS. Um destes aplicativos chama-se snns2c.exe, e sua função é converter o
arquivo contendo os padrões de rede gerados pelo SNNS ou JavaNNS para arquivos fonte em
linguagem de programação C, como demonstrado na Figura 51.
Figura 51. Convertendo a Rede para a Linguagem C com o snns2c.exe
72
A sintaxe e utilização deste aplicativo é extremamente simples, e resume-se a uma única
linha de comando, bastando digitar no prompt de comando a linha de código apresentada na Figura
52:
snns2c.exe <arquivo-da-rna.net> <nome-da-função.c>
Figura 52. Comando de utilização do snns2c.exe.
O arquivo em linguagem c criado contém a RNA pura, com seus pesos e treinada, o código
não possui os trechos referentes ao treinamento, pois os mesmos não são mais necessários, já que a
rede já foi treinada pelo JavaNNS. Esse arquivo gerado pode ser usado em um aplicativo ou mesmo
em uma dll. Na Figura 53 é possível visualizar um trecho do arquivo da RNA gerado pelo
JavaNNS, enquanto na Figura 54 encontra-se um trecho do arquivo gerado em linguagem C.
73
Figura 53. Trecho do arquivo de rede gerado pelo JavaNNS.
Figura 54. Trecho do arquivo em linguagem C gerado pelo snns2c.exe.
4.1.5 Analisando o Arquivo de Resultado da RNA.
Outro aplicativo disponibilizado pelo SNNS e utilizado neste projeto denomina-se
analyse.exe, esse aplicativo analisa o arquivo de resultados criado pelo JavaNNS após o término do
treinamento da RNA. O arquivo de resultados a ser analisado pelo aplicativo deve possuir os
padrões de treinamento e as saídas da RNA. A sintaxe desse aplicativo é apresentado na Figura 55:
analyse [-opções]
Figura 55. Comando de utilização do analyse.
É possível optar entre os vários parâmetros em qualquer ordem:
·
-w
é impresso o número dos padrões classificados como corretos;
74
·
-r
é impresso o número dos padrões classificados como errados;
·
-u
é impresso o número dos padrões não classificados;
·
-a
o mesmo que -w -r -u;
·
-v
cada número impresso é precedido por uma das seguintes palavras: “correto”,
“errado” ou “não classificado”, dependendo do resultado de sua classificação;
·
-s
informações estáticas quanto aos padrões “correto”, “errado” e “não
classificado”;
·
-c
o mesmo que -s, mas são demonstradas estatísticas para cada unidade de
saída;
·
-i
nome do “arquivo de resultado” que será analisado (-i <arquivo de entrada>);
·
-o
nome do arquivo que será criado pelo analyzer (-o <arquivo de saída>);
·
-e
define o nome da função de análise (-e <função>);
·
-l
primeiro parâmetro da função de análise (-l <float>); e
·
-h
segundo parâmetro da função de análise (-h <float>).
Esse aplicativo foi utilizado para obter informações com maior precisão quanto ao resultado
do treinamento das RNAs apresentadas neste projeto. Na Figura 56 é apresentado um trecho do
arquivo de resultado da rede GSC200901-B, e na Figura 57 o resultado da linha de comando
responsável pelas informações estatísticas referentes ao arquivo de resultados dessa mesma rede.
Figura 56. Trecho do Arquivo de Resultados da RNA GSC200901-B.
75
Figura 57. Utilização do aplicativo analyzer.
A utilização deste aplicativo retornou que a rede GSC200901-B respondeu corretamente a
901 padrões (98,90 %) e incorretamente a 10 padrões (1,10 %), resultados que ainda segundo o
aplicativo, representa um erro de 11,604062. Lembrando que foram utilizados os padrões de
treinamento nessa demonstração.
4.1.6 Comparando as RNAs apresentadas.
O aplicativo analyser foi utilizado para comparar as quatro RNAs apresentadas neste
projeto, como pode ser verificado na Tabela 7 (arquivos de resultados de treinamento) e na Tabela 8
(arquivos de resultados de validação).
RNA
Total de
Padrões
A
B
C
D
911
911
911
911
Padrões
Reconhecidos
Corretos Incorretos
902
1
901
1
905
0
904
0
Padrões Ñ
Reconhecidos
% de
Acertos
8
9
6
7
99,01
98,90
99,34
99,23
Erro da RNA
No
Treinamento
10,712665
11,604062
8,208152
7,444362
Tabela 7. Resultados obtidos pelo Analyzer quanto ao Treinamento da RNA.
RNA
Total de
Padrões
A
B
C
D
200
200
200
200
Padrões
Reconhecidos
Corretos Incorretos
182
3
185
4
185
10
186
7
Padrões Ñ
Reconhecidos
% de
Acertos
15
11
5
7
91,00
92,50
92,50
93,00
Tabela 8. Resultados obtidos pelo Analyzer quanto a Validação da RNA.
76
Erro da RNA
Na
Validação
17,447292
16,745084
24,464050
21,461576
A utilização desse aplicativo nos permite obter informações estatísticas mais precisas quanto
ao treinamento e a validação de redes neurais artificiais criadas no ambiente JavaNNS, permitindo
que seja possível a escolha da RNA considerando dados consideravelmente detalhados, como por
exemplo a quantidade de padrões reconhecidos incorretamente ou a quantidade de padrões não
reconhecidos pela rede, destacando que não se trata da mesma informação e que possuem pesos
diferentes quanto ao cálculo do erro da RNA.
Ao observar os dados da Tabela 7, pode-se observar que a RNA que apresentou o melhor
resultado foi à rede GSC200901-D, pois além de apresentar a maior porcentagem de acertos,
também apresentou o menor erro. Todavia esses dados são referentes apenas ao treinamento e, ao se
analisar a Tabela 8, responsável pelos dados de validação, constata-se que a melhor opção é a rede
GSC200901-B, pois apresenta uma porcentagem de acertos semelhante à rede GSC200901-D, mas
com um erro consideravelmente menor.
4.1.7 Utilizando a RNA em um aplicativo.
Na seção 4.1.4, com a utilização do aplicativo snns2c.exe foi gerado o código fonte da RNA
GSC200901-B em linguagem C. Nesta seção será demonstrado o funcionamento da RNA através da
utilização do código gerado em um aplicativo construído para utilizar esse mesmo código. O
software desenvolvido lê um arquivo texto contendo os padrões de entrada (entrada.txt), envia esses
padrões à rede neural, que os analisa e retorna os padrões de saída, esses padrões são gravados pelo
aplicativo em outro arquivo de texto (saida.txt). A Figura 58 apresenta o trecho do código referente
ao programa principal.
O arquivo de entrada apresentado ao programa possui os 200 padrões de entrada utilizados
no processo de validação da RNA, esse experimento tem como objetivo detalhar os padrões de
saída gerados pela RNA e verificar a natureza quanto aos erros gerados pela rede (Apêndice K). A
Figura 59 demonstra o formato do arquivo de entrada do aplicativo e a Figura 60 nos permite
visualizar o formato do arquivo de saída gerado pelo aplicativo.
O aplicativo funcionou como esperado, após a execução do mesmo e análise dos resultados,
foram encontradas situações interessantes em alguns resultados da RNA. A análise detalhada dos
padrões de entrada retornou que a rede acertou precisamente 184 padrões, restando 16 padrões que,
embora não possam todos serem considerados acertos precisos, também não podem ser
considerados erros completos.
77
Figura 58. Trecho do código em linguagem C referente ao programa principal.
Figura 59. Formato do arquivo de entrada.
Figura 60. Formato do arquivo de saída.
78
Desses 16 padrões, 02 sugerem duas direções opostas, mas não problemáticas, por exemplo,
ao invés de sugerir o ângulo de 30 graus, a rede sugeriu os ângulos de 30 e 330 graus ao mesmo
tempo (0 1 0 0 0 0 0 1), todavia analisando a entrada (0.02 0.18 0.06), percebeu-se que a saída
gerada não causaria problema ao veículo, visto que ambas as direções são viáveis. Outros 03
padrões também apresentaram duas sugestões, mas ambas na mesma direção, porém nesse caso
percebeu-se que esse fato pode ter ocorrido por se tratar de situações que embora se enquadrem nas
regras gerais, deveriam atender a regras específicas, por exemplo, ao invés da rede sugerir o ângulo
de 90 graus, considerando a regra específica, foi sugerido o ângulo de 30 (regra padrão) e 90 (regra
específica) graus simultaneamente (0 1 1 0 0 0 0 0), e verificando os padrões de entrada (0.93 0.9
0.81) percebe-se que mesmo que o veiculo desloque-se em um ângulo de 30 e não 90 graus, como
seria o “correto”, ainda é possível permanecer na rota certa. Ocorreram ainda 03 casos nos quais os
padrões de saída novamente sugeriram duas direções, mas nesses casos uma das sugestões era
correta, e a outra sugestão embora incorreta não apresentava risco eminente ao robô. Por exemplo,
analisando o padrão de entrada 0.62, 0.21, e 0.20, levando em conta as regras da RNA, a rede
deveria sugerir o padrão 1 0 0 0 0 0 0 0 (0 grau), mas é sugerido o padrão 1 1 0 0 0 0 0 0 (0 e 30
graus), porém considerando os padrões de entrada, o robô continuará seu deslocamento
normalmente sem correr nenhum risco. Dos 16 padrões que a RNA não considerou corretos, os 08
padrões apresentados e explicados acima poderiam ainda ser corrigidos através da utilização de
regras no controlador que receberá os sinais da RNA.
Ainda restam 8 padrões a serem analisados e explicados, desses 08 padrões, 01 sugeriu um
ângulo menor do que o esperado, ou seja, foi apresentado um padrão de entrada (0.91 0.73 0.02), e a
rede neural retornou um padrão de saída (0 1 0 0 0 0 0 0) trinta graus menor que o padrão esperado
(0 0 1 0 0 0 0 0), nesse caso especificamente, não há perigo eminente ao robô. Ocorreram ainda 02
padrões de entrada que retornaram padrões de saída errados. Um exemplo é um padrão de entrada
(0.91 0.02 0.59) no qual a rede sugeriu um padrão de saída referente a 30 graus(1 0 0 0 0 0 0 0),
quando na verdade a sugestão correta seria de 90 graus (0 0 1 0 0 0 0 0). Os últimos 05 padrões
apresentados não foram reconhecidos pela rede, sendo que a mesma retornou para todos eles um
padrão de saída “vazio” (0 0 0 0 0 0 0 0). Ao considerarmos que dos 16 padrões não reconhecidos
como padrões esperados, 08 podem ser considerados padrões não mapeados, mas capazes de gerar
sugestões de direção corretas, temos um total de 192 padrões reconhecidos corretamente, o que
representa um acerto de 96%, um ótimo resultado para uma RNA. Para isso, basta que sejam
mapeadas no controlador combinações entre os oito padrões de saída.
79
4.2 Dynamic Link Library – DLL.
Após o desenvolvimento da rede neural artificial através do ambiente JavaNNS e finalizado
os testes com a mesma no software desenvolvido em C que utilizou o fonte gerado no aplicativo
snns2c.exe, foi dado inicio à próxima fase do projeto, que consistiu na criação de bibliotecas
utilizando o fonte gerado pelo aplicativo snns2c.exe.
O objetivo da criação de bibliotecas de ligação dinâmica é a sua utilização através do JNA –
seção 4.4.1 – no ambiente Simbad 3D. Essa biblioteca contém a rede neural artificial, ela receberá
os parâmetros de entrada referentes aos três (3) sensores de entrada, e retornará os valores referentes
aos oito (8) sensores de saída, que representam as oito (8) direções possíveis a serem tomadas pelo
veículo.
Detalhes quanto ao funcionamento de Bibliotecas de Link Dinâmico são apresentadas no
Apêndice A, o Apêndice B descreve o procedimento para a criação dessas bibliotecas utilizando o
software Embarcadero C++ Builder 2010, o Apêndice C descreve o desenvolvimento da mesma
biblioteca, mas utilizando outro software, o Bloodshed Dev-C++ 4. No Apêndice D é apresentado
como é carregada uma biblioteca estaticamente. Por fim, no Apêndice E é descrito como uma
biblioteca é carregada dinamicamente.
O desenvolvimento correto dessa biblioteca é essencial para o correto funcionamento do
veículo, pois ela contém a rede neural artificial e a descrição do método a ser chamado para o
funcionamento da mesma. Convertendo a rede neural em uma biblioteca de ligação dinâmica é
possível utilizá-la por diversas aplicações, e por meio das ferramentas utilizadas neste projeto, esse
procedimento tornou-se simples e rápido.
4.2.1 Verificando o cabeçalho das DLLs criadas
Foi concluído o desenvolvimento de duas dlls contendo o código gerado pelo software
“snns2c.exe”, agora será utilizado o software freeware “DLL Export Viewer”, que pode ser
adquirido no site http://www.nirsoft.net/utils/dll_export_viewer.html , esse aplicativo nos apresenta
uma lista contendo todas as funções de saída e os respectivos endereços de memória contidos em
uma ou em um grupos de bibliotecas pré selecionado. O software não possui instalador, bastando
descompactá-lo para iniciar sua utilização, após descompactado, executou-se o arquivo “dllexp.exe”
e selecionou-se a dll “PRNA.DLL”, o resultado é apresentado na Figura 61, o mesmo procedimento
foi aplicado ao arquivo “PDRNA.DLL”, cujo resultado obtido é apresentado na Figura 62:
80
Figura 61. Visualização das funções contidas no arquivo PRNA.DLL.
Fonte: DLL Export Viewer.
Figura 62. Visualização das funções contidas no arquivo PDRNA.DLL.
Fonte: DLL Export Viewer.
Em ambos os arquivos é possível constatar a existência da função rede, conforme definida
no momento da criação de ambas as dlls, pode-se então utilizar as dlls em outras aplicações
chamando-as através da função interna rede( ).
4.2.2 Validando as DLLs desenvolvidas
Com ambas as dlls criadas, deve-se criar um software capaz de utililazá-las, foi
desenvolvida uma aplicação em linguagem C que utiliza a dll a fim de gerar o mesmo resultado
obtido através do software desenvolvido na seção 4.1.7. O objetivo desse software é validar o
funcionamento das dlls desenvolvidas. A dll foi carregada utilizando tanto o método estático quanto
o método dinâmico, a implementação de ambas está detalhado no Apêndice D e no Apêndice E,
respectivamente.
81
4.3 Definição do Ambiente de Simulação do Robô.
Para definir qual seria o ambiente a ser utilizado neste projeto para realizar a fase de
virtualização da RNA, foi realizada uma pesquisa, na qual foram analisados um total de seis (6)
ambientes de simulação, sendo que os três (3) de maior destaque foram o Simbad 3D, o Khepera
Simulator e o Robocode, já mencionados e apresentados na seção 2.8 deste documento. Os demais
ambientes testados foram os seguintes:
·
Webots: trata-se de um ambiente de desenvolvimento usado para modelar, programar
e simular robôs móveis. Com o Webots o usuário pode projetar complexos sistemas
robóticos, com um ou vários robôs, iguais ou diferentes, em um ambiente
compartilhado. As propriedades de cada objeto, como forma, cor, textura, massa,
fricção, etc., é escolhido pelo usuário. Várias opções de sensores simulados e
atuadores estão disponíveis para equipar cada robô. Os controladores do robô podem
ser programados com o IDE embutido ou com ambientes de desenvolvimento de
terceiros. O comportamento de robô pode ser testado em mundos fisicamente
realísticos. Os programas de controle podem ser transferidos opcionalmente a robôs
reais comercialmente disponíveis. Está disponível em: http://www.cyberbotics.com/.
·
Microsoft Robotics Developer Studio 2008 (RDS): trata-se de um ambiente baseado
no Windows para desenvolvedores, acadêmicos e fomentadores comerciais criarem
aplicações robóticas para uma variedade de plataformas de hardware. O RDS inclui
um ambiente limpo e leve, rotinas orientadas a serviço, um cenário de criação visual
e ferramentas de simulação, como também tutoriais e códigos exemplos para auxiliar
o início do uso do ambiente. Está disponível em: http://msdn.microsoft.com/enus/robotics/default.aspx.
·
Simulator Bob: trata-se de um ambiente de simulação 3D de código aberto projetado
para - mas não apenas - a simulação de robôs móveis. Ele usa a biblioteca ODE para
simular as dinâmicas de corpos rígidos e a biblioteca OpenSceneGraph para a
visualização em 3D. O GUI é percebido usando MFC e, assim, o software é limitado
para plataformas Win32. Ele é escrito inteiramente em C++ e compilado com o
Microsoft Visual Studio 7.1. A característica fundamental desta aplicação é a
simplicidade. Pode-se facilmente instalá-lo e executar várias simulações existentes.
Está disponível em: http://simbob.sourceforge.net/.
82
Embora todos os seis (6) ambientes apresentem-se como ótimas opções para a simulação de
robôs, a escolha baseou-se na independência da linguagem (multiplataforma), na disponibilidade do
código fonte do ambiente e no reconhecimento da ferramenta no meio acadêmico. Após análise
desses três (3) fatores, optou-se pela ferramenta denominada Simbad 3D, conforme tabela 9.
Ambiente
Simbad 3D
Robocode
Khepera
Webots
RDS
Simulator Bob
Multiplataforma
(1 a 3)
3
3
2
1
1
1
Código Aberto Atualizado Reconhecimento Acadêmico Total
(1 a 3)
(1 a 3)
8
3
2
7
3
1
5
2
1
5
1
3
4
1
2
3
1
1
Tabela 9. Análise e Pontuação dos Ambientes de Virtualização de Robôs.
4.3.1 A Biblioteca JNA.
O projeto JNA – Java Native Access é uma implementação da JNI (Java Native Interface)
mas sem a necessidade de se preocupar e conhecer detalhes do código nativo que se pretende
chamar. Uma definição mais clara segundo o próprio projeto seria:
“JNA fornece acesso fácil a bibliotecas compartilhas nativas sem a necessidade da
utilização da JNI, o acesso é dinâmico em tempo de execução não necessitando a
geração de código adicional (.h). JNA permite acessar funções nativas usando
métodos naturais do JAVA, a maioria das chamadas não necessitam de tratamento
especial ou configuração, o JNA utiliza uma pequena biblioteca para
dinamicamente invocar o código nativo, a aplicação JAVA utiliza uma interface
para descrever as funções e estruturas da biblioteca nativa, isto facilita a utilização
das funcionalidades nativas da plataforma que se está executando o aplicativo.”
(JAVA.NET, 2009).
Mesmo utilizando a JNA, teve-se sempre ter o cuidado de controlar o acesso nativo através
de thread´s. Utilize alguma ferramenta de monitoramento de CPU, para verificar se as chamadas aos
códigos nativos não estão utilizando recursos excessivos do sistema, podendo causar instabilidade
ou até parada no sistema, lembrando que os testes devem ser feitos em todos os sistemas
operacionais que a aplicação for rodar (JAVADESK, 2009).
Com JNA pode-se escrever um código limpo e simples em java, sem que seja necessário
detalhar em seu código java a biblioteca nativa a ser chamada. Tudo isso é realizado
automaticamente pelo JNA. Tudo o que é necessário é definir uma interface da biblioteca que é
utilizada e especificar os métodos dos quais se quer ter acesso, como pode ser visto na Figura 63
(NXT, 2009).
83
Figura 63. Exemplo de definição de uma interface utilizando JNA.
Fonte: (NXT, 2009).
Feita a interface com a biblioteca, basta chamá-la usando o código apresentado na Figura 64.
Kernel32 kernel32Instance = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
Figura 64. Exemplo de chamada de interface utilizando JNA.
Fonte: (NXT, 2009).
No projeto desenvolvido, primeiramente foi criado um arquivo java contendo a definição da
interface necessária para a utilização da biblioteca “PDRNA.DLL”, então esse arquivo foi salvo
como “interfacePrna.java” (o arquivo deve obrigatoriamente ter o mesmo nome da classe principal)
e incorporado ao pacote do ambiente Simbad 3D. O código completo do arquivo pode ser
visualizado na Figura 65.
Figura 65. Código do arquivo interfacePrna.java.
Fonte: Eclipse Platform - Version: 3.4.0 - Build id: I20080617-2000
Após terminada implementação do arquivo “interfacePrna.java”, basta utilizá-lo através do
código apresentado na Figura 66.
84
Figura 66. Chamada detalhada da interface interfacePrna.
Observe que a palavra “neural” apresentada na Figura 66 é como uma classe contendo todas
as funções da dll “PDRNA.DLL”, dessa forma, basta invocar as funções da dll através desta para
utilizá-las. Na Figura 67 é apresentado o trecho de código em que é invocada a função rede().
Figura 67. Invocando a função rede() através da interface “neural”.
Os códigos apresentados nas Figuras 65, 66 e 67 foram utilizados nesse projeto e
funcionaram corretamente.
4.3.2 Criação dos Mundos Virtuais e dos Robôs Virtuais.
Tendo como finalidade analisar o desempenho da rede neural artificial desenvolvida, foram
criados dois (02) mundos virtuais, cada um deles desenvolvido para testar aspectos específicos do
comportamento da RNA. Os mundos foram criados no ambiente virtual Simbad 3D, utilizando a
biblioteca java Vector 3D. O mundo virtual MarlosObstaculo é constituído por diversos obstáculos
e contendo um (1) robô, como pode ser visto na Figura 68, enquanto o mundo MarlosLaberinto é
composto por um labirinto contendo um robô, como pode ser visto na Figura 69.
85
Figura 68. Mundo virtual MarlosObstaculos.
Fonte: Simbad 3D.
Figura 69. Mundo virtual MarlosLaberinto.
Fonte: Simbad 3D.
86
Os códigos fontes completos correspondentes ao mundo virtual desenvolvido e as alterações
necessárias ao robô encontram-se disponíveis na seção de apêndices (MarlosObstaculo – Apêndice
M, MarlosLaberinto – Apêndice N ).
O robô desenvolvido é dotado de três (03) sensores do tipo sonar, posicionados em ângulos
de 0º, 90º e 270 º relativos ao centro do robô, e direcionados em um ângulo de 0º relativos ao
próprio sensor, como demonstrado na Figura 70.
Figura 70. Robô Virtual Simulado.
Fonte: Simbad 3D.
4.3.3 Chamada e Utilização da Biblioteca RNA.
O último teste para a rede neural artificial foi sua utilização em um ambiente virtual
desenvolvido para verificar seu desempenho. Durante os testes, a RNA comportou-se conforme o
esperado, permitindo que o robô se deslocasse de forma autônoma através do ambiente evitando os
obstáculos existentes no mesmo.
Para a utilização da biblioteca desenvolvida (PDRNA.DLL), basta primeiramente importar
para o projeto o pacote JNA e acrescentá-lo ao projeto, conforme demonstrado na Figura 71.
Figura 71. Importação do pacote JNA para utilização no ambiente virtual.
Fonte: Eclipse Platform - Version: 3.4.0 - Build id: I20080617-2000
Após essa importação inicial deve-se criar o arquivo de interface, conforme mencionado e
apresentado na Figura 65, em seguida deve-se acrescentar a chamada detalhada da interface criada,
87
como é demonstrado na Figura 66 e por fim invocar a função contida na interface criada, como
exemplificado na Figura 67.
Depois de realizados os procedimentos citados acima, foram desenvolvidas funções a fim de
tratar as entradas a serem enviadas a RNA, visto que as definições do ambiente virtual e seus
respectivos valores de varredura dos sonares não eram os mesmos daqueles apresentados à rede
neural através de seus padrões de treinamento e validação. Foram criados dois vetores de dados do
tipo float, um utilizado para passar os valores de entrada para a rede e outro para receber os valores
de saída da mesma.
Como os sonares do ambiente virtual operam com uma margem de valores mais ampla (de 0
a 3 aproximadamente) do que aquele utilizado pela RNA (de 0 a 1) foi implementado no ambiente
uma seqüência de verificação desses valores que no caso do mesmo ser maior que o máximo aceito
pela rede, esse valor é automaticamente substituído por 1. Também foi criada uma função a fim de
realizar uma inversão de valores, visto que para o ambiente virtual 0 representa a presença de
obstáculo imediatamente à frente e 1 a total ausência de obstáculo, enquanto a RNA trabalha com o
inverso dessa definição.
Também foi desenvolvido uma função que trata o retorno gerado pela RNA, com a
finalidade de converter os valores retornados para 0 ou 1, caso necessário. Por último foi
implementado um procedimento chamado de controlador que, baseado nos valores retornados pela
rede neural, envia os comando direcionais ao robô (direção e velocidade).
88
5 RESULTADOS
Neste trabalho foram apresentados o projeto e a implementação de uma rede neural artificial
para o deslocamento de um veículo autônomo capaz de se deslocar por uma superfície plana. Os
objetivos proposto por esse trabalho eram a criação de uma rede neural artificial capaz de guiar um
veículo sem a ajuda humana (autonomamente).
A primeira fase do projeto consistiu no desenvolvimento e criação de uma rede neural
artificial capaz de atingir o objetivo proposto com o menor número de neurônios possível, porém
sem prejudicar o desempenho da mesma. Foram usados 911 padrões de treinamento e 200 padrões
de validação. O aplicativo de análise estatística analyse.exe foi utilizado para analisar a
percentagem de acerto da rede neural após a validação, analisando os dados desse aplicativo
concluiu-se que a rede neural artificial atingiu uma percentagem de acerto de 92,50%, ainda sem a
utilização de um controlador.
A segunda fase do projeto consistiu no desenvolvimento de uma aplicação capaz de
incorporar o código fonte da rede neural artificial gerado pelo aplicativo snns2c.exe e utilizá-lo para
analisar um conjunto de padrões de entrada contidos em um arquivo de texto e, com base nessa
análise, gerar um arquivo contendo os padrões de saídas retornadas pela rede neural considerando o
respectivo padrão de entrada, executada a aplicação, foram analisadas os padrões de entrada e de
saída e, ao considerar-se a utilização de um controlador que receberia os padrões de saída da rede
neural, concluiu-se que o sistema apresentou uma taxa de acerto de 97%.
Com a primeira e a segunda fases concluídas, iniciou-se a terceira fase, que consistiu no
desenvolvimento de um biblioteca de ligação dinâmica, mais conhecida pela sigla em língua inglesa
dll – dynamic link-library – utilizando apenas o código fonte gerado pelo aplicativo snns2c.exe na
segunda fase. Para a criação desta biblioteca foram utilizados dois softwares, o Embarcadero RAD
Studio C++ Builder 2010 e o Bloodshed Dev C++ 4, ambos foram capazes de gerar a biblioteca de
forma correta. Em seguida foi desenvolvida uma aplicação capaz de utilizar a biblioteca gerada em
ambos os softwares de desenvolvimento (C++ Builder e Dev C++), em ambos os casos, a biblioteca
contendo a rede neural artificial funcionou de forma correta e, utilizando um controlador, manteve
uma taxa de acerto de 97%.
89
A quarta fase consistiu no desenvolvimento de dois mundos virtuais, desenvolvidos no
simulador de robôs Simbad 3D, desenvolvido em linguagem java. Essa foi à fase mais complexa do
projeto, primeiramente foram criados os mundos virtuais MarlosObstaculo e MarlosLaberinto, em
seguida foi necessário a utilização de uma biblioteca java externa, o JNA – Java Native Access –
que tem como finalidade permitir a utilização de qualquer biblioteca de ligação dinâmica externa,
utilizando-a como se a mesma fosse nativa da linguagem java. O JNA foi utilizado com sucesso na
chamada das bibliotecas de ligação dinâmicas criadas na terceira fase.
A Figura 72 apresenta o mundo MarlosObstaculo e o robô virtual, ainda inativo em sua
posição inicial, enquanto que na Figura 73 é apresentado o mesmo mundo virtual, mas com o robô
já em movimento, o traçado em cor preto representa o caminho percorrido pelo robô durante seis
(6) minutos de simulação.
Figura 72. Posição Inicial do Robô.
Figura 73. Trajetória e posição Final do Robô.
A Figura 74 apresenta o mundo MarlosLaberinto e o robô virtual, ainda inativo em sua
posição inicial, enquanto que na Figura 75 é apresentado o mesmo mundo virtual, mas com o robô
já em movimento, o traçado em cor preto representa o caminho percorrido pelo robô durante doze
(12) minutos de simulação.
90
Figura 74. Posição Inicial do Robô.
Figura 75. Trajetória e posição Final do Robô.
Em ambos os mundos virtuais o robô se comportou de maneira satisfatória.
Por fim, durante a realização deste projeto, devido à grande dificuldade no que diz respeito a
encontrar bons materiais de referência na fase de implementação, foi optado por transformar esse
documento em uma fonte de referência completa, no que diz respeito à implementação do mesmo,
por tal razão toda informação apresentada aqui contém um nível de detalhamento não encontrado na
maioria dos Trabalhos de Conclusão de Curso pesquisados, a intenção ao elaborar esse documento
foi compartilhar absolutamente toda a informação e conhecimento adquiridos durante o
desenvolvimento do mesmo.
91
6 DIFICULDADES
Muitas dificuldades surgiram durante o desenvolvimento desse projeto, a primeira delas tem
relação com os arquivos de padrões utilizados para o treinamento e validação da rede neural
artificial, a princípio foi planejado que esses padrões seriam obtidos através da simulação de um
ambiente composto por um mundo e um robô virtuais, o robô seria controlado pelo usuário através
de um joystick ou de um mouse, durante esse período os dados dos sonares seriam coletados e
armazenados em uma arquivo de texto, cada conjunto de padrões de entrada seria seguido por um
conjunto de padrões de saída, que seria coletado através do controlador direcional do robô virtual,
após este receber o comando do usuário, todavia essa etapa do projeto não foi concluída devido
principalmente à complexidade do ambiente de simulação Simbad 3D.
Esse fato levou ao desenvolvimento doa arquivos de padrões manualmente, o que
demonstrou ser uma tarefa demorada e maçante. Foram criados manualmente 911 padrões para
treinamento e 200 padrões para validação da rede neural artificial. Porém apenas após esses
arquivos de padrões terem sido revisados oito (8) vezes foram considerados prontos para utilização
nos processos de treinamento e validação da rede neural artificial, todavia um tempo considerável já
havia se passado.
Outro fator problemático durante o desenvolvimento deste projeto está relacionado com a
linguagem na qual o simulador escolhido foi desenvolvido, tendo sido criado utilizando a
linguagem de programação java, o Simbad 3D apresentava maior complexidade para importar uma
biblioteca de ligação dinâmica. Para resolver esse problema optou-se por utilizar a biblioteca JNA –
Java Native Access – que se apresentava como a forma mais simples e rápida de realizar essa
importação, todavia essa biblioteca acabou trazendo consigo outro problema, a falta de uma boa
documentação referente ao uso e manipulação da mesma, o que custou demasiado tempo até que,
por meio de tentativa e erro, se obteve o conhecimento necessário para utilizá-la corretamente.
A falta de uma boa documentação foi um problema recorrente durante todo o
desenvolvimento deste projeto, abrangendo desde a fase de análise de simuladores de robôs até o
desenvolvimento e uso de bibliotecas, fossem elas nativas ou não.
92
7 CONCLUSÃO
Como apresentado ao longo deste documento, e considerando os resultados obtidos durante
os testes no simulador, concluiu-se que o mesmo atendeu os objetivos propostos, pois convergiu
corretamente durante o treinamento e validação, além da mesma ter sido capaz de controlar o robô
no ambiente de simulação Simbad 3D de forma autônoma e segura, porém ficou claro que para um
melhor desempenho, seria necessário o acréscimo de dois (2) sensores de entrada,
o que
significaria mais dois (2) neurônios na camada de entrada, percebeu-se ainda que não fosse
necessárias oito (8) direções de saída, o que significa que a camada de saída da rede neural artificial
sofreria uma redução de dois (2) neurônios, pelo menos. Outro aspecto percebido foi o fato de que o
simulador não foi à melhor opção considerando o nível de refinamento apresentado pela rede neural
artificial, pois ele não foi capaz de atender a todos os comandos enviados pela RNA.
Ficou claro também que é essencial o desenvolvimento de um ambiente virtual já na
primeira fase do projeto, para que o mesmo seja utilizado para gerar, através de simulações, os
padrões de treinamento e validação a serem utilizados pela rede neural artificial, além de ser
utilizado posteriormente para demonstrar o funcionamento do protótipo virtual.
Todavia mesmo considerando as dificuldades encontradas, foram adquiridos conhecimentos
além daqueles esperados, como a existência de aplicativos como o snns2c.exe, que proporcionou
uma gama de possibilidade quanto à implementação da RNA e sua utilização em aplicativos de
forma simples e direta, o analyse, que permitiu a verificação referente aos padrões reconhecidos
corretamente, incorretamente e não reconhecidos pela RNA utilizando o arquivo de resultado
gerado pelo JavaNNS, o DLL Export Viewer, que permitiu verificar se a nomenclatura da função
interna da dll estava correta antes mesmo de testar a dll e vários outros, utilizados durante a
realização deste projeto.
7.1 Projetos Futuros.
Considerando as dificuldades encontradas durante o desenvolvimento deste projeto, algumas
sugestões de projetos futuros tornaram-se evidentes, a primeira delas é a implementação de uma
interface de controle no ambiente Simbad 3D, essa interface teria a finalidade de permitir que o
usuário controle o deslocamento de um robô em qualquer ambiente virtual desenvolvido no Simbad
3D através do mouse ou de um joystick padrão, essa implementação seria feita em java e faria parte
93
do próprio ambiente Simbad 3D, permanecendo disponível ao usuário que deseja utiliza-lá, nela o
robô seria controlado pelo usuário através de um joystick ou de um mouse, durante esse período os
dados dos sensores seriam coletados e armazenados em uma arquivo de texto, cada conjunto de
padrões de entrada seria seguido por um conjunto de padrões de saída, que seria coletado através do
controlador direcional do robô virtual, após este receber o comando do usuário, esses padrões de
saída poderiam ser em graus ou em alguma outra forma previamente pesquisada.
Outra sugestão seria o desenvolvimento de um simulador de robôs em linguagem C, para
isso, seria usado como base o simulador Khepera, esse simulador foi desenvolvido em linguagem C,
mas sua versão gratuita recebeu sua ultima atualização em 1997, quanto ganhou uma versão
proprietária conhecida como Webots. O Khepera não funciona hoje em dia devido ao fato de seu
fonte em C estar fora dos padrões ISO, o que o torna incompatível com os compiladores atuais, não
sendo possível compilá-lo e gera um executável.
Outro projeto interessante seria o desenvolvimento de uma rede neural mais complexa com
auxílio deste documento, pois seria mais produtivo e simples, visto que o mesmo apresenta um guia
completo no que diz respeito a um grande número de tecnologias necessárias.
A construção de um protótipo físico capaz de utilizar a rede neural artificial desenvolvida
neste trabalho também seria uma opção viável e instigante.
94
REFERÊNCIAS BIBLIOGRÁFICAS
BARONE, Dante Augusto Couto et al. Sociedades Artificiais: A Nova Fronteira da Inteligência
nas Máquinas. São Paulo: Artmed Editora S.A., 2003. 332 p.
BOTELHO, Silvia Silva da Costa. Desenvolvimento de Sistemas Inteligentes para controle de
robôs móveis. 1996. 124p. Dissertação (Mestrado em Ciências da Computação) – Instituto de
Informática, Universidade Federal do Rio Grande do Sul, Porto Alegre.
BRAGA, Antônio de Pádua; CARVALHO, André Ponce de Leon F.; LUDERMIR, Teresa
Bernarda. Redes Neurais Artificiais – Teoria e Prática. Rio de Janeiro. LTC, 2007. 226p.
CAZANGI, Renato Reder. Uma Proposta Evolutiva para Controle Inteligente em Navegação
Autônoma de Robôs. 2004. 148 f. Tese (Mestrado) - Curso de Engenharia de Computação,
Unicamp, Campinas, 2004.
DINIZ, M. V. C. . Dirigibilidade de mini-robôs com Redes Neurais Artificiais: uma experiência
acadêmica.. Cientefico, Faculdade Ruy Barbosa, v. 1, p. 117-121, 2006.
FERNANDES, Anita Maria da Rocha. Inteligência Artificial: noções gerais. Florianópolis:
Florianópolis, Visual Books, 2003. 159p.
GROOVER, Mikell P. et al. Robótica: Técnologia e Programação. São Paulo: Mcgraw-hill, 1989.
397 p.
GROOVER, Mikell P.; WEISS, Mitchell; NAGEL, Roger N. et al. Robótica: Tecnologia e
Programação. São Paulo: McGraw-Hill, 1998. 401p.
HAYKIN, Simon. Redes Neurais: Princípios e Prática. Porto Alegre, Bookman, 2001. 900p.
HEINEN, Farlei José. Sistema de Controle Híbrido para Robôs Móveis Autônomos. 2002. 130
f. Dissertação (Mestrado) - Universidade do Vale do Rio Dos Sinos, São Leopoldo, 2002.
HEINEM, Milton et al. Estacionamento de um Veículo de Forma Autônoma Utilizando Redes
Neurais Artificiais. In: III Encontro de Robótica Inteligente, 10., 2006, Campo Grande. Anais do
XXVI Congresso da SBC, Campo Grande: EnRI, 2006. p. 107-116.
HUGUES, Louis; BREDECHE, Nicolas. Simbad: na Autonomus Robot Simulation Package for
Education and Reserch. Paris: GINKGO – NETWORS, 2006. Disponivel em:
<http://www.lri.fr/~bredeche/MyBiblio/SAB2006simbad.pdf> Acesso em: 01 jun 2009.
HUGUES, Louis; BREDECHE, Nicolas. Simbad 3D Robot Simulator. Disponível em:
<http://simbad.sourceforge.net/>. Acesso em: 01 jun. 2009.
JARDIM, Rodrigo Urubatan Ferreira. Java Native Access (JNA). Disponível em:
<http://www.urubatan.com.br/chamando-metodos-nativos-dllso-em-java-sem-jni/>. Acesso em: 18
mar. 2009.
95
JAVADESK (Brasil). JNA – Java Native Access. Disponível em:
<http://www.javadesk.org/?p=123>. Acesso em: 02 mar. 2009.
JAVA.NET (Estados Unidos). JNA. Disponível em: <https://jna.dev.java.net/>. Acesso em: 22 fev.
2009.
LUDWIG JUNIOR, Oswaldo; MONTGOMERY, Eduard. Redes Neurais: Fundamentos e
Aplicações com Programas em C. Rio de Janeiro: Ciência Moderna, 2007. 125p.
MARRONE, Paolo. JOONE: Java Object Oriented Neural Engine. Disponível em:
<http://www.jooneworld.com/>. Acesso em: 01 jun. 2009.
MESSIAS A, Antonio Rogério. TRABALHANDO COM DLLs. Disponível em:
<http://zz2kzq.site90.com/CursoHtml/Modulo05/Modulo005Aula008.htm>. Acesso em: 18 ago.
2009.
MESSIAS B, Antonio Rogério. CRIANDO UMA DLL EM C++Builder. Disponível em:
<http://zz2kzq.site90.com/CursoHtml/Modulo05/Modulo005Aula009.htm>. Acesso em: 18 ago.
2009.
MESSIAS C, Antonio Rogério. CARREGANDO UMA DLL ESTATICA E
DINAMICAMENTE. Disponível em:
<http://zz2kzq.site90.com/CursoHtml/Modulo05/Modulo005Aula010.htm>. Acesso em: 18 ago.
2009.
MICHEL, Olivier et al. Khepera Simulator. Disponível em:
<http://diwww.epfl.ch/lami/team/michel/khep-sim/>. Acesso em: 01 jun. 2009.
MICHEL, Olivier et al. Webots Simulator. Disponível em: <http://www.cyberbotics.com/>.
Acesso em: 01 jun. 2009.
MIOTTO, Marcelo. Programação Alimentar Utilizando RBC. 2006. 117p. Trabalho de
Conclusão de Curso (Bacharel em Ciências da Computação) – Faculdade de Ciências da
Computação, Universidade do Vale do Itajaí, Itajaí, 2006.
MÓDULO DE VALIDAÇÃO CRUZADA PARA TREINAMENTO DE REDES NEURAIS
ARTIFICIAIS COM ALGORITMOS BACKPROPAGATION E RESILIENT
PROPAGATION. Ponta Grossa: Uepg, 19 nov. 2007. Disponível em:
<www.uepg.br/propesp/publicatio/exa/2008_1/Art.2.pdf>. Acesso em: 05 jun. 2009.
NELSON, Mathew et al. Robocode. Disponível em: <http://robocode.sourceforge.net/>. Acesso
em: 01 jun. 2009.
PASSOS, Eduardo Rocha. Simulação de Estratégias para um Veículo Robótico Autônomo para
Patrulhamento. 2008. 76 f. Tcc (Graduação) - Curso de Ciência da Computação, Centro de
Ciências Tecnológicas, da Terra e do Mar - Cttmar, Universidade do Vale do Itajaí - Univali, Itajaí,
2008.
PESSIN, G. ; OSORIO, F. S. ; MUSSE, S. ; NONNEMMACHER, V. ; FERREIRA, S. S. .
Utilizando Redes Neurais Artificiais no Controle de Robôs Móveis Aplicados ao Combate de
96
Incêndios Florestais. In: XVI Seminário de Computação (SEMINCO 2007), 2007, Blumenau, SC.
Anais do XVI SEMINCO. Blumenau : FURB, 2007. p. 19-30.
REIS, Caime Franco; ALBUQUERQUE, Marcelo Portes de; CASTRO, Sérgio Borges de.
Introdução ao Reconhecimento de Padrões utilizando Redes Neurais. 002. ed. Rio de Janeiro:
Centro Brasileiro de Pesquisas Físicas, 2001. 17 p.
VIEIRA, Rodrigo de Souza. Protótipo de um Sistema de Monitoramento Remoto Inteligente.
1999. 147 f. Dissertação (Pós-graduação em Engenharia de Produção), Curso de Pós-graduação em
Engenharia de Produção, Universidade Federal de Santa Catarina, Florianópolis, 1999.
NXT. JNA: Java Native Access. Disponível em:
<http://blog.vdburgh.net/roller/nxtplace/entry/jna_java_native_access>. Acesso em: 15 set. 2009.
ZELL, Andreas et al. JavaNNS: Java Neural Network Simulator. Disponível em: <
http://www.ra.cs.uni-tuebingen.de/software/JavaNNS/welcome_e.html />. Acesso em: 01 jun. 2009.
ZELL, Andreas et al. SNNS: Stuttgart Neural Network Simulator. Disponível em: <
http://www.ra.cs.uni-tuebingen.de/software/snns/welcome_e.html >. Acesso em: 01 jun. 2009.
97
APÊNDICES
98
A TRABALHANDO COM DLLS
DLL (Dynamic Link Library), ou seja (Biblioteca de Ligação Dinâmica). É uma biblioteca
que contém dados e códigos podendo ser compartilhados por diversos programas aplicativos
quando estão em execução. Dessa forma vários programas que estejam sendo executados podem
chamar a mesma função disponível na dll sem gerar nenhum conflito. Pense numa dll como um
arquivo coletivo, que pode ser compartilhado por vários programas que requisite seus serviços.
Uma dll só será carregada na memória quando requisitada pela aplicação que a chamou, se uma
segunda aplicação desejar chamar a mesma dll, essa biblioteca não será duplicada na memória, mas
sim, compartilhada (MESSIAS A, 2009).
DLLs podem ser acessadas estática ou dinamicamente pelos programas. Quando nossos
programas acessam uma dll, essa biblioteca deverá estar na mesma pasta onde se encontra o
programa, ou em uma pasta padrão do windows. Se o programa estiver carregando a dll de forma
estática e esta não existir em alguma das pastas mencionadas, o programa será finalizado. Se o
programa tentar carregar a dll de forma dinâmica e esta não for encontrada, o programa, mesmo
sem a biblioteca será executado, mas sem usufruir dos recursos da mesma (MESSIAS A, 2009).
Programas que carregam dlls de forma dinâmica tem várias vantagens em relação aos que
carregam de forma estática. Programas que carregam dlls de forma estática só podem liberar o
espaço ocupado na memória pela biblioteca quando o próprio programa que a chamou for
finalizado. Já os programas que carregam dlls de forma dinâmica podem alocar ou liberar a dll da
memória quando desejarem. Sendo assim, quando um programa estiver executando processos que
não utilizem a biblioteca, esta poderá ser removida da memória, liberando espaço para que outros
serviços possam ser executados (MESSIAS A, 2009).
Uma dll pode ser criada em C++ e usada por programas escritos em linguagens como
Delphi, Visual Basic e outras que dêem suporte a dlls. Dessa forma uma função de baixo nível
escrita em C++ poderá ser usada num programa escrito em Visual Basic, como por exemplo, as
funções de acesso à uma Porta Paralela (outportb e inportb) ou quaisquer outras que desejarmos.
Para criar uma dll que possa exportar suas funções para outras linguagens, C++ dispõe de alguns
comandos e modificadores de tipos especiais para resolver algumas divergências entre a passagem
de parâmetros e nomes de funções (MESSIAS A, 2009).
99
Para que um programa C++ possa carregar uma dll de forma dinâmica, precisamos aprender
a declarar ponteiros para função, é dessa forma que estes programas terão acesso ao endereço de
uma função específica da dll na memória. Já no carregamento estático não há a necessidade de
declaração de ponteiro para funções. Na Figura 77, percebe-se que no interior da “MINHA.DLL”
existem duas funções (outportb e inportb), organizadas de uma certa forma para que os programas
possam identificá-las corretamente. Portanto, o que temos dentro de uma dll são funções
compiladas e "linkadas", ou código executável, o mesmo contido nos programas “.EXE”. Essas
funções estão prontas para serem usadas por quaisquer programas que as chame, após o
carregamento da dll na memória (MESSIAS A, 2009).
Figura 76. Uma visão didática do conteúdo interno de uma dll.
Fonte: (MESSIAS A, 2009).
O código fonte mostrado na Figura 77 foi escrito somente para uma melhor compreensão de
uma dll, como se sabe, no interior de uma biblioteca o que há é código executável (compilado e
"linkado") (MESSIAS A, 2009).
A Figura 78 mostra uma única dll compartilhada por quatro programas em execução na
memória. Se esses programas não utilizassem bibliotecas cada um teria que carregar na memória
tanto a função outportb como a função inportb, requisitando mais memória ao sistema (MESSIAS
A, 2009).
100
Figura 77. Vários programas em execução usando a mesma dll simultaneamente.
Fonte: (MESSIAS A, 2009).
Conforme a ilustração exibida na Figura 79, uma dll pode ser acessada através de programas
escritos em várias linguagens que dêem suporte a bibliotecas. Em C++ para criarmos dlls que
possam exportar suas funções para outras linguagens, temos que utilizar alguns comandos e
modificadores de tipos especiais para que não ocorram inversão na passagem de parâmetros e
também truncamento de nomes de funções por parte do "ligador" (MESSIAS A, 2009).
Figura 78. Chamando uma dll escrita em C++ através de várias linguagens.
Fonte: (MESSIAS A, 2009).
101
Figura 79. Chamando uma dll dinamicamente em C++.
Fonte: (MESSIAS A, 2009).
A Figura 80 ilustra passo-a-passo o carregamento dinâmico de uma dll através de programas
escritos em C++. A função LoadLibrary() é responsável pelo carregamento dinâmico da biblioteca
na memória. A função GetProcAddress() retorna o endereço de memória onde se encontra uma
determinada função da dll. O endereço retornado é o da função outportb(). Depois que nosso
programa obtém o endereço de uma função da dll, ele poderá usá-la sem nenhuma restrição
(MESSIAS A, 2009).
102
B CRIANDO A DLL UTILIZANDO O C++ BORLAND 2010
Nesse capítulo será criada uma dll no C++Builder, que possa ser acessada por quaisquer
aplicações escritas em: Delphi, Visual Basic, C/C++, Java e outras linguagens que dêem suporte a
bibliotecas. Não há nenhuma diferença numa função que você cria dentro de seu próprio código
fonte, de uma que será criada para fazer parte de uma dll. O que existe é a inclusão de alguns
modificadores responsáveis pela convenção de parâmetros e comandos para exportar a própria
função. A sintaxe inserida em volta da função que será exportada é um pouco diferente da que se
esta acostumado a escrever, mas com a criação de várias funções, logo tornar-se-ão familiares.
Para começar, criou-se uma dll chamada “PRNA.DLL”, que contém a função rede(float,
float, int) para calcular a direção a ser tomada pelo veículo. Como já existe bastante familiaridade
com essa função, tornou-se fácil compreender a sintaxe de exportação de funções.
Segue passo a passo a criação da biblioteca “PRNA.DLL”:
1. Criou-se em alguma unidade de disco, uma nova pasta com o nome RNA (ou o nome
que desejar). Essa pasta serviu para gravar o nosso projeto;
2. Aberto o C++Builder e selecionado no menu File, item Close All, para fechar o
projeto atual;
3. Selecionado novamente no menu File, New e depois em Other..., foi exibida uma
caixa de diálogo similar a da Figura 81;
4. Selecionado o ícone DLL (Dynamic-link Library) e clicado no botão OK;
5. Apresentada uma janela New Dynamic-link Library como a da Figura 82, em Source
Type selecionada a opção “c”, marcado o checkbox “Mult Threaded” e clicado no
botão “OK”. Éxibida a janela da Figura 83 com o código fonte básico para dar início
a criação de uma DLL;
103
Figura 80. Caixa de diálogo Other, para escolher o que se deseja criar.
Fonte: Embarcadero RAD Studio 2010.
Figura 81. Janela New Dynamic-link Library.
Fonte: Embarcadero RAD Studio 2010.
6. Dado continuidade ao código fonte que o C++Builder gerou, acrescentado o código
fonte gerado pelo “snns2c.exe”;
7. Clicado no menu File e depois no item Save. Salvo o projeto com o nome PRNA, na
pasta RNA, criada anteriormente no passo 1;
104
Figura 82. Código fonte gerado automaticamente para começar o desenvolvimento de uma dll.
Fonte: Embarcadero RAD Studio 2010.
8. Compilado o código fonte para gerar a DLL. Clicado no menu Projects e depois no
item Build All Projects.
Não ocorreu erro algun, aberta a pasta Debug, criada pelo C++ Builder dentro da pasta
RNA, o conteúdo dela é apresentado na Figura 84:
Figura 83. Pasta contendo todos os arquivos gerados após a compilação do projeto.
Observe que o compilador gerou vários arquivos, dentre eles o arquivo “PRNA.DLL”. Esse
é o arquivo dll onde se encontra a função global rede(float, float, int) que poderá ser chamada
através de aplicativos escritos em linguagens que dêem suporte a dll. Os arquivos “PRNA.LIB” e
“RNA.OBJ” poderão ser úteis para compilar programas que carreguem dll de forma estática no
C++Builder. A utilização dos comandos listados na Tabela garantem que a dll criada possa ser
chamada através de programas escritos em várias linguagens de programação, sem que ocorram
problemas na conversão dos dados de parâmetros e nomes de funções.
105
Comando
extern "C"
__declspec(dllexport) ou _export ou __export
_stdcall ou __stdcall ou WINAPI
Função
Indica ao "linkeditor" que a função a ser exportada usará a
convenção C e não C++. C++ altera o nome da função
para que possa ser possível implementar sobrecarga de
função;
Comandos usados para exportar as funções da DLL
Modificadores de tipos utilizados para ordenar os
parâmetros passados às funções. Esses modificadores
obedecem ao padrão WIN32.
Tabela 10. Comandos que devem ser inseridos na construção de funções para dll.
Fonte: (MESSIAS B, 2009).
Observa-se na Tabela 10 que um mesmo comando pode ser expresso de várias formas. A
sintaxe __declspec(dllexport) e __stdcall são as mais utilizadas. Para criar uma função dentro de
uma dll que possa ser exportada para outros programas, a sintaxe demonstrada na Figura 85 deverá
sempre ser utilizada, ficando flexível para mudança somente o tipo de dado de retorno, o tipo de
parâmetro e o nome da função.
Figura 84. Sintaxe para declaração de funções que poderão ser exportadas para fora da dll.
Fonte: (MESSIAS B, 2009).
Se declarássemos a função rede(float, float, int) de forma padrão (unsigned char
inportb(WORD)), ela não seria exportada, e só poderia ser chamada pela própria dll, ou seja,
somente as funções internas da dll poderia utilizá-la. Veja na Tabela 11 alguns tipos de dados
redefinidos através do comando typedef. Essa redefinição de tipos é muito utilizada pelas funções
da API do windows. Veja alguns sinônimos:
106
Tipo Redefinido
BYTE
WORD
DWORD
Tipo original
unsigned char
unsigned int short
unsigned int
Tabela 11. Tipos redefinidos.
Fonte: (MESSIAS B, 2009).
O C++Builder permite o uso dos tipos redefinidos na Tabela 11 livremente em nosso código
fonte, sem nenhum erro de sintaxe.
107
C CRIANDO A DLL UTILIZANDO O DEV C++ 4
Alguns programadores podem se sentir desconfortáveis ao se utilizar um software
proprietário para criar uma dll, considerando esse aspecto é apresentado nesse capítulo como
proceder para a criação de uma biblioteca utilizando o software freeware Bloodshed Dev-C++. Para
começar, foi criada uma dll chamada “PDRNA.DLL”, que contém a função rede(float, float, int)
para calcular a direção a ser tomada pelo veículo.
Segue passo a passo a criação da biblioteca “PDRNA.DLL”:
1. Criada em alguma unidade de disco, uma nova pasta com o nome PDRNA (ou o
nome que desejar). Essa pasta foi utilizada para gravar o nosso projeto;
2. Aberto o Dev-C++ e clique no menu File, New Project..., exibida uma caixa de
diálogo similar a da Figura 86;
Figura 85. Caixa de diálogo New Project.
Fonte: Bloodshed Dev-C++ 4
3. Em Project selecionado a opção “DLL”, marcado o checkbox “C project” e clicado
no botão “OK”. Exibida uma janela igual a da Figura 87;
4. Preenchidos os campos da janela mostrada na Figura 87 com os dados do projeto que
será criado, os campos referentes à nossa dll estão contidos no quadro “DLL
Project”, clicado no botão “OK”;
108
5. O projeto foi criado, em seguida foi fechado o software Dev-C++. Aberta a pasta
PDRNA e utilizado o Bloco de Notas ou o Notepad++ para abrir o arquivo
“PDRNA.dev” e alterado a linha referente a extensão do arquivo “PDRNA.CPP”
para “PDRNA.C”, em seguida o arquivo foi salvo. Como demostrado na linha 10 da
Figura 88, esse procedimento garante a compilação correta da dll pelo compilador C,
ao invés do compilador C++, que geraria um erro de “Estrutura Previamente
Declarada”;
Figura 86. Caixa de Diálogo New DLL Project.
Fonte: Bloodshed Dev-C++ 4.
109
Figura 87. Conteúdo alterado do arquivo PDRNA.dev.
Fonte: Bloodshed Dev-C++ 4.
6. Alterada a extensão do arquivo “PDRNA.CPP” para “PDRNA.C” e reaberto o
projeto no Dev-C++ através do arquivo “PDRNA.dev”;
7. O software Dev-C++ apresentou duas (02) janelas, referentes ao arquivo de headers
(.h) e o arquivo fonte (.c). Chamamos nosso arquivo header de “PDRNA.H”, é nesse
header que vão os prototipos das funções que foram implementadas no arquivo
“PDRNA.C”, para cada função que se deseja ter acesso na dll, deve ser especificada
um protótipo conforme o apresentado na Figura 89, na dll desenvolvida utilizamos
apenas uma função;
Figura 88. Código contido no arquivo PDRNA.H.
Fonte: Bloodshed Dev-C++ 4.
110
8. O arquivo header está pronto, agora basta inserir no arquivo “PDRNA.C” o código
gerado pelo snns2c.exe e incluir os identificadores “__declspec(dllexport)” na
função “rede(float *in, float *out, int init)”;
9. Compilado o projeto, não ocorreu erro algum, aberta a pasta “PDRNA”, o conteúdo
dela é apresentado na Figura 90:
Figura 89. Pasta contendo todos os arquivos gerados após a compilação do projeto.
Observe que após a compilação foram gerados vários arquivos, dentre eles o arquivo
“PDRNA.DLL”. Esse é o arquivo dll onde se encontra a função global “rede()” que poderá ser
chamada através de aplicativos escritos em linguagens que dêem suporte a dll.
111
D CARREGANDO UMA DLL ESTÁTICAMENTE
Após a compilação da dll “PRNA” foram gerados vários arquivos, sendo dois deles
(PRNA.DLL e PRNA.LIB) muito importantes para o projeto desta seção, a Figura 91 mostra um
fluxo básico do carregamento de uma dll estaticamente pelo programa aplicativo:
Figura 90. Fluxo genérico de carregamento estático de uma dll.
Fonte: (MESSIAS C, 2009).
Observa-se no fluxo acima que o programa ao ser inicializado verifica se a dll encontra-se
em alguma pasta especificada na criação do mesmo. Caso não exista o programa é finalizado. Uma
biblioteca carregada estáticamente só poderá ser removida da memória quando o programa que a
carregou for finalizado. Mesmo que o programa não necessite chamar uma função da biblioteca, ela
permanecerá ocupando espaço na memória. Há vantagem no carregamento estático de dll quando o
programa que as carregou utilizar suas funções freqüentemente.
Abaixo seguem os passos para criação de um programa que carregue estáticamente a dll
“PRNA.DLL”:
1. Criado uma nova pasta com o nome “LeDLLEstatica” e copiado para dentro desta
pasta os arquivos “PRNA.DLL”, “PRNA.LIB” e “RNA.OBJ” criados anteriormente.
Essa pasta foi utilizada para gravar esse projeto;
112
2. Aberto o C++Builder;
3. Adicionado um componente “Button” no formulário e alterado o Caption para
"Executa DLL Estática", então foi inserido o código apresentado na Figura 92 no
evento OnClick desse botão.
Figura 91. Código inserido no envento OnClick do objeto Button1.
4. No código fonte do programa, foi inserido o fragmento de código contido na Figura
93, na mesma posição onde se encontram na Figura 94. Observa-se que a sintaxe é a
mesma usada na criação do arquivo “PRNA.DLL”, mas com uma pequena
substituição da instrução “dllexport” para “dllimport”. A instrução na Figura 93 nada
mais é que um protótipo para a função a ser importada da dll para o software. Os
tipos de dados, os nomes das funções e a ordem dos tipos de parâmetros, devem ser
idênticos aos que estão declarados na dll, caso contrário, erros são gerados na
compilação.
extern "C" __declspec(dllexport) WINAPI int rede(float *in, float *out, int init);
Figura 92. Declaração da função a ser importada estaticamente da dll:
113
Figura 93. Posição onde deve ser inserida a instrução contida na Figura 93.
5. Selecionado o menu “Project” o item “Add to Project...” Abra a pasta
“LeDLLEstatica” criada no passo 1, selecionado o arquivo “PRNA.LIB” e
adicionado ao projeto;
6. Selecionado o menu “File” o item “Save”. O projeto foi salvo com o nome
“LeDllEstatica” na pasta “LeDLLEstatica”, criada no passo 1;
7. O projeto foi compilado com sucesso.
114
E CARREGANDO UMA DLL DINÂMICAMENTE
Para se trabalhar com dll dinamicamente, deve-se primeiramente familiarizar-se com
Ponteiros para Funções. Caso se tente armazenar o endereço de uma função em uma variável
ponteiro comum, obtém-se um erro no momento da compilação. Se o objetivo é armazenar o
endereço de uma função, deve-se declarar uma variável ponteiro para uma função. Observe na
Figura 95 como declarar um ponteiro para uma função:
Figura 94. Declaração de um ponteiro para uma função.
Fonte: (MESSIAS C, 2009).
São apresentados na Tabela 12 alguns exemplos de como declarar Ponteiros para Funções,
com tipos de retorno e parâmetros diferentes:
Cria um ponteiro para uma função que não retorna nada (void) e não aceita nenhum parâmetro (void).
void (*PonteiroFunc)( void );
Cria um ponteiro para uma função que não retorna nada (void) e aceita um parâmetro do tipo int.
void (*PonteiroFunc)( int a );
Cria um ponteiro para uma função que não retorna nada (void) e aceita quatro parâmetros.
void (*PonteiroFunc)( int a, int b, unsigned char c, float d );
Cria um ponteiro para uma função que retorna um tipo (unsigned char) e aceita dois parâmetros.
unsigned char (*PonteiroFunc)( int, unsigned char );
Cria um ponteiro para uma função que retorna um string, e aceita um parâmetro string (caracteres).
char * (*PonteiroFunc)( char *texto );
Tabela 12. Ponteiro para Funções.
115
Deve-se tomar cuidado para não confundir declaração de ponteiros para funções com
declaração de ponteiros para variáveis, ou mesmo declaração de protótipos de funções:
int MinhaFunc(int a, int b);
char MinhaFunc(void);
unsigned char MinhaFunc(int x, char *texto);
char *MinhaFunc( unsigned char *s);
int *Ponteiro; ou int (*Ponteiro);
char *Ponteiro;
void *Ponteiro;
unsigned char (*Ponteiro);
Tabela 13. Ponteiros para Variáveis.
Tabela 14. Protótipos de Funções.
Para se declarar um Ponteiro para uma Função são necessários usar dois pares de parênteses,
como pode ser verificado na Figura 96.
Figura 95. Declarando um ponteiro para uma função com parâmetros.
Fonte: (MESSIAS C, 2009).
Para se criar um ponteiro para uma função, é necessário conhecer muito bem o protótipo da
função que será apontada. Os tipos de parâmetros da função tem de ser idênticos aos declarados no
ponteiro, como também o tipo de dado de retorno. Na Figura 96 o ponteiro para função
(PonteiroFunc) foi declarado com os mesmos tipos de dados de retorno e de parâmetros que os da
função Soma(). Para que o ponteiro PonteiroFunc aponte para a função Soma() na memória, é
necessário criar uma variável do tipo PonteiroFunc da forma como é apresentado na Tabela 15:
PonteiroFunc MinhaSoma;
MinhaSoma = Soma;
Valor = MinhaSoma(10, 60);
Cria uma variável com o poder de apontar para uma função na memória.
Atribui o endereço da função Soma() ao ponteiro para função 'MinhaSoma'.
Não se usa os parênteses quando o objetivo é passar o endereço da função.
Executa a função Soma() indiretamente através do ponteiro 'MinhaSoma'.
Tabela 15. Declaração de Ponteiro para Função.
116
Analisando o fluxo apresentado na Figura 97, percebe-se que o programa é carregado e
executado independentemente da existência ou não da dll. Se a biblioteca não existir, o programa
não terá acesso aos recursos da mesma e somente rotinas inerentes ao programa funcionarão.
Para trabalharmos com dlls dinamicamente é necessário conhecer três funções importantes,
elas são: LoadLibrary(), GetProcAddress() e FreeLibrary().
Figura 96. Fluxo genérico de carregamento dinâmico de uma DLL.
A Tabela 16 apresenta a sintaxe e a descrição da função LoadLibrary().
Função:
LoadLibrary():
Sintaxe:
Descrição:
Carrega um arquivo DLL na memória dinamicamente;
HINSTANCE instanciaDLL;
Para armazenar um identificador da DLL na memória
(uma instância da DLL).
instanciaDLL = LoadLibrary("NomeDaDLL.dll");
Se houver sucesso a função LoadLibrary() carrega a DLL na memória e retorna um identificador (handle);
Se houver um erro, a função LoadLibrary() retorna um NULL;
Tabela 16. Sintax e Descrição da Função LoadLibrary().
117
A Tabela 17 apresenta a sintaxe e a descrição da função FreeLibrary() e a Tabela 18
apresenta a sintaxe e a descrição da função GetProcAddress().
Função:
FreeLibrary():
Descrição:
Libera uma DLL alocada na memória.
Sintaxe:
BOOL Retorno;
Retorno = FreeLibrary(instanciaDLL);
O parâmetro instanciaDLL identifica a DLL que
desejamos liberar.
Tabela 17. Sintax e Descrição da Função FreeLibrary().
Função:
GetProcAddress():
Descrição:
Obtém o endereço de uma função específica na DLL
que esteja alocada na memória.
Sintaxe:
FARPROC GetProcAddress(instanciaDLL,
"NomeDaFunção");
Tabela 18. Sintax e Descrição da Função GetProcAddress()
O Parâmetro "NomeDaFunção" refere-se exatamente ao mesmo nome contido internamente
na dll. Já o nome da variável ponteiro que irá receber o endereço da função pode ser qualquer um
que desejar. A função GetProcAddress() retorna um endereço de uma função da dll. Para atribuir
esse endereço a uma variável, deve-se declará-la como sendo do tipo Ponteiro para Função. Se
houver sucesso a função GetProcAddress() retorna o endereço da função exportada da dll, se houver
um erro, a função GetProcAddress() retorna um NULL.
118
F RNA GERADA PELO AMBIENTE JAVANNS
A seguir é apresentado o arquivo de topologia da RNA após criada, treinada e validada pelo
ambiente JavaNNS.
SNNS network definition file V1.4-3D
generated at Mon Jun 15 00:56:34 2009
network name : GSC200901-B
source files :
no. of units : 28
no. of connections : 187
no. of unit types : 0
no. of site types : 0
learning function : Std_Backpropagation
update function
: Topological_Order
unit default section :
act
| bias
| st | subnet | layer | act func
| out func
---------|----------|----|--------|-------|--------------|------------0.00000 | 0.00000 | h |
0 |
1 | Act_Logistic | Out_Identity
---------|----------|----|--------|-------|--------------|------------unit definition section :
no. | typeName | unitName | act
| bias
| st | position | act func
| out func | sites
----|----------|----------|----------|----------|----|----------|--------------|----------|------1 |
| sEsq
| 0.34000 | -0.99750 | i | 1, 3, 1 | Act_Identity |
|
2 |
| sCnt
| 0.45000 | 0.12717 | i | 1, 4, 1 | Act_Identity |
|
3 |
| sDir
| 0.28000 | -0.61339 | i | 1, 5, 1 | Act_Identity |
|
4 |
| oculto
| 1.00000 | 24.02031 | h | 3, 1, 1 |||
5 |
| oculto
| 0.98070 | -2.20538 | h | 4, 1, 1 |||
6 |
| oculto
| 0.95130 | -1.55068 | h | 3, 2, 1 |||
7 |
| oculto
| 0.86800 | 7.87063 | h | 4, 2, 1 |||
8 |
| oculto
| 0.00000 | -47.65002| h | 3, 3, 1 |||
9 |
| oculto
| 0.99303 | -1.67387 | h | 4, 3, 1 |||
10 |
| oculto
| 0.99974 | 21.43050 | h | 5, 3, 1 |||
11 |
| oculto
| 0.58436 | 4.94572 | h | 3, 4, 1 |||
12 |
| oculto
| 0.00144 | -12.52929| h | 4, 4, 1 |||
13 |
| oculto
| 0.00000 | -19.60881| h | 5, 4, 1 |||
14 |
| oculto
| 0.05709 | 0.07318 | h | 3, 5, 1 |||
15 |
| oculto
| 0.01198 | 2.60847 | h | 4, 5, 1 |||
16 |
| oculto
| 0.00000 | -64.47112| h | 5, 5, 1 |||
17 |
| oculto
| 0.00135 | -3.60606 | h | 3, 6, 1 |||
18 |
| oculto
| 0.00140 | 0.69503 | h | 4, 6, 1 |||
19 |
| oculto
| 0.98534 | 0.31193 | h | 3, 7, 1 |||
20 |
| oculto
| 0.00000 | -58.48545| h | 4, 7, 1 |||
21 |
| grau0
| 0.00000 | -0.64541 | o | 10, 4, 1 |||
22 |
| grau30
| 1.00000 | -19.72607| o | 9, 5, 1 |||
23 |
| grau90
| 0.00000 | -22.19844| o | 9, 6, 1 |||
24 |
| grau120 | 0.00640 | -0.65943 | o | 8, 7, 1 |||
25 |
| grau180 | 0.00000 | -5.32811 | o | 7, 4, 1 |||
26 |
| grau220 | 0.00000 | -5.29975 | o | 8, 1, 1 |||
27 |
| grau270 | 0.00000 | -1.49156 | o | 9, 2, 1 |||
28 |
| grau330 | 0.00000 | -3.97522 | o | 9, 3, 1 |||
----|----------|----------|----------|----------|----|----------|--------------|----------|------connection definition section :
target | site | source:weight
-------|------|-------------------------------------------------------------------------------------------------------------------4 |
| 1:-2.69798, 2:-3.15108, 3:-25.21090
5 |
| 1: 3.96806, 2:31.24192, 3:-33.12288
6 |
| 1:62.06627, 2: 2.64763, 3:-63.46835
7 |
| 1:-7.46317, 2:-5.52484, 3:-3.44134
8 |
| 1:53.17605, 2:-1.33343, 3:-0.14132
9 |
| 1:-0.10378, 2: 0.07629, 3:23.69132
10 |
| 1:-15.25484, 2:-12.39511, 3:-8.64312
11 |
| 1:22.91128, 2:-19.93140, 3:-12.23478
119
12 |
| 1:25.05855, 2:-0.45884, 3:-8.30513
13 |
| 1:-3.13781, 2: 2.21535, 3:21.34284
14 |
| 1: 4.05916, 2:-25.33205, 3:25.50662
15 |
| 1:-13.21846, 2:-2.05508, 3:-5.72196
16 |
| 1: 0.19194, 2:72.14281, 3:-2.89443
17 |
| 1:-15.41086, 2:-7.67594, 3:20.33433
18 |
| 1: 4.30191, 2:-15.81754, 3:-5.75145
19 |
| 1:-35.09380, 2:36.28424, 3:-1.78639
20 |
| 1: 1.17616, 2:-1.48298, 3:64.15266
21 |
| 4:-7.29600, 5:-30.24769, 6:-5.25493, 7: 0.35924, 8:-31.02905, 9: 7.41119, 10:
9.14604, 11: 2.36228, 12: 5.88715,
13:11.61123, 14: 8.62918, 15: 2.87683, 16: 0.32467, 17:-10.89467, 18: 3.83513, 19:22.18593, 20:-27.55703
22 |
| 4:-24.52096, 5:28.61205, 6:25.79306, 7:-2.17326, 8:-17.75300, 9:-7.31167, 10:
5.73598, 11: 6.71984, 12:-5.43337,
13:-3.59284, 14: 6.31532, 15:10.62583, 16:-29.41795, 17:-3.50909, 18:-7.47530, 19:
9.53954, 20:-0.27455
23 |
| 4: 3.94771, 5:-3.64191, 6:17.85258, 7: 4.32341, 8:22.97949, 9: 6.81347, 10:7.08089, 11:-10.57231, 12: 2.96930,
13:-8.18269, 14:-7.68322, 15:-2.81580, 16:24.53243, 17: 2.49387, 18:-4.29908, 19:11.60732, 20:-17.39714
24 |
| 4:-0.14004, 5:-0.49988, 6:-1.41358, 7:-0.41025, 8: 0.13682, 9:-1.21343, 10:0.41955, 11:-0.05877, 12:-0.79616,
13:-1.38196, 14:-0.01904, 15: 0.49311, 16:-0.68520, 17:-0.78730, 18:-0.34063, 19:0.40326, 20: 0.07378
25 |
| 4:-10.47978, 5:-3.07577, 6:-0.41249, 7:-1.92305, 8:11.30459, 9:-3.78101, 10:3.45541, 11:-3.08860, 12: 2.47330,
13:-1.77625, 14:-3.20887, 15: 0.19550, 16:-6.06821, 17:-0.07855, 18: 2.59469, 19:5.29465, 20:10.09263
26 |
| 4:-4.17997, 5: 2.85300, 6:-2.29660, 7:-1.14826, 8: 5.36008, 9:-3.35593, 10:1.68075, 11:-4.25174, 12: 1.23888,
13:-0.56621, 14:-2.05270, 15:-0.71194, 16: 5.02423, 17:-2.29919, 18: 0.07192, 19:
1.58759, 20: 0.55390
27 |
| 4:-17.31707, 5:11.93643, 6:-23.94735, 7: 9.19540, 8:-31.32139, 9:-3.08218,
10:-3.91423, 11:-2.53776, 12: 0.06819,
13: 9.97086, 14:-7.53734, 15:-3.35337, 16:26.72727, 17: 3.58549, 18: 4.07042, 19:1.53553, 20:26.72148
28 |
| 4: 5.62610, 5:-18.65056, 6:-28.87497, 7:-2.95670, 8: 3.56285, 9: 3.80239, 10:
2.69381, 11:-11.24108, 12:13.76191,
13:-13.65243, 14:-9.79296, 15: 2.34568, 16:-31.43298, 17:-2.13967, 18:-3.13060,
19:24.89387, 20:-26.59002
-------|------|-------------------------------------------------------------------------------------------------------------------layer definition section :
layer | unitNo.
------|--------------------------------------------------------------------------------------------------------------------------2 | 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
3 | 21, 22, 23, 24, 25, 26, 27, 28
------|---------------------------------------------------------------------------------------------------------------------------
120
G ARQUIVO DE TREINAMENTO DA RNA
A seguir é apresentado o arquivo de treinamento utilizado no processo de treinamento das
RNAs treinadas pelo ambiente JavaNNS.
SNNS pattern definition file V4.2
generated at Sun Jun 14 16:58:51 2009
No. of patterns : 911
No. of input units : 3
No. of output units : 8
# Input pattern 1:
0.3 0.24 0.68
# Output pattern 1:
10000000
# Input pattern 2:
0.56 0.61 0.05
# Output pattern 2:
01000000
# Input pattern 3:
0.62 0.76 0.67
# Output pattern 3:
00000001
# Input pattern 4:
0.82 0.58 0.73
# Output pattern 4:
10000000
# Input pattern 5:
0.45 0.87 0.11
# Output pattern 5:
01000000
# Input pattern 6:
0.72 0.06 0.05
# Output pattern 6:
01000000
# Input pattern 7:
0.55 0.26 0.02
# Output pattern 7:
01000000
# Input pattern 8:
0.31 0.44 0.29
# Output pattern 8:
01000000
# Input pattern 229:
0.4 0.43 0.85
# Output pattern 229:
00000001
# Input pattern 230:
0.7 0.4 0.35
# Output pattern 230:
01000000
# Input pattern 231:
0.55 0.77 0.1
# Output pattern 231:
01000000
# Input pattern 232:
0.23 0.76 0.11
# Output pattern 232:
01000000
# Input pattern 233:
0.51 0.77 0.83
# Output pattern 233:
00000001
# Input pattern 234:
0.99 0.4 0.32
# Output pattern 234:
00100000
# Input pattern 235:
0.12 0.36 0.15
# Output pattern 235:
00000001
# Input pattern 236:
0.51 0.94 0.33
# Output pattern 236:
00100000
# Input pattern 457:
0.86 0.86 0.51
# Output pattern 457:
01000000
# Input pattern 458:
0.46 0.77 0.14
# Output pattern 458:
01000000
# Input pattern 459:
0.24 0.56 0.64
# Output pattern 459:
00000001
# Input pattern 460:
0.12 0.52 0.18
# Output pattern 460:
00000001
# Input pattern 461:
0.88 0.46 0.98
# Output pattern 461:
00000010
# Input pattern 462:
0.17 0.36 0.98
# Output pattern 462:
00000010
# Input pattern 463:
0.57 0.7 0.89
# Output pattern 463:
00000001
# Input pattern 464:
0.89 0.78 0.13
# Output pattern 464:
01000000
121
# Input pattern 685:
0.19 0.36 0.76
# Output pattern 685:
00000001
# Input pattern 686:
0.31 0.24 0.56
# Output pattern 686:
10000000
# Input pattern 687:
0.26 0.66 0.12
# Output pattern 687:
01000000
# Input pattern 688:
0.97 0.61 0.91
# Output pattern 688:
00001000
# Input pattern 689:
0.5 0.21 0.27
# Output pattern 689:
10000000
# Input pattern 690:
0.97 0.38 0.68
# Output pattern 690:
00100000
# Input pattern 691:
0.54 0.21 0.47
# Output pattern 691:
10000000
# Input pattern 692:
0.39 0.4 0.97
# Output pattern 692:
00000010
# Input pattern 9:
0.03 0.54 0.68
# Output pattern 9:
00000001
# Input pattern 10:
0.28 0.73 0.14
# Output pattern 10:
01000000
# Input pattern 11:
0.64 0.5 0.73
# Output pattern 11:
10000000
# Input pattern 12:
0.63 0.84 0.31
# Output pattern 12:
01000000
# Input pattern 13:
0.33 0.15 0.04
# Output pattern 13:
01000000
# Input pattern 14:
0.49 0.18 0.02
# Output pattern 14:
01000000
# Input pattern 15:
0.64 0.33 0.05
# Output pattern 15:
01000000
# Input pattern 16:
0.84 0.05 0.85
# Output pattern 16:
10000000
# Input pattern 17:
0.17 0.62 0.83
# Output pattern 17:
00000001
# Input pattern 18:
0.19 0.43 0.91
# Output pattern 18:
00000010
# Input pattern 19:
0.85 0.48 0.09
# Output pattern 19:
01000000
# Input pattern 20:
0.69 0.68 0.24
# Input pattern 237:
0.94 0.84 0.29
# Output pattern 237:
00100000
# Input pattern 238:
0.96 0.99 0.99
# Output pattern 238:
00000100
# Input pattern 239:
0.57 0.23 0.25
# Output pattern 239:
10000000
# Input pattern 240:
0.94 0.77 0.65
# Output pattern 240:
00100000
# Input pattern 241:
0.19 0.7 0.14
# Output pattern 241:
01000000
# Input pattern 242:
0.38 0.12 0.53
# Output pattern 242:
10000000
# Input pattern 243:
0.04 0.42 0.58
# Output pattern 243:
00000001
# Input pattern 244:
0.12 0.25 0.59
# Output pattern 244:
00000001
# Input pattern 245:
0.95 0.69 0.66
# Output pattern 245:
00100000
# Input pattern 246:
0.63 0.12 0.81
# Output pattern 246:
10000000
# Input pattern 247:
0.63 0.86 0.54
# Output pattern 247:
01000000
# Input pattern 248:
0.57 0.27 0.36
# Input pattern 465:
0.63 0.16 0.89
# Output pattern 465:
10000000
# Input pattern 466:
0.89 0.21 0.31
# Output pattern 466:
10000000
# Input pattern 467:
0.41 0.59 0.12
# Output pattern 467:
01000000
# Input pattern 468:
0.41 0.04 0.66
# Output pattern 468:
10000000
# Input pattern 469:
1 0.61 0.16
# Output pattern 469:
00100000
# Input pattern 470:
0.46 0.96 0
# Output pattern 470:
00100000
# Input pattern 471:
0.52 0.64 0.95
# Output pattern 471:
00000010
# Input pattern 472:
0.38 0.17 0.57
# Output pattern 472:
10000000
# Input pattern 473:
0.56 0.08 0.5
# Output pattern 473:
10000000
# Input pattern 474:
0.59 0.92 0.66
# Output pattern 474:
00000010
# Input pattern 475:
0.28 0.28 0.89
# Output pattern 475:
10000000
# Input pattern 476:
0.08 0.47 0.89
122
# Input pattern 693:
0.21 0.07 0
# Output pattern 693:
01000000
# Input pattern 694:
0.39 0.96 0.75
# Output pattern 694:
00000010
# Input pattern 695:
0.41 0.18 0.32
# Output pattern 695:
10000000
# Input pattern 696:
0.86 0.06 0.48
# Output pattern 696:
10000000
# Input pattern 697:
0.24 0.14 0.55
# Output pattern 697:
10000000
# Input pattern 698:
0.42 0.8 0.34
# Output pattern 698:
01000000
# Input pattern 699:
0.25 0.68 0.29
# Output pattern 699:
00000001
# Input pattern 700:
0.96 0 0.96
# Output pattern 700:
00001000
# Input pattern 701:
0.97 0 0.97
# Output pattern 701:
00001000
# Input pattern 702:
0.98 0 0.98
# Output pattern 702:
00001000
# Input pattern 703:
0.99 0 0.99
# Output pattern 703:
00001000
# Input pattern 704:
0.99 0.06 0.97
# Output pattern 20:
01000000
# Input pattern 21:
0.38 0.95 0.73
# Output pattern 21:
00000010
# Input pattern 22:
0.38 0.51 0.39
# Output pattern 22:
00000001
# Input pattern 23:
0.85 0.8 0.62
# Output pattern 23:
01000000
# Input pattern 24:
0.65 0.91 0.27
# Output pattern 24:
00100000
# Input pattern 25:
0.29 0.87 0.96
# Output pattern 25:
00000010
# Input pattern 26:
0.05 0.88 0.38
# Output pattern 26:
00000001
# Input pattern 27:
0.41 0.47 0.75
# Output pattern 27:
00000001
# Input pattern 28:
0.65 0.81 0.15
# Output pattern 28:
01000000
# Input pattern 29:
0.55 0.76 0.11
# Output pattern 29:
01000000
# Input pattern 30:
0.05 0.86 0.19
# Output pattern 30:
00000001
# Input pattern 31:
0.61 0.57 0.06
# Output pattern 31:
01000000
# Output pattern 248:
10000000
# Input pattern 249:
0.23 0.59 0.02
# Output pattern 249:
01000000
# Input pattern 250:
0.41 0.09 0.42
# Output pattern 250:
10000000
# Input pattern 251:
0.13 0.09 0.77
# Output pattern 251:
10000000
# Input pattern 252:
0.86 0.21 0.86
# Output pattern 252:
10000000
# Input pattern 253:
0.58 0.56 0.27
# Output pattern 253:
01000000
# Input pattern 254:
0.55 0.06 0.3
# Output pattern 254:
10000000
# Input pattern 255:
0.27 0.71 0.56
# Output pattern 255:
00000001
# Input pattern 256:
0.34 0.85 0.71
# Output pattern 256:
00000001
# Input pattern 257:
0.7 0.35 0.12
# Output pattern 257:
01000000
# Input pattern 258:
0.33 0.08 0.65
# Output pattern 258:
10000000
# Input pattern 259:
0.77 0.48 0.17
# Output pattern 259:
01000000
# Output pattern 476:
00000001
# Input pattern 477:
0.01 0.54 0.67
# Output pattern 477:
00000001
# Input pattern 478:
0.42 0.26 0.65
# Output pattern 478:
10000000
# Input pattern 479:
0.86 0.17 0.5
# Output pattern 479:
10000000
# Input pattern 480:
0.83 0.12 0.15
# Output pattern 480:
10000000
# Input pattern 481:
0.06 0.84 0.75
# Output pattern 481:
00000001
# Input pattern 482:
0.54 0.28 0.34
# Output pattern 482:
10000000
# Input pattern 483:
0.1 0.24 0.38
# Output pattern 483:
00000001
# Input pattern 484:
0.16 0.9 1
# Output pattern 484:
00000010
# Input pattern 485:
0.7 0.28 0.93
# Output pattern 485:
00000010
# Input pattern 486:
0.49 0.25 0.58
# Output pattern 486:
10000000
# Input pattern 487:
0.73 0.45 0.49
# Output pattern 487:
10000000
123
# Output pattern 704:
00001000
# Input pattern 705:
101
# Output pattern 705:
00001000
# Input pattern 706:
0.96 0 0.98
# Output pattern 706:
00001000
# Input pattern 707:
0.98 0.01 1
# Output pattern 707:
00001000
# Input pattern 708:
1 0.05 0.96
# Output pattern 708:
00001000
# Input pattern 709:
0.96 0.07 0.99
# Output pattern 709:
00001000
# Input pattern 710:
0.99 0.03 0.96
# Output pattern 710:
00001000
# Input pattern 711:
0.96 0.09 1
# Output pattern 711:
00001000
# Input pattern 712:
0.63 0.02 0.6
# Output pattern 712:
10000000
# Input pattern 713:
0.33 0.26 0.89
# Output pattern 713:
10000000
# Input pattern 714:
0.48 0.09 0.75
# Output pattern 714:
10000000
# Input pattern 715:
0.86 0.5 0.21
# Output pattern 715:
01000000
# Input pattern 32:
0.79 0.57 0.17
# Output pattern 32:
01000000
# Input pattern 33:
0.92 0.5 0.55
# Output pattern 33:
00100000
# Input pattern 34:
0.9 0.43 0.37
# Output pattern 34:
01000000
# Input pattern 35:
0.03 0.66 0.97
# Output pattern 35:
00000010
# Input pattern 36:
0.05 0.4 0.33
# Output pattern 36:
00000001
# Input pattern 37:
0.51 0.17 0.61
# Output pattern 37:
10000000
# Input pattern 38:
0.23 0.53 0.82
# Output pattern 38:
00000001
# Input pattern 39:
0.52 0.39 0.48
# Output pattern 39:
10000000
# Input pattern 40:
0.32 0.44 0.88
# Output pattern 40:
00000001
# Input pattern 41:
0.26 0.65 0.48
# Output pattern 41:
00000001
# Input pattern 42:
0.4 0.69 0.43
# Output pattern 42:
00000001
# Input pattern 43:
0.52 0.19 0.39
# Input pattern 260:
0.23 0.35 0.46
# Output pattern 260:
00000001
# Input pattern 261:
0.01 0.39 0.58
# Output pattern 261:
00000001
# Input pattern 262:
0.26 0.42 0.96
# Output pattern 262:
00000010
# Input pattern 263:
0.81 0.72 0.62
# Output pattern 263:
01000000
# Input pattern 264:
0.56 0.84 0.01
# Output pattern 264:
01000000
# Input pattern 265:
0.9 0.24 0.08
# Output pattern 265:
01000000
# Input pattern 266:
0.71 0.62 0.29
# Output pattern 266:
01000000
# Input pattern 267:
0.3 0.22 0.02
# Output pattern 267:
01000000
# Input pattern 268:
0.17 0.81 0.77
# Output pattern 268:
00000001
# Input pattern 269:
0.25 0.28 0.54
# Output pattern 269:
00000001
# Input pattern 270:
0.95 0.09 0.32
# Output pattern 270:
00100000
# Input pattern 271:
0.82 0.82 0.55
# Input pattern 488:
0.58 0.03 0.38
# Output pattern 488:
10000000
# Input pattern 489:
0.34 0.51 0.57
# Output pattern 489:
00000001
# Input pattern 490:
0.19 0.8 0.5
# Output pattern 490:
00000001
# Input pattern 491:
0.99 0.82 0.28
# Output pattern 491:
00100000
# Input pattern 492:
0.37 0.29 0.57
# Output pattern 492:
10000000
# Input pattern 493:
0.3 0.92 0.57
# Output pattern 493:
00000010
# Input pattern 494:
0.87 0.34 0.92
# Output pattern 494:
00000010
# Input pattern 495:
0.23 0.54 0.38
# Output pattern 495:
00000001
# Input pattern 496:
0.69 0.3 0.1
# Output pattern 496:
01000000
# Input pattern 497:
0.45 0.68 0.15
# Output pattern 497:
01000000
# Input pattern 498:
0.85 0.19 0.14
# Output pattern 498:
01000000
# Input pattern 499:
0.13 0.9 0.09
124
# Input pattern 716:
0.77 0.61 0.24
# Output pattern 716:
01000000
# Input pattern 717:
0.51 0.96 0.56
# Output pattern 717:
00000010
# Input pattern 718:
0.26 0.75 0.37
# Output pattern 718:
00000001
# Input pattern 719:
0.74 0.39 0.67
# Output pattern 719:
10000000
# Input pattern 720:
0.03 0.92 0.04
# Output pattern 720:
00000010
# Input pattern 721:
0.26 0.6 0.31
# Output pattern 721:
00000001
# Input pattern 722:
0.84 0.44 0.73
# Output pattern 722:
10000000
# Input pattern 723:
0.77 0.09 0.24
# Output pattern 723:
10000000
# Input pattern 724:
0.28 0.45 0.34
# Output pattern 724:
00000001
# Input pattern 725:
0.84 0.33 0.49
# Output pattern 725:
10000000
# Input pattern 726:
0.4 0.7 0.56
# Output pattern 726:
00000001
# Input pattern 727:
0.84 0.99 1
# Output pattern 43:
10000000
# Input pattern 44:
0.77 0.29 0.31
# Output pattern 44:
10000000
# Input pattern 45:
0.9 0.17 0.61
# Output pattern 45:
10000000
# Input pattern 46:
0.05 0.29 0.81
# Output pattern 46:
00000001
# Input pattern 47:
0.37 0.23 0.96
# Output pattern 47:
00000010
# Input pattern 48:
0.4 0.05 0.03
# Output pattern 48:
01000000
# Input pattern 49:
0.5 0.84 0.05
# Output pattern 49:
01000000
# Input pattern 50:
0.66 0.84 0.61
# Output pattern 50:
01000000
# Input pattern 51:
0.58 0.8 0.48
# Output pattern 51:
01000000
# Input pattern 52:
0.17 0.2 0.56
# Output pattern 52:
00000001
# Input pattern 53:
0.23 0.19 0.36
# Output pattern 53:
10000000
# Input pattern 54:
0.58 0.04 0.1
# Output pattern 54:
10000000
# Output pattern 271:
01000000
# Input pattern 272:
0.54 0.56 0.26
# Output pattern 272:
01000000
# Input pattern 273:
0.91 0.19 0.67
# Output pattern 273:
00100000
# Input pattern 274:
0.73 0.11 0.44
# Output pattern 274:
10000000
# Input pattern 275:
0.14 0.21 0.09
# Output pattern 275:
01000000
# Input pattern 276:
0.85 0.88 0.89
# Output pattern 276:
00000001
# Input pattern 277:
0.04 0.13 0.47
# Output pattern 277:
00000001
# Input pattern 278:
0.27 0.21 0.67
# Output pattern 278:
10000000
# Input pattern 279:
0.87 0.58 0.85
# Output pattern 279:
10000000
# Input pattern 280:
0.14 0.26 0.66
# Output pattern 280:
00000001
# Input pattern 281:
0.03 0.03 0.82
# Output pattern 281:
10000000
# Input pattern 282:
0.23 0.55 0.79
# Output pattern 282:
00000001
# Output pattern 499:
01000000
# Input pattern 500:
0.88 0.37 0.98
# Output pattern 500:
00000010
# Input pattern 501:
0.3 0.1 0.29
# Output pattern 501:
10000000
# Input pattern 502:
0.25 0.46 0.42
# Output pattern 502:
00000001
# Input pattern 503:
0.38 0.82 0.6
# Output pattern 503:
00000001
# Input pattern 504:
0.26 0.75 0.79
# Output pattern 504:
00000001
# Input pattern 505:
0.33 0.48 0.06
# Output pattern 505:
01000000
# Input pattern 506:
0.62 0.29 0.94
# Output pattern 506:
00000010
# Input pattern 507:
0.39 0.15 0.98
# Output pattern 507:
00000010
# Input pattern 508:
0.57 0.43 0.87
# Output pattern 508:
10000000
# Input pattern 509:
0.44 0.76 0.2
# Output pattern 509:
01000000
# Input pattern 510:
0.77 0.6 0.34
# Output pattern 510:
01000000
125
# Output pattern 727:
00000010
# Input pattern 728:
0.59 0.95 0.26
# Output pattern 728:
00100000
# Input pattern 729:
0.56 0.31 0.84
# Output pattern 729:
10000000
# Input pattern 730:
0.55 0.79 0.32
# Output pattern 730:
01000000
# Input pattern 731:
0.98 0.01 0.11
# Output pattern 731:
00100000
# Input pattern 732:
0.12 0.36 0.07
# Output pattern 732:
01000000
# Input pattern 733:
0.5 0.54 0.92
# Output pattern 733:
00000010
# Input pattern 734:
0.57 0.43 0.66
# Output pattern 734:
10000000
# Input pattern 735:
0.26 0.13 0.34
# Output pattern 735:
10000000
# Input pattern 736:
0.77 0.77 0.9
# Output pattern 736:
10000000
# Input pattern 737:
0.3 0.22 0.17
# Output pattern 737:
01000000
# Input pattern 738:
0.59 0.74 0.68
# Output pattern 738:
00000001
# Input pattern 55:
0.72 0.67 0.12
# Output pattern 55:
01000000
# Input pattern 56:
0.96 0.14 0.33
# Output pattern 56:
00100000
# Input pattern 57:
0.71 0.81 0.04
# Output pattern 57:
01000000
# Input pattern 58:
0.45 0.27 0.12
# Output pattern 58:
01000000
# Input pattern 59:
0.81 0.06 0.76
# Output pattern 59:
10000000
# Input pattern 60:
0.49 0.77 0.18
# Output pattern 60:
01000000
# Input pattern 61:
0.96 0.34 0.13
# Output pattern 61:
00100000
# Input pattern 62:
0.36 0.33 0.7
# Output pattern 62:
10000000
# Input pattern 63:
0.49 0.61 0.62
# Output pattern 63:
00000001
# Input pattern 64:
0.44 0.99 0.34
# Output pattern 64:
00100000
# Input pattern 65:
0.07 0.77 0.85
# Output pattern 65:
00000001
# Input pattern 66:
0.79 0.82 0.85
# Input pattern 283:
0.51 0.44 0.68
# Output pattern 283:
10000000
# Input pattern 284:
0.1 0.98 0.82
# Output pattern 284:
00000010
# Input pattern 285:
0.5 0.3 0.4
# Output pattern 285:
10000000
# Input pattern 286:
0.02 0.62 0.28
# Output pattern 286:
00000001
# Input pattern 287:
0.01 0.11 0.05
# Output pattern 287:
00000001
# Input pattern 288:
0.57 0.36 0.28
# Output pattern 288:
01000000
# Input pattern 289:
0.17 0.67 0.79
# Output pattern 289:
00000001
# Input pattern 290:
0.7 0.29 0.64
# Output pattern 290:
10000000
# Input pattern 291:
0.47 0.1 0.03
# Output pattern 291:
01000000
# Input pattern 292:
0.73 0.89 0.89
# Output pattern 292:
00000001
# Input pattern 293:
0.04 0.75 0.74
# Output pattern 293:
00000001
# Input pattern 294:
0.13 0.31 0.9
# Input pattern 511:
0.99 0.51 0.32
# Output pattern 511:
00100000
# Input pattern 512:
0.33 0.02 0.24
# Output pattern 512:
10000000
# Input pattern 513:
0.82 0.3 0.76
# Output pattern 513:
10000000
# Input pattern 514:
0.82 0.75 0.4
# Output pattern 514:
01000000
# Input pattern 515:
0.39 0.23 0.86
# Output pattern 515:
10000000
# Input pattern 516:
0.22 0.81 0.39
# Output pattern 516:
00000001
# Input pattern 517:
0.51 0.48 0.24
# Output pattern 517:
01000000
# Input pattern 518:
0.87 0.04 0.63
# Output pattern 518:
10000000
# Input pattern 519:
0.23 0.8 0.02
# Output pattern 519:
01000000
# Input pattern 520:
0.27 0.04 0.74
# Output pattern 520:
10000000
# Input pattern 521:
0.44 0.82 0.91
# Output pattern 521:
00000010
# Input pattern 522:
0.42 0.84 0.41
126
# Input pattern 739:
0.81 0.9 0.93
# Output pattern 739:
00000010
# Input pattern 740:
0.02 0.67 0.67
# Output pattern 740:
00000001
# Input pattern 741:
0.41 0.35 0.17
# Output pattern 741:
01000000
# Input pattern 742:
0.04 0.72 0.49
# Output pattern 742:
00000001
# Input pattern 743:
0.55 0.06 0.9
# Output pattern 743:
10000000
# Input pattern 744:
0.35 0.8 0.79
# Output pattern 744:
00000001
# Input pattern 745:
0.09 0.88 0.51
# Output pattern 745:
00000001
# Input pattern 746:
0.15 0.41 0.19
# Output pattern 746:
00000001
# Input pattern 747:
0.51 0.56 0.51
# Output pattern 747:
00100000
# Input pattern 748:
0.01 0.55 0.85
# Output pattern 748:
00000001
# Input pattern 749:
0.38 0.94 0.41
# Output pattern 749:
00000010
# Input pattern 750:
0.47 0.11 0.46
# Output pattern 66:
00000001
# Input pattern 67:
0.99 0.69 0.37
# Output pattern 67:
00100000
# Input pattern 68:
0.03 0.43 0.15
# Output pattern 68:
00000001
# Input pattern 69:
0.44 0.69 0.62
# Output pattern 69:
00000001
# Input pattern 70:
0.37 0.12 0.41
# Output pattern 70:
10000000
# Input pattern 71:
0.38 0.24 0
# Output pattern 71:
01000000
# Input pattern 72:
1 0.75 0.04
# Output pattern 72:
00100000
# Input pattern 73:
0.62 0.65 0.45
# Output pattern 73:
01000000
# Input pattern 74:
0.54 0.73 0.19
# Output pattern 74:
01000000
# Input pattern 75:
0.35 0.08 0.25
# Output pattern 75:
10000000
# Input pattern 76:
0.04 0.97 0.18
# Output pattern 76:
00000010
# Input pattern 77:
0.04 0.31 0.49
# Output pattern 77:
00000001
# Output pattern 294:
00000001
# Input pattern 295:
0.6 0.07 0.58
# Output pattern 295:
10000000
# Input pattern 296:
0.99 0.36 0.57
# Output pattern 296:
00100000
# Input pattern 297:
0.17 0.67 0.69
# Output pattern 297:
00000001
# Input pattern 298:
0.25 0.81 0.62
# Output pattern 298:
00000001
# Input pattern 299:
0.59 0.53 0.55
# Output pattern 299:
10000000
# Input pattern 300:
0.26 0.33 0.36
# Output pattern 300:
00000001
# Input pattern 301:
0.61 0.08 0.73
# Output pattern 301:
10000000
# Input pattern 302:
0.11 0.08 0.94
# Output pattern 302:
00000010
# Input pattern 303:
0.17 0.04 0.32
# Output pattern 303:
10000000
# Input pattern 304:
0.64 0.25 0.05
# Output pattern 304:
01000000
# Input pattern 305:
0.11 0.99 0.5
# Output pattern 305:
00000010
# Output pattern 522:
01000000
# Input pattern 523:
0.48 0.02 0.28
# Output pattern 523:
10000000
# Input pattern 524:
0.84 0.78 0.52
# Output pattern 524:
01000000
# Input pattern 525:
0.74 0.83 0.69
# Output pattern 525:
01000000
# Input pattern 526:
0.91 0.79 0.42
# Output pattern 526:
00100000
# Input pattern 527:
0.63 0.51 0.38
# Output pattern 527:
01000000
# Input pattern 528:
0.73 0.91 0.85
# Output pattern 528:
00000010
# Input pattern 529:
0.1 0.65 0.7
# Output pattern 529:
00000001
# Input pattern 530:
0.24 0.63 0.64
# Output pattern 530:
00000001
# Input pattern 531:
0.96 0.99 0.51
# Output pattern 531:
00100000
# Input pattern 532:
0.53 0.11 0.77
# Output pattern 532:
10000000
# Input pattern 533:
0.2 0.22 0.04
# Output pattern 533:
01000000
127
# Output pattern 750:
10000000
# Input pattern 751:
0.65 0.04 0.45
# Output pattern 751:
10000000
# Input pattern 752:
0.61 0.44 0.03
# Output pattern 752:
01000000
# Input pattern 753:
0.21 0.91 0.85
# Output pattern 753:
00000011
# Input pattern 754:
0.2 0.21 0.62
# Output pattern 754:
00000001
# Input pattern 755:
0.6 0.66 0.22
# Output pattern 755:
01000000
# Input pattern 756:
0.12 0.83 0.69
# Output pattern 756:
00000001
# Input pattern 757:
0.79 0.32 0.72
# Output pattern 757:
10000000
# Input pattern 758:
0.55 0.48 0.52
# Output pattern 758:
10000000
# Input pattern 759:
0.07 0.1 0.83
# Output pattern 759:
00000001
# Input pattern 760:
0.84 0.33 0.09
# Output pattern 760:
01000000
# Input pattern 761:
0.28 0.54 0.25
# Output pattern 761:
01000000
# Input pattern 78:
0.19 0.25 0.41
# Output pattern 78:
00000001
# Input pattern 79:
0.88 0.16 0.01
# Output pattern 79:
01000000
# Input pattern 80:
0.1 0.78 0.31
# Output pattern 80:
00000001
# Input pattern 81:
0.96 0.88 0.25
# Output pattern 81:
00100000
# Input pattern 82:
0.1 0.04 0.93
# Output pattern 82:
00000010
# Input pattern 83:
0.49 0.52 0.25
# Output pattern 83:
01000000
# Input pattern 84:
0.64 0.18 0.73
# Output pattern 84:
10000000
# Input pattern 85:
0.32 0.98 0.72
# Output pattern 85:
00000010
# Input pattern 86:
0.87 0.03 0.94
# Output pattern 86:
00000010
# Input pattern 87:
0.96 0.5 0.18
# Output pattern 87:
00100000
# Input pattern 88:
0.29 0.77 0.75
# Output pattern 88:
00000001
# Input pattern 89:
0.39 0.58 0.61
# Input pattern 306:
0.57 0.48 0.09
# Output pattern 306:
01000000
# Input pattern 307:
0.6 0.49 0.7
# Output pattern 307:
10000000
# Input pattern 308:
0.58 0.66 0.89
# Output pattern 308:
00000001
# Input pattern 309:
0.33 0.56 0.8
# Output pattern 309:
00000001
# Input pattern 310:
0.04 0.76 0.99
# Output pattern 310:
00000010
# Input pattern 311:
0.36 0.82 0.11
# Output pattern 311:
01000000
# Input pattern 312:
0.63 0.19 0.66
# Output pattern 312:
10000000
# Input pattern 313:
0.67 0.31 0.11
# Output pattern 313:
01000000
# Input pattern 314:
0.78 0.31 0.44
# Output pattern 314:
10000000
# Input pattern 315:
0.4 0.32 0.12
# Output pattern 315:
01000000
# Input pattern 316:
0.66 0.98 0.48
# Output pattern 316:
00100000
# Input pattern 317:
0.24 0.9 0.41
# Input pattern 534:
0.12 0.38 0.08
# Output pattern 534:
01000000
# Input pattern 535:
0.47 0.3 0.8
# Output pattern 535:
10000000
# Input pattern 536:
0.07 0.13 0.14
# Output pattern 536:
00000001
# Input pattern 537:
0.5 0.8 0.81
# Output pattern 537:
00000001
# Input pattern 538:
0.38 0.04 0.56
# Output pattern 538:
10000000
# Input pattern 539:
0.9 0.58 0.76
# Output pattern 539:
10000000
# Input pattern 540:
0.15 0.85 0.53
# Output pattern 540:
00000001
# Input pattern 541:
0.9 0.98 0.71
# Output pattern 541:
00100000
# Input pattern 542:
0.63 0.85 0.81
# Output pattern 542:
00000001
# Input pattern 543:
0.01 0.01 0.09
# Output pattern 543:
10000000
# Input pattern 544:
0.74 0.82 0.94
# Output pattern 544:
00000010
# Input pattern 545:
0.82 0.02 0.67
128
# Input pattern 762:
0.01 0.56 0.46
# Output pattern 762:
00000001
# Input pattern 763:
0.49 0.49 0.07
# Output pattern 763:
01000000
# Input pattern 764:
0.44 0.51 0.97
# Output pattern 764:
00000010
# Input pattern 765:
0.21 0.29 0.81
# Output pattern 765:
00000001
# Input pattern 766:
0.35 0.55 0.65
# Output pattern 766:
00000001
# Input pattern 767:
0.66 0.21 0.59
# Output pattern 767:
10000000
# Input pattern 768:
0.58 0.9 0.53
# Output pattern 768:
01000000
# Input pattern 769:
0.76 0.71 0.89
# Output pattern 769:
10000000
# Input pattern 770:
0.24 0.81 0.58
# Output pattern 770:
00000001
# Input pattern 771:
0.4 0.29 0.8
# Output pattern 771:
10000000
# Input pattern 772:
0.4 0.23 0.26
# Output pattern 772:
10000000
# Input pattern 773:
0.35 0.02 0.69
# Output pattern 89:
00000001
# Input pattern 90:
0.57 0.52 0.77
# Output pattern 90:
10000000
# Input pattern 91:
0.65 0.81 0.4
# Output pattern 91:
01000000
# Input pattern 92:
0.43 0.29 0.26
# Output pattern 92:
01000000
# Input pattern 93:
0.01 0.49 0.92
# Output pattern 93:
00000010
# Input pattern 94:
0.06 0.7 0.06
# Output pattern 94:
01000000
# Input pattern 95:
0.27 0.7 0.02
# Output pattern 95:
01000000
# Input pattern 96:
0.21 0.74 0.6
# Output pattern 96:
00000001
# Input pattern 97:
0.68 0.82 0.62
# Output pattern 97:
01000000
# Input pattern 98:
0.1 0.96 0.08
# Output pattern 98:
00100000
# Input pattern 99:
0.29 0.4 0.15
# Output pattern 99:
01000000
# Input pattern 100:
0.32 0.97 0.72
# Output pattern 100:
00000010
# Output pattern 317:
00000001
# Input pattern 318:
0.01 0.38 0.53
# Output pattern 318:
00000001
# Input pattern 319:
0.48 0.29 0.82
# Output pattern 319:
10000000
# Input pattern 320:
0.07 0.34 0.4
# Output pattern 320:
00000001
# Input pattern 321:
0.26 1 0
# Output pattern 321:
00100000
# Input pattern 322:
0.23 0.65 0.21
# Output pattern 322:
01000000
# Input pattern 323:
0.34 0.2 0.1
# Output pattern 323:
01000000
# Input pattern 324:
0.61 0.18 0.61
# Output pattern 324:
10000000
# Input pattern 325:
0.06 0.44 0.63
# Output pattern 325:
00000001
# Input pattern 326:
0.07 0.26 0.02
# Output pattern 326:
01000000
# Input pattern 327:
0.75 0.98 0.06
# Output pattern 327:
00100000
# Input pattern 328:
0.1 0.95 0.57
# Output pattern 328:
00000010
# Output pattern 545:
10000000
# Input pattern 546:
0.16 0.3 0.65
# Output pattern 546:
00000001
# Input pattern 547:
0.58 0.44 0.09
# Output pattern 547:
01000000
# Input pattern 548:
0.43 0.12 0.55
# Output pattern 548:
10000000
# Input pattern 549:
0.47 0.42 0.02
# Output pattern 549:
01000000
# Input pattern 550:
0.67 0.19 0.22
# Output pattern 550:
10000000
# Input pattern 551:
0.09 0.9 0.7
# Output pattern 551:
00000001
# Input pattern 552:
0.73 0.54 0.39
# Output pattern 552:
01000000
# Input pattern 553:
0.83 0.54 0.12
# Output pattern 553:
01000000
# Input pattern 554:
0.91 0.35 0.88
# Output pattern 554:
00100000
# Input pattern 555:
0.5 0.09 0.14
# Output pattern 555:
10000000
# Input pattern 556:
0.23 0.48 0.94
# Output pattern 556:
00000010
129
# Output pattern 773:
10000000
# Input pattern 774:
0.98 0.04 0.85
# Output pattern 774:
00100000
# Input pattern 775:
0.71 0.07 0.57
# Output pattern 775:
10000000
# Input pattern 776:
0.05 0.91 0.15
# Output pattern 776:
00000010
# Input pattern 777:
0.69 0.93 0.21
# Output pattern 777:
00100000
# Input pattern 778:
0.41 0.51 0.71
# Output pattern 778:
00000001
# Input pattern 779:
0.21 0.46 0.22
# Output pattern 779:
00000001
# Input pattern 780:
0.68 0.55 0.82
# Output pattern 780:
10000000
# Input pattern 781:
0.02 0.65 0.37
# Output pattern 781:
00000001
# Input pattern 782:
0.02 0.47 0.71
# Output pattern 782:
00000001
# Input pattern 783:
0.72 0.29 0.42
# Output pattern 783:
10000000
# Input pattern 784:
0.8 0.61 0.71
# Output pattern 784:
10000000
# Input pattern 101:
0.37 0.39 0.99
# Output pattern 101:
00000010
# Input pattern 102:
0.7 0.91 0.77
# Output pattern 102:
00000010
# Input pattern 103:
0.44 0.99 0.16
# Output pattern 103:
00100000
# Input pattern 104:
0.94 0.57 0.04
# Output pattern 104:
00100000
# Input pattern 105:
0.99 0.33 0.37
# Output pattern 105:
00100000
# Input pattern 106:
0.67 0.4 0.19
# Output pattern 106:
01000000
# Input pattern 107:
0.7 0.61 0.82
# Output pattern 107:
10000000
# Input pattern 108:
0.22 0.68 0.35
# Output pattern 108:
00000001
# Input pattern 109:
0.62 0.22 0.9
# Output pattern 109:
10000000
# Input pattern 110:
0.78 0.89 0.3
# Output pattern 110:
01000000
# Input pattern 111:
0.37 0.3 0.57
# Output pattern 111:
10000000
# Input pattern 112:
0.68 0.78 0.23
# Input pattern 329:
0.35 0.95 0.34
# Output pattern 329:
00100000
# Input pattern 330:
0.12 0.8 0.69
# Output pattern 330:
00000001
# Input pattern 331:
0.72 0.44 0.68
# Output pattern 331:
10000000
# Input pattern 332:
0.83 0.21 0.67
# Output pattern 332:
10000000
# Input pattern 333:
0.71 0.18 0.81
# Output pattern 333:
10000000
# Input pattern 334:
0.03 0 0.85
# Output pattern 334:
10000000
# Input pattern 335:
0.41 0.57 0.68
# Output pattern 335:
00000001
# Input pattern 336:
0.89 0.15 0.66
# Output pattern 336:
10000000
# Input pattern 337:
0.82 0.09 0.97
# Output pattern 337:
00000010
# Input pattern 338:
0.95 0.54 0.45
# Output pattern 338:
00100000
# Input pattern 339:
0.44 0.57 0.56
# Output pattern 339:
00000001
# Input pattern 340:
0.97 0.48 0.45
# Input pattern 557:
0.75 0.71 0.26
# Output pattern 557:
01000000
# Input pattern 558:
0.96 0.47 0.78
# Output pattern 558:
00100000
# Input pattern 559:
0.05 0.91 0.91
# Output pattern 559:
00000010
# Input pattern 560:
0.66 0.09 0.51
# Output pattern 560:
10000000
# Input pattern 561:
0.41 0.79 0.35
# Output pattern 561:
01000000
# Input pattern 562:
0.42 0.71 0.3
# Output pattern 562:
01000000
# Input pattern 563:
0.12 0.56 0.04
# Output pattern 563:
01000000
# Input pattern 564:
0.19 0.47 0.4
# Output pattern 564:
00000001
# Input pattern 565:
0.5 0.57 0.33
# Output pattern 565:
01000000
# Input pattern 566:
0.87 0.14 0.97
# Output pattern 566:
00000010
# Input pattern 567:
0.2 0.11 0.77
# Output pattern 567:
10000000
# Input pattern 568:
0.39 0.51 0.23
130
# Input pattern 785:
0.39 0.65 0.22
# Output pattern 785:
01000000
# Input pattern 786:
0.85 0.06 0.31
# Output pattern 786:
10000000
# Input pattern 787:
0.85 0.36 0.48
# Output pattern 787:
10000000
# Input pattern 788:
0.84 0.05 0.41
# Output pattern 788:
10000000
# Input pattern 789:
0.39 0.79 0.41
# Output pattern 789:
00000001
# Input pattern 790:
0.05 0.1 0.42
# Output pattern 790:
00000001
# Input pattern 791:
0.05 0.39 0.21
# Output pattern 791:
00000001
# Input pattern 792:
0.5 0.18 0.54
# Output pattern 792:
10000000
# Input pattern 793:
0.66 0.22 0.7
# Output pattern 793:
10000000
# Input pattern 794:
0.23 0.56 0.1
# Output pattern 794:
01000000
# Input pattern 795:
0.2 0.42 0.04
# Output pattern 795:
01000000
# Input pattern 796:
0.67 0.04 0.14
# Output pattern 112:
01000000
# Input pattern 113:
0.89 0.46 0.81
# Output pattern 113:
10000000
# Input pattern 114:
0.1 0.23 0.31
# Output pattern 114:
00000001
# Input pattern 115:
0.45 0.12 0.79
# Output pattern 115:
10000000
# Input pattern 116:
0.16 0.13 0.87
# Output pattern 116:
10000000
# Input pattern 117:
0.71 0.6 0.37
# Output pattern 117:
01000000
# Input pattern 118:
0.2 0.44 0.69
# Output pattern 118:
00000001
# Input pattern 119:
0.03 0.14 0.54
# Output pattern 119:
00000001
# Input pattern 120:
0.31 0.29 0.25
# Output pattern 120:
01000000
# Input pattern 121:
0.75 0.55 0.57
# Output pattern 121:
10000000
# Input pattern 122:
0.8 0.02 0.67
# Output pattern 122:
10000000
# Input pattern 123:
0.09 0.34 0.55
# Output pattern 123:
00000001
# Output pattern 340:
00100000
# Input pattern 341:
0.32 0.07 0.26
# Output pattern 341:
10000000
# Input pattern 342:
0.44 0.87 0.4
# Output pattern 342:
01000000
# Input pattern 343:
0.77 0.06 0.59
# Output pattern 343:
10000000
# Input pattern 344:
0.43 0.35 0.63
# Output pattern 344:
10000000
# Input pattern 345:
0.04 0.43 0.76
# Output pattern 345:
00000001
# Input pattern 346:
0.63 0.94 0.26
# Output pattern 346:
00100000
# Input pattern 347:
0.99 0.96 0.58
# Output pattern 347:
00100000
# Input pattern 348:
0.67 0.41 0
# Output pattern 348:
01000000
# Input pattern 349:
0.63 0.46 0.52
# Output pattern 349:
10000000
# Input pattern 350:
0.17 0.84 0.21
# Output pattern 350:
00000001
# Input pattern 351:
0.81 0.78 0.28
# Output pattern 351:
01000000
# Output pattern 568:
01000000
# Input pattern 569:
0.06 0.33 0.57
# Output pattern 569:
00000001
# Input pattern 570:
0.21 0.35 0.75
# Output pattern 570:
00000001
# Input pattern 571:
0.8 0.98 0.72
# Output pattern 571:
00100000
# Input pattern 572:
0.14 0.1 0.82
# Output pattern 572:
10000000
# Input pattern 573:
0.66 0.21 0.54
# Output pattern 573:
10000000
# Input pattern 574:
0.05 0.49 0.17
# Output pattern 574:
00000001
# Input pattern 575:
0.2 0.22 0.2
# Output pattern 575:
00100000
# Input pattern 576:
0.42 0.09 0.3
# Output pattern 576:
10000000
# Input pattern 577:
0.6 0.33 0.24
# Output pattern 577:
01000000
# Input pattern 578:
0.33 0.87 0.55
# Output pattern 578:
00000001
# Input pattern 579:
0.86 0.65 0.33
# Output pattern 579:
01000000
131
# Output pattern 796:
10000000
# Input pattern 797:
0.22 0.93 0.05
# Output pattern 797:
00100000
# Input pattern 798:
0.21 0 0.42
# Output pattern 798:
10000000
# Input pattern 799:
0.26 0.14 0.6
# Output pattern 799:
10000000
# Input pattern 800:
0.93 0.16 0.34
# Output pattern 800:
00100000
# Input pattern 801:
0.38 0.39 0.72
# Output pattern 801:
00000001
# Input pattern 802:
0.01 0.37 0.66
# Output pattern 802:
00000001
# Input pattern 803:
0.14 0.25 0.1
# Output pattern 803:
01000000
# Input pattern 804:
0.02 1 0.71
# Output pattern 804:
00000010
# Input pattern 805:
0.29 0.55 0.72
# Output pattern 805:
00000001
# Input pattern 806:
0.69 0.93 0.41
# Output pattern 806:
00100000
# Input pattern 807:
0.31 0.2 0.74
# Output pattern 807:
10000000
# Input pattern 124:
0.19 0.53 0.9
# Output pattern 124:
00000001
# Input pattern 125:
0.64 0.45 0.71
# Output pattern 125:
10000000
# Input pattern 126:
0.11 0.93 0.08
# Output pattern 126:
00100000
# Input pattern 127:
0.01 0.13 0.26
# Output pattern 127:
00000001
# Input pattern 128:
0.22 0.46 0.33
# Output pattern 128:
00000001
# Input pattern 129:
0.68 0.01 0.45
# Output pattern 129:
10000000
# Input pattern 130:
0.12 0.17 0.47
# Output pattern 130:
00000001
# Input pattern 131:
0.89 0.96 0.36
# Output pattern 131:
00100000
# Input pattern 132:
0.15 0.75 0.64
# Output pattern 132:
00000001
# Input pattern 133:
0.68 0.74 0.6
# Output pattern 133:
01000000
# Input pattern 134:
0.62 0.04 0.96
# Output pattern 134:
00000010
# Input pattern 135:
0.25 0.99 0.15
# Input pattern 352:
0.91 0.02 0.99
# Output pattern 352:
00001000
# Input pattern 353:
0.87 0.24 0.39
# Output pattern 353:
10000000
# Input pattern 354:
0.67 0.78 0.86
# Output pattern 354:
00000001
# Input pattern 355:
0.04 0.82 0.33
# Output pattern 355:
00000001
# Input pattern 356:
0.29 0.22 0.52
# Output pattern 356:
10000000
# Input pattern 357:
0.24 0.98 0.5
# Output pattern 357:
00000010
# Input pattern 358:
0.04 0.52 0.02
# Output pattern 358:
01000000
# Input pattern 359:
0.54 0.95 0.12
# Output pattern 359:
00100000
# Input pattern 360:
0.02 0.73 0.99
# Output pattern 360:
00000010
# Input pattern 361:
0.55 0.77 0.24
# Output pattern 361:
01000000
# Input pattern 362:
0.17 0.37 0.95
# Output pattern 362:
00000010
# Input pattern 363:
0.86 0.94 0.46
# Input pattern 580:
0.43 0.57 0.42
# Output pattern 580:
01000000
# Input pattern 581:
0.57 0.86 0.77
# Output pattern 581:
00000001
# Input pattern 582:
0.38 0.08 0.14
# Output pattern 582:
10000000
# Input pattern 583:
0.75 0.88 0.52
# Output pattern 583:
01000000
# Input pattern 584:
0.28 0.09 0.48
# Output pattern 584:
10000000
# Input pattern 585:
0.01 0.38 0.77
# Output pattern 585:
00000001
# Input pattern 586:
0.69 0.44 0.73
# Output pattern 586:
10000000
# Input pattern 587:
0.26 0.92 0.34
# Output pattern 587:
00000010
# Input pattern 588:
0.76 0.35 0.96
# Output pattern 588:
00000010
# Input pattern 589:
0.2 0.92 0.14
# Output pattern 589:
00100000
# Input pattern 590:
0.24 0.63 0.96
# Output pattern 590:
00000010
# Input pattern 591:
0.25 0.71 0.35
132
# Input pattern 808:
0.5 0.36 0.89
# Output pattern 808:
10000000
# Input pattern 809:
0.51 0.71 0.18
# Output pattern 809:
01000000
# Input pattern 810:
0.52 0.83 0.51
# Output pattern 810:
01000000
# Input pattern 811:
0.74 0.14 0.47
# Output pattern 811:
10000000
# Input pattern 812:
0.51 0.25 0.46
# Output pattern 812:
10000000
# Input pattern 813:
0.61 0.88 0.61
# Output pattern 813:
00100000
# Input pattern 814:
0.49 0.45 0.28
# Output pattern 814:
01000000
# Input pattern 815:
0.24 0.39 0.59
# Output pattern 815:
00000001
# Input pattern 816:
0.58 0.25 0.65
# Output pattern 816:
10000000
# Input pattern 817:
0.3 0.22 0.29
# Output pattern 817:
10000000
# Input pattern 818:
0.84 0.09 0.88
# Output pattern 818:
10000000
# Input pattern 819:
0.33 0.66 0.69
# Output pattern 135:
00100000
# Input pattern 136:
0.43 0.28 0.33
# Output pattern 136:
10000000
# Input pattern 137:
0.89 0.96 0.15
# Output pattern 137:
00100000
# Input pattern 138:
0.86 0.13 0.97
# Output pattern 138:
00000010
# Input pattern 139:
0.26 0.07 0.9
# Output pattern 139:
10000000
# Input pattern 140:
0.41 0.16 0.63
# Output pattern 140:
10000000
# Input pattern 141:
0.73 0.36 0.91
# Output pattern 141:
00000010
# Input pattern 142:
0.93 0.33 0.76
# Output pattern 142:
00100000
# Input pattern 143:
0.01 0.88 0.12
# Output pattern 143:
00000001
# Input pattern 144:
0.35 0.8 0.41
# Output pattern 144:
00000001
# Input pattern 145:
0.91 0.26 0.69
# Output pattern 145:
00100000
# Input pattern 146:
0.42 0.33 0.4
# Output pattern 146:
10000000
# Output pattern 363:
00100000
# Input pattern 364:
0.74 0.46 0.75
# Output pattern 364:
10000000
# Input pattern 365:
0.49 0.18 0.73
# Output pattern 365:
10000000
# Input pattern 366:
0.64 0.33 0.23
# Output pattern 366:
01000000
# Input pattern 367:
0.6 0.84 0.75
# Output pattern 367:
00000001
# Input pattern 368:
0.68 0.82 0.23
# Output pattern 368:
01000000
# Input pattern 369:
0.14 0.73 0.36
# Output pattern 369:
00000001
# Input pattern 370:
0.81 0.31 0.04
# Output pattern 370:
01000000
# Input pattern 371:
0.23 0.82 0.18
# Output pattern 371:
01000000
# Input pattern 372:
0.47 0.65 0.91
# Output pattern 372:
00000010
# Input pattern 373:
0.39 0.76 0.91
# Output pattern 373:
00000010
# Input pattern 374:
0.12 0.55 0.41
# Output pattern 374:
00000001
# Output pattern 591:
00000001
# Input pattern 592:
0.31 0.15 0.43
# Output pattern 592:
10000000
# Input pattern 593:
0.89 0.01 0.6
# Output pattern 593:
10000000
# Input pattern 594:
0.18 0.25 0.5
# Output pattern 594:
00000001
# Input pattern 595:
0.52 0.35 0.56
# Output pattern 595:
10000000
# Input pattern 596:
0.3 0.03 0.39
# Output pattern 596:
10000000
# Input pattern 597:
0.01 0.4 0.96
# Output pattern 597:
00000010
# Input pattern 598:
0.24 0.63 0.92
# Output pattern 598:
00000010
# Input pattern 599:
0.59 0.81 0.35
# Output pattern 599:
01000000
# Input pattern 600:
0.01 0.97 0.24
# Output pattern 600:
00000010
# Input pattern 601:
0.85 0.93 0.03
# Output pattern 601:
00100000
# Input pattern 602:
0.66 0.5 0.56
# Output pattern 602:
10000000
133
# Output pattern 819:
00000001
# Input pattern 820:
0.02 0.97 0.89
# Output pattern 820:
00000010
# Input pattern 821:
0.25 0.77 0.43
# Output pattern 821:
00000001
# Input pattern 822:
0.41 0.16 0.53
# Output pattern 822:
10000000
# Input pattern 823:
0.45 0.61 0.98
# Output pattern 823:
00000010
# Input pattern 824:
0.66 0.62 0.85
# Output pattern 824:
10000000
# Input pattern 825:
0.76 0.27 0.35
# Output pattern 825:
10000000
# Input pattern 826:
0.19 0.91 0.43
# Output pattern 826:
00000010
# Input pattern 827:
0.27 0.15 0.78
# Output pattern 827:
10000000
# Input pattern 828:
0.05 0.91 0.1
# Output pattern 828:
00000010
# Input pattern 829:
0.82 0.23 0.76
# Output pattern 829:
10000000
# Input pattern 830:
0.73 0.34 0.25
# Output pattern 830:
01000000
# Input pattern 147:
0.16 0.3 0.1
# Output pattern 147:
01000000
# Input pattern 148:
0.25 0.21 0.82
# Output pattern 148:
10000000
# Input pattern 149:
0.82 0 0.46
# Output pattern 149:
10000000
# Input pattern 150:
0.01 0.14 0.19
# Output pattern 150:
00000001
# Input pattern 151:
0.98 0.58 0.13
# Output pattern 151:
00100000
# Input pattern 152:
0.1 0.69 0.8
# Output pattern 152:
00000001
# Input pattern 153:
0.16 0.57 0.71
# Output pattern 153:
00000001
# Input pattern 154:
0.57 0.7 0.67
# Output pattern 154:
00000001
# Input pattern 155:
0.56 0.34 0.48
# Output pattern 155:
10000000
# Input pattern 156:
0.6 0.29 0.5
# Output pattern 156:
10000000
# Input pattern 157:
0.17 0.53 0.15
# Output pattern 157:
01000000
# Input pattern 158:
0.06 0.75 0.75
# Input pattern 375:
0.94 0.89 0.29
# Output pattern 375:
00100000
# Input pattern 376:
0.21 0.84 0.94
# Output pattern 376:
00000010
# Input pattern 377:
0.74 0.43 0.47
# Output pattern 377:
10000000
# Input pattern 378:
0.3 0.57 0.22
# Output pattern 378:
01000000
# Input pattern 379:
0.31 0.24 0.34
# Output pattern 379:
10000000
# Input pattern 380:
0.26 0.63 0.4
# Output pattern 380:
00000001
# Input pattern 381:
0.25 0.21 0.34
# Output pattern 381:
10000000
# Input pattern 382:
0.9 0.88 0.93
# Output pattern 382:
00000010
# Input pattern 383:
0.41 0.7 0.26
# Output pattern 383:
01000000
# Input pattern 384:
0.32 0.51 0.82
# Output pattern 384:
00000001
# Input pattern 385:
0.54 0.18 0.93
# Output pattern 385:
00000010
# Input pattern 386:
0.84 0.62 0.44
# Input pattern 603:
0.86 0.47 0.84
# Output pattern 603:
10000000
# Input pattern 604:
0.96 0.34 0.09
# Output pattern 604:
00100000
# Input pattern 605:
0.81 0.91 0.62
# Output pattern 605:
00100000
# Input pattern 606:
0.64 0.19 0.11
# Output pattern 606:
01000000
# Input pattern 607:
0.77 0.7 0.64
# Output pattern 607:
01000000
# Input pattern 608:
0.21 0.19 0.19
# Output pattern 608:
10000000
# Input pattern 609:
0.85 0.98 0.63
# Output pattern 609:
00100000
# Input pattern 610:
0.03 0.78 0.98
# Output pattern 610:
00000010
# Input pattern 611:
0.58 0.9 0
# Output pattern 611:
01000000
# Input pattern 612:
0.78 0.88 0.76
# Output pattern 612:
01000000
# Input pattern 613:
0.53 0.37 0.32
# Output pattern 613:
01000000
# Input pattern 614:
0.57 0.58 0.61
134
# Input pattern 831:
0.18 0.39 0.58
# Output pattern 831:
00000001
# Input pattern 832:
0.2 0.83 0.51
# Output pattern 832:
00000001
# Input pattern 833:
0.81 0.12 0.03
# Output pattern 833:
01000000
# Input pattern 834:
0.93 0.29 0.62
# Output pattern 834:
00100000
# Input pattern 835:
0.21 0.64 0.36
# Output pattern 835:
00000001
# Input pattern 836:
0.37 0.43 0.46
# Output pattern 836:
00000001
# Input pattern 837:
0.6 0.15 0.62
# Output pattern 837:
10000000
# Input pattern 838:
0.57 0.69 0.82
# Output pattern 838:
00000001
# Input pattern 839:
0.72 0.36 0.61
# Output pattern 839:
10000000
# Input pattern 840:
0.07 0.71 0.58
# Output pattern 840:
00000001
# Input pattern 841:
0.7 0.8 0.6
# Output pattern 841:
01000000
# Input pattern 842:
0.53 0.6 0.64
# Output pattern 158:
00000001
# Input pattern 159:
0.97 0.92 0.99
# Output pattern 159:
00001000
# Input pattern 160:
0.4 0.66 0.91
# Output pattern 160:
00000010
# Input pattern 161:
0.11 0.93 0.85
# Output pattern 161:
00000010
# Input pattern 162:
0.53 0.96 0.37
# Output pattern 162:
00100000
# Input pattern 163:
0.38 0.14 0.44
# Output pattern 163:
10000000
# Input pattern 164:
0.52 0.69 0.26
# Output pattern 164:
01000000
# Input pattern 165:
0.74 0.98 0.96
# Output pattern 165:
00000010
# Input pattern 166:
0.01 0.19 0.25
# Output pattern 166:
00000001
# Input pattern 167:
0.89 0.21 0.12
# Output pattern 167:
01000000
# Input pattern 168:
0.67 0.02 0.08
# Output pattern 168:
10000000
# Input pattern 169:
0.7 0.47 0.62
# Output pattern 169:
10000000
# Output pattern 386:
01000000
# Input pattern 387:
0.99 0.33 0.82
# Output pattern 387:
00100000
# Input pattern 388:
0.73 0.66 0.02
# Output pattern 388:
01000000
# Input pattern 389:
0.49 0.99 0.63
# Output pattern 389:
00000010
# Input pattern 390:
0.99 0.39 0.29
# Output pattern 390:
00100000
# Input pattern 391:
0.3 0.81 0.15
# Output pattern 391:
01000000
# Input pattern 392:
0.44 0.51 0.4
# Output pattern 392:
01000000
# Input pattern 393:
0.04 0.86 0.77
# Output pattern 393:
00000001
# Input pattern 394:
0.59 0.09 0.43
# Output pattern 394:
10000000
# Input pattern 395:
0.24 0.62 0.66
# Output pattern 395:
00000001
# Input pattern 396:
0.05 0.69 0.94
# Output pattern 396:
00000010
# Input pattern 397:
0.52 0.78 0.39
# Output pattern 397:
01000000
# Output pattern 614:
00000001
# Input pattern 615:
0.8 0.49 0
# Output pattern 615:
01000000
# Input pattern 616:
0.3 0.87 0.74
# Output pattern 616:
00000001
# Input pattern 617:
0.05 0.82 0.43
# Output pattern 617:
00000001
# Input pattern 618:
0.33 0.53 0.49
# Output pattern 618:
00000001
# Input pattern 619:
0.44 0.89 0.17
# Output pattern 619:
01000000
# Input pattern 620:
0.43 0.81 0.26
# Output pattern 620:
01000000
# Input pattern 621:
0.61 0.54 0.93
# Output pattern 621:
00000010
# Input pattern 622:
0.72 0.82 0.9
# Output pattern 622:
00000001
# Input pattern 623:
0.69 0.1 0.36
# Output pattern 623:
10000000
# Input pattern 624:
0.18 0.36 0.16
# Output pattern 624:
01000000
# Input pattern 625:
0.37 0.61 0.36
# Output pattern 625:
01000000
135
# Output pattern 842:
00000001
# Input pattern 843:
0.57 0.19 0.39
# Output pattern 843:
10000000
# Input pattern 844:
0.04 0.58 0.89
# Output pattern 844:
00000001
# Input pattern 845:
0.73 0.58 0.54
# Output pattern 845:
01000000
# Input pattern 846:
0.1 0.49 0.58
# Output pattern 846:
00000001
# Input pattern 847:
0.64 0.35 0.13
# Output pattern 847:
01000000
# Input pattern 848:
0.06 0.18 0.02
# Output pattern 848:
01000000
# Input pattern 849:
0.56 0.31 0.94
# Output pattern 849:
00000010
# Input pattern 850:
0.74 0.26 0.76
# Output pattern 850:
10000000
# Input pattern 851:
0.58 0.75 0.97
# Output pattern 851:
00000010
# Input pattern 852:
0.47 0.38 0.12
# Output pattern 852:
01000000
# Input pattern 853:
0.69 0.03 0.08
# Output pattern 853:
10000000
# Input pattern 170:
0.93 0.19 0.76
# Output pattern 170:
00100000
# Input pattern 171:
0.23 0.99 0.73
# Output pattern 171:
00000010
# Input pattern 172:
0.37 0.56 0.93
# Output pattern 172:
00000010
# Input pattern 173:
0.7 0.2 0.38
# Output pattern 173:
10000000
# Input pattern 174:
0.05 0.09 0.27
# Output pattern 174:
00000001
# Input pattern 175:
0.1 0.14 0.07
# Output pattern 175:
01000000
# Input pattern 176:
0.81 0.38 0.66
# Output pattern 176:
10000000
# Input pattern 177:
0.25 0.53 0.85
# Output pattern 177:
00000001
# Input pattern 178:
0.9 0.74 0.7
# Output pattern 178:
01000000
# Input pattern 179:
0.44 0.69 0.97
# Output pattern 179:
00000010
# Input pattern 180:
0.6 0.24 0.32
# Output pattern 180:
10000000
# Input pattern 181:
0.76 0.93 0.78
# Input pattern 398:
0.64 0.54 0.7
# Output pattern 398:
10000000
# Input pattern 399:
0.53 0.83 0.9
# Output pattern 399:
00000001
# Input pattern 400:
0.38 0.64 0.9
# Output pattern 400:
00000001
# Input pattern 401:
0.09 0.77 0.06
# Output pattern 401:
01000000
# Input pattern 402:
0.64 0.82 0.11
# Output pattern 402:
01000000
# Input pattern 403:
0.43 0.41 0.52
# Output pattern 403:
10000000
# Input pattern 404:
0.04 0.57 0.26
# Output pattern 404:
00000001
# Input pattern 405:
0.12 0.9 0.51
# Output pattern 405:
00000001
# Input pattern 406:
0.29 0.21 0.89
# Output pattern 406:
10000000
# Input pattern 407:
0.31 0.9 0.28
# Output pattern 407:
01000000
# Input pattern 408:
0.95 0.43 0.38
# Output pattern 408:
00100000
# Input pattern 409:
0.15 0.06 0.02
# Input pattern 626:
0.04 0.68 0.02
# Output pattern 626:
01000000
# Input pattern 627:
0.82 0.48 0.23
# Output pattern 627:
01000000
# Input pattern 628:
0.43 0.38 0.5
# Output pattern 628:
10000000
# Input pattern 629:
0.72 0.5 0.96
# Output pattern 629:
00000010
# Input pattern 630:
0.38 0.68 0.57
# Output pattern 630:
00000001
# Input pattern 631:
0.93 0.75 0.83
# Output pattern 631:
00100000
# Input pattern 632:
0.78 0.39 0.62
# Output pattern 632:
10000000
# Input pattern 633:
0.09 0.74 0.45
# Output pattern 633:
00000001
# Input pattern 634:
0.03 0.14 0.24
# Output pattern 634:
00000001
# Input pattern 635:
0.35 0.28 0.78
# Output pattern 635:
10000000
# Input pattern 636:
0.59 0.23 0.57
# Output pattern 636:
10000000
# Input pattern 637:
0.08 0.71 0.83
136
# Input pattern 854:
0.27 0.4 0.85
# Output pattern 854:
00000001
# Input pattern 855:
0.58 0.3 0.2
# Output pattern 855:
01000000
# Input pattern 856:
0.51 0.6 0.18
# Output pattern 856:
01000000
# Input pattern 857:
0.81 0.94 0.64
# Output pattern 857:
00100000
# Input pattern 858:
0.15 0.99 0.03
# Output pattern 858:
00100000
# Input pattern 859:
0.76 0.34 0.07
# Output pattern 859:
01000000
# Input pattern 860:
0.64 0.41 0.12
# Output pattern 860:
01000000
# Input pattern 861:
0.7 0.18 0.96
# Output pattern 861:
00000010
# Input pattern 862:
0.34 0.16 0.31
# Output pattern 862:
10000000
# Input pattern 863:
0.48 0.22 0.88
# Output pattern 863:
10000000
# Input pattern 864:
0.92 0.59 0.56
# Output pattern 864:
00100000
# Input pattern 865:
0.3 0.81 0.29
# Output pattern 181:
00000010
# Input pattern 182:
0.29 0.74 0.46
# Output pattern 182:
00000001
# Input pattern 183:
0.59 0.25 0.63
# Output pattern 183:
10000000
# Input pattern 184:
0.24 0.29 0.7
# Output pattern 184:
00000001
# Input pattern 185:
0.64 0.27 0.57
# Output pattern 185:
10000000
# Input pattern 186:
0.96 0.93 0.2
# Output pattern 186:
01000000
# Input pattern 187:
0.74 0.87 0.19
# Output pattern 187:
01000000
# Input pattern 188:
0.54 0.66 1
# Output pattern 188:
00000010
# Input pattern 189:
0.82 0.59 0.78
# Output pattern 189:
10000000
# Input pattern 190:
0.69 0.17 0.54
# Output pattern 190:
10000000
# Input pattern 191:
0.19 0.04 0.38
# Output pattern 191:
10000000
# Input pattern 192:
0.19 0.27 0.04
# Output pattern 192:
01000000
# Output pattern 409:
01000000
# Input pattern 410:
0.47 0.34 0.85
# Output pattern 410:
10000000
# Input pattern 411:
0.2 0.33 0.41
# Output pattern 411:
00000001
# Input pattern 412:
0.13 0.58 0.52
# Output pattern 412:
00000001
# Input pattern 413:
0.02 0.35 0.98
# Output pattern 413:
00000010
# Input pattern 414:
0.44 0.82 0.55
# Output pattern 414:
00000001
# Input pattern 415:
0.82 0.87 0.87
# Output pattern 415:
00000001
# Input pattern 416:
0.74 0.95 0.03
# Output pattern 416:
00100000
# Input pattern 417:
0.71 0.38 0.47
# Output pattern 417:
10000000
# Input pattern 418:
0.8 0.67 0.84
# Output pattern 418:
10000000
# Input pattern 419:
0.33 0.91 0.18
# Output pattern 419:
00100000
# Input pattern 420:
0.73 0.33 0.15
# Output pattern 420:
01000000
# Output pattern 637:
00000001
# Input pattern 638:
0.03 0.4 0.97
# Output pattern 638:
00000010
# Input pattern 639:
0.96 0.31 0.49
# Output pattern 639:
00100000
# Input pattern 640:
0.15 0.89 0.63
# Output pattern 640:
00000001
# Input pattern 641:
0.61 0.26 0.61
# Output pattern 641:
10000000
# Input pattern 642:
0.87 0.94 0.37
# Output pattern 642:
00100000
# Input pattern 643:
0.78 0.05 0.91
# Output pattern 643:
00000010
# Input pattern 644:
0.28 0.77 0.69
# Output pattern 644:
00000001
# Input pattern 645:
0.83 0.07 0.71
# Output pattern 645:
10000000
# Input pattern 646:
0.96 0.39 0.88
# Output pattern 646:
00100000
# Input pattern 647:
0.08 0.86 0.65
# Output pattern 647:
00000001
# Input pattern 648:
0.52 0.7 0.85
# Output pattern 648:
00000001
137
# Output pattern 865:
01000000
# Input pattern 866:
0.88 0.77 0.43
# Output pattern 866:
01000000
# Input pattern 867:
0.52 0.36 0.49
# Output pattern 867:
10000000
# Input pattern 868:
0.94 0.65 0.64
# Output pattern 868:
00100000
# Input pattern 869:
0.67 0.07 0.22
# Output pattern 869:
10000000
# Input pattern 870:
0.87 0.09 0.7
# Output pattern 870:
10000000
# Input pattern 871:
0.56 0.54 0.04
# Output pattern 871:
01000000
# Input pattern 872:
0.2 0.09 0.84
# Output pattern 872:
10000000
# Input pattern 873:
0.69 0.96 0.29
# Output pattern 873:
00100000
# Input pattern 874:
0.06 0.6 0.42
# Output pattern 874:
00000001
# Input pattern 875:
0.05 0.22 0.22
# Output pattern 875:
00000001
# Input pattern 876:
0.02 0.73 0.91
# Output pattern 876:
00000010
# Input pattern 193:
0.5 0.72 0.97
# Output pattern 193:
00000010
# Input pattern 194:
0.46 0.57 0.7
# Output pattern 194:
00000001
# Input pattern 195:
0.28 0.06 0.46
# Output pattern 195:
10000000
# Input pattern 196:
0.63 0.73 0.98
# Output pattern 196:
00000010
# Input pattern 197:
0.9 0.63 0.86
# Output pattern 197:
10000000
# Input pattern 198:
0.67 1 0.53
# Output pattern 198:
00100000
# Input pattern 199:
0.88 0.28 0.64
# Output pattern 199:
10000000
# Input pattern 200:
0.62 0.9 0.75
# Output pattern 200:
00000001
# Input pattern 201:
0.68 0.16 0.12
# Output pattern 201:
01000000
# Input pattern 202:
0.88 0.8 0.6
# Output pattern 202:
01000000
# Input pattern 203:
0.48 0.68 0.04
# Output pattern 203:
01000000
# Input pattern 204:
0.09 0.04 0.86
# Input pattern 421:
0.24 0.51 0.05
# Output pattern 421:
01000000
# Input pattern 422:
0.97 0.35 0.18
# Output pattern 422:
00100000
# Input pattern 423:
0.21 0.74 0.09
# Output pattern 423:
01000000
# Input pattern 424:
0.16 0.37 0.7
# Output pattern 424:
00000001
# Input pattern 425:
0.69 0.61 0.15
# Output pattern 425:
01000000
# Input pattern 426:
0.34 0.84 0.86
# Output pattern 426:
00000001
# Input pattern 427:
0.9 0.01 0.78
# Output pattern 427:
10000000
# Input pattern 428:
0.16 0.45 0.36
# Output pattern 428:
00000001
# Input pattern 429:
0.62 0.32 0.98
# Output pattern 429:
00000010
# Input pattern 430:
0.67 0.29 0.61
# Output pattern 430:
10000000
# Input pattern 431:
0.95 0.15 0.87
# Output pattern 431:
00100000
# Input pattern 432:
0.14 0.27 0.84
# Input pattern 649:
0.1 0.97 0.39
# Output pattern 649:
00000010
# Input pattern 650:
0.29 0.87 0.58
# Output pattern 650:
00000001
# Input pattern 651:
0.7 0.32 0.91
# Output pattern 651:
00000010
# Input pattern 652:
0.24 0.31 0.85
# Output pattern 652:
00000001
# Input pattern 653:
0.68 0.4 0.51
# Output pattern 653:
10000000
# Input pattern 654:
0.08 0.09 0.05
# Output pattern 654:
01000000
# Input pattern 655:
0.61 0.28 0.14
# Output pattern 655:
01000000
# Input pattern 656:
0.51 0.29 0.53
# Output pattern 656:
10000000
# Input pattern 657:
0.71 0.08 0.02
# Output pattern 657:
01000000
# Input pattern 658:
0.85 0.42 0.84
# Output pattern 658:
10000000
# Input pattern 659:
0.46 0.67 0.13
# Output pattern 659:
01000000
# Input pattern 660:
0.07 0.18 0.01
138
# Input pattern 877:
0.82 0.06 0.72
# Output pattern 877:
10000000
# Input pattern 878:
0.04 0.75 0.68
# Output pattern 878:
00000001
# Input pattern 879:
0.5 0.55 0.5
# Output pattern 879:
00100000
# Input pattern 880:
0.1 0.91 0.12
# Output pattern 880:
00000010
# Input pattern 881:
0.2 0.44 0.19
# Output pattern 881:
01000000
# Input pattern 882:
0.71 0.72 0.08
# Output pattern 882:
01000000
# Input pattern 883:
0.4 0.55 0.29
# Output pattern 883:
01000000
# Input pattern 884:
0.41 0.29 0.24
# Output pattern 884:
01000000
# Input pattern 885:
0.47 0.31 0.03
# Output pattern 885:
01000000
# Input pattern 886:
0.9 0.8 0.79
# Output pattern 886:
01000000
# Input pattern 887:
0.37 0.06 0.14
# Output pattern 887:
10000000
# Input pattern 888:
0.19 0.75 0.25
# Output pattern 204:
10000000
# Input pattern 205:
0.18 0.99 0.21
# Output pattern 205:
00000010
# Input pattern 206:
0.13 0.58 0.38
# Output pattern 206:
00000001
# Input pattern 207:
0.86 0.27 0.44
# Output pattern 207:
10000000
# Input pattern 208:
0.35 0.95 0.05
# Output pattern 208:
00100000
# Input pattern 209:
0.83 0.2 0.65
# Output pattern 209:
10000000
# Input pattern 210:
0.27 0.09 0.22
# Output pattern 210:
10000000
# Input pattern 211:
0.61 0.87 0.07
# Output pattern 211:
01000000
# Input pattern 212:
0.18 0.14 0.62
# Output pattern 212:
10000000
# Input pattern 213:
0.88 0.17 0.28
# Output pattern 213:
10000000
# Input pattern 214:
0.08 0.44 1
# Output pattern 214:
00000010
# Input pattern 215:
0.18 0.44 0.71
# Output pattern 215:
00000001
# Output pattern 432:
00000001
# Input pattern 433:
0.46 0.6 0.73
# Output pattern 433:
00000001
# Input pattern 434:
0.43 0.3 0.71
# Output pattern 434:
10000000
# Input pattern 435:
0.19 0.82 0.76
# Output pattern 435:
00000001
# Input pattern 436:
0.6 0.01 0.91
# Output pattern 436:
00000010
# Input pattern 437:
0.68 0.82 0.87
# Output pattern 437:
00000001
# Input pattern 438:
0.35 0.55 0.96
# Output pattern 438:
00000010
# Input pattern 439:
0.6 0.71 0.6
# Output pattern 439:
00100000
# Input pattern 440:
0.4 0.65 0.23
# Output pattern 440:
01000000
# Input pattern 441:
0.15 0.14 0.43
# Output pattern 441:
10000000
# Input pattern 442:
0.75 0.67 0.38
# Output pattern 442:
01000000
# Input pattern 443:
0.08 0.09 0.48
# Output pattern 443:
00000001
# Output pattern 660:
01000000
# Input pattern 661:
0.51 0.11 0.62
# Output pattern 661:
10000000
# Input pattern 662:
0.4 0.82 0.66
# Output pattern 662:
00000001
# Input pattern 663:
0.27 0.41 0.64
# Output pattern 663:
00000001
# Input pattern 664:
0.08 0.24 0.87
# Output pattern 664:
00000001
# Input pattern 665:
0.77 0.96 0.42
# Output pattern 665:
00100000
# Input pattern 666:
0.47 0.97 0.11
# Output pattern 666:
00100000
# Input pattern 667:
0.05 0.99 0.21
# Output pattern 667:
00000010
# Input pattern 668:
0.99 0.18 0.75
# Output pattern 668:
00100000
# Input pattern 669:
0.73 0.88 0.24
# Output pattern 669:
01000000
# Input pattern 670:
0.31 0.17 0.66
# Output pattern 670:
10000000
# Input pattern 671:
0.31 0.45 0
# Output pattern 671:
01000000
139
# Output pattern 888:
00000001
# Input pattern 889:
0.32 0.14 0.62
# Output pattern 889:
10000000
# Input pattern 890:
0.31 0.22 0.88
# Output pattern 890:
10000000
# Input pattern 891:
0.1 0.96 0.73
# Output pattern 891:
00000010
# Input pattern 892:
0.93 0.42 0.28
# Output pattern 892:
00100000
# Input pattern 893:
0.18 0.15 0.56
# Output pattern 893:
10000000
# Input pattern 894:
0.64 0.18 0.25
# Output pattern 894:
10000000
# Input pattern 895:
0.34 0.87 0.05
# Output pattern 895:
01000000
# Input pattern 896:
0.73 0.19 0.44
# Output pattern 896:
10000000
# Input pattern 897:
0.41 0.9 0.11
# Output pattern 897:
01000000
# Input pattern 898:
0.97 0.41 0.85
# Output pattern 898:
00100000
# Input pattern 899:
0.3 0.36 0.95
# Output pattern 899:
00000010
# Input pattern 216:
0.8 1 0.02
# Output pattern 216:
00100000
# Input pattern 217:
0.73 0.95 0.75
# Output pattern 217:
00000010
# Input pattern 218:
0.92 0.31 0.99
# Output pattern 218:
00001000
# Input pattern 219:
0.1 0.68 0.8
# Output pattern 219:
00000001
# Input pattern 220:
0.76 0.73 0.31
# Output pattern 220:
01000000
# Input pattern 221:
0.39 0.24 0.24
# Output pattern 221:
10000000
# Input pattern 222:
0.75 0.61 0.48
# Output pattern 222:
01000000
# Input pattern 223:
0.16 0.96 0.51
# Output pattern 223:
00000010
# Input pattern 224:
0.08 0.03 0.71
# Output pattern 224:
10000000
# Input pattern 225:
0.91 0.48 0.21
# Output pattern 225:
00100000
# Input pattern 226:
0.43 0.76 0.12
# Output pattern 226:
01000000
# Input pattern 227:
0.1 0.03 0.07
# Input pattern 444:
0.36 0.05 0.05
# Output pattern 444:
10000000
# Input pattern 445:
0.19 0.88 0.49
# Output pattern 445:
00000001
# Input pattern 446:
0.96 0.98 0.13
# Output pattern 446:
00100000
# Input pattern 447:
0.04 0.86 0.46
# Output pattern 447:
00000001
# Input pattern 448:
0.86 0.34 0.57
# Output pattern 448:
10000000
# Input pattern 449:
0.69 0.12 0.35
# Output pattern 449:
10000000
# Input pattern 450:
0.3 0.35 0.53
# Output pattern 450:
00000001
# Input pattern 451:
0.4 0.95 0.38
# Output pattern 451:
00100000
# Input pattern 452:
0.63 0.3 0.31
# Output pattern 452:
10000000
# Input pattern 453:
0.88 0.9 0.76
# Output pattern 453:
01000000
# Input pattern 454:
0.48 0.55 0.62
# Output pattern 454:
00000001
# Input pattern 455:
0.14 0.22 0.15
# Input pattern 672:
0.26 0.76 0.74
# Output pattern 672:
00000001
# Input pattern 673:
0.44 0.83 0.66
# Output pattern 673:
00000001
# Input pattern 674:
0.77 0.14 0.76
# Output pattern 674:
10000000
# Input pattern 675:
0.83 0.19 0.9
# Output pattern 675:
10000000
# Input pattern 676:
0.46 0.67 0.1
# Output pattern 676:
01000000
# Input pattern 677:
0.92 0.53 0.77
# Output pattern 677:
00100000
# Input pattern 678:
0.57 0.99 0.65
# Output pattern 678:
00000010
# Input pattern 679:
0.38 0.56 0.67
# Output pattern 679:
00000001
# Input pattern 680:
0.31 0.44 0.53
# Output pattern 680:
00000001
# Input pattern 681:
0.22 0.38 0.46
# Output pattern 681:
00000001
# Input pattern 682:
0.09 0.23 0.57
# Output pattern 682:
00000001
# Input pattern 683:
0.61 0.84 0.12
140
# Input pattern 900:
0.3 0.22 0.01
# Output pattern 900:
01000000
# Input pattern 901:
0.57 0.08 0.06
# Output pattern 901:
01000000
# Input pattern 902:
0.33 0.4 0.33
# Output pattern 902:
00100000
# Input pattern 903:
0.28 0.02 0.04
# Output pattern 903:
10000000
# Input pattern 904:
0.32 0.55 0.94
# Output pattern 904:
00000010
# Input pattern 905:
0.49 0.91 0.87
# Output pattern 905:
00000010
# Input pattern 906:
0.59 0.02 0.91
# Output pattern 906:
00000010
# Input pattern 907:
0.46 0.47 0.1
# Output pattern 907:
01000000
# Input pattern 908:
0.19 0.87 0.78
# Output pattern 908:
00000001
# Input pattern 909:
0.36 0.09 0.45
# Output pattern 909:
10000000
# Input pattern 910:
0.87 0.32 0.79
# Output pattern 910:
10000000
# Input pattern 911:
0.87 0.48 0.17
# Output pattern 227:
10000000
# Input pattern 228:
0.76 0.85 0.69
# Output pattern 228:
01000000
# Output pattern 455:
00000001
# Input pattern 456:
0.29 0.42 0.76
# Output pattern 456:
00000001
# Output pattern 683:
01000000
# Input pattern 684:
0.76 0.5 0.3
# Output pattern 684:
01000000
141
# Output pattern 911:
01000000
H ARQUIVO DE VALIDAÇÃO DA RNA
A seguir é apresentado o arquivo de validação utilizado no processo de validação das RNAs
validadas pelo ambiente JavaNNS.
SNNS pattern definition file V4.2
generated at Sun Jun 14 23:10:00 2009
No. of patterns : 200
No. of input units : 3
No. of output units : 8
# Input pattern 1:
0.6 0.02 0.63
# Output pattern 1:
10000000
# Input pattern 2:
0.89 0.26 0.33
# Output pattern 2:
10000000
# Input pattern 3:
0.75 0.09 0.48
# Output pattern 3:
10000000
# Input pattern 4:
0.21 0.5 0.86
# Output pattern 4:
00000001
# Input pattern 5:
0.24 0.61 0.77
# Output pattern 5:
00000001
# Input pattern 6:
0.56 0.96 0.51
# Output pattern 6:
00100000
# Input pattern 7:
0.37 0.75 0.26
# Output pattern 7:
01000000
# Input pattern 8:
0.67 0.39 0.74
# Output pattern 8:
10000000
# Input pattern 51:
0.46 0.56 0.01
# Output pattern 51:
01000000
# Input pattern 52:
0.07 0.49 0.49
# Output pattern 52:
00000001
# Input pattern 53:
0.97 0.51 0.44
# Output pattern 53:
00100000
# Input pattern 54:
0.81 0.29 0.21
# Output pattern 54:
01000000
# Input pattern 55:
0.65 0.55 0.35
# Output pattern 55:
01000000
# Input pattern 56:
0.59 0.21 0.66
# Output pattern 56:
10000000
# Input pattern 57:
0.53 0.9 0.58
# Output pattern 57:
00000001
# Input pattern 58:
0.89 0.71 0.76
# Output pattern 58:
10000000
# Input pattern 101:
0.46 0.25 0.51
# Output pattern 101:
10000000
# Input pattern 102:
0.61 0.88 0.61
# Output pattern 102:
00100000
# Input pattern 103:
0.28 0.45 0.49
# Output pattern 103:
00000001
# Input pattern 104:
0.59 0.39 0.24
# Output pattern 104:
01000000
# Input pattern 105:
0.65 0.25 0.58
# Output pattern 105:
10000000
# Input pattern 106:
0.29 0.22 0.3
# Output pattern 106:
10000000
# Input pattern 107:
0.88 0.09 0.84
# Output pattern 107:
10000000
# Input pattern 108:
0.69 0.66 0.33
# Output pattern 108:
01000000
142
# Input pattern 151:
0.31 0.16 0.34
# Output pattern 151:
10000000
# Input pattern 152:
0.88 0.22 0.48
# Output pattern 152:
10000000
# Input pattern 153:
0.56 0.59 0.92
# Output pattern 153:
00000010
# Input pattern 154:
0.29 0.81 0.3
# Output pattern 154:
00000001
# Input pattern 155:
0.43 0.77 0.88
# Output pattern 155:
00000001
# Input pattern 156:
0.49 0.36 0.52
# Output pattern 156:
10000000
# Input pattern 157:
0.64 0.65 0.94
# Output pattern 157:
00000010
# Input pattern 158:
0.22 0.07 0.67
# Output pattern 158:
10000000
# Input pattern 9:
0.04 0.92 0.03
# Output pattern 9:
00100000
# Input pattern 10:
0.31 0.6 0.26
# Output pattern 10:
01000000
# Input pattern 11:
0.73 0.44 0.84
# Output pattern 11:
10000000
# Input pattern 12:
0.24 0.09 0.77
# Output pattern 12:
10000000
# Input pattern 13:
0.34 0.45 0.28
# Output pattern 13:
01000000
# Input pattern 14:
0.49 0.33 0.84
# Output pattern 14:
10000000
# Input pattern 15:
0.56 0.7 0.4
# Output pattern 15:
01000000
# Input pattern 16:
1 0.99 0.84
# Output pattern 16:
00100000
# Input pattern 17:
0.26 0.95 0.59
# Output pattern 17:
00100000
# Input pattern 18:
0.84 0.31 0.56
# Output pattern 18:
10000000
# Input pattern 19:
0.32 0.79 0.55
# Output pattern 19:
00000001
# Input pattern 20:
0.11 0.01 0.98
# Input pattern 59:
0.58 0.81 0.24
# Output pattern 59:
01000000
# Input pattern 60:
0.8 0.29 0.4
# Output pattern 60:
10000000
# Input pattern 61:
0.26 0.23 0.4
# Output pattern 61:
10000000
# Input pattern 62:
0.69 0.02 0.35
# Output pattern 62:
10000000
# Input pattern 63:
0.85 0.04 0.98
# Output pattern 63:
00000010
# Input pattern 64:
0.57 0.07 0.71
# Output pattern 64:
10000000
# Input pattern 65:
0.15 0.91 0.05
# Output pattern 65:
00100000
# Input pattern 66:
0.21 0.93 0.69
# Output pattern 66:
00000010
# Input pattern 67:
0.71 0.51 0.41
# Output pattern 67:
01000000
# Input pattern 68:
0.22 0.46 0.21
# Output pattern 68:
01000000
# Input pattern 69:
0.82 0.55 0.68
# Output pattern 69:
10000000
# Input pattern 70:
0.37 0.65 0.02
# Input pattern 109:
0.89 0.97 0.02
# Output pattern 109:
00100000
# Input pattern 110:
0.43 0.77 0.25
# Output pattern 110:
01000000
# Input pattern 111:
0.53 0.16 0.41
# Output pattern 111:
10000000
# Input pattern 112:
0.98 0.61 0.45
# Output pattern 112:
00100000
# Input pattern 113:
0.85 0.62 0.66
# Output pattern 113:
10000000
# Input pattern 114:
0.35 0.27 0.76
# Output pattern 114:
10000000
# Input pattern 115:
0.43 0.91 0.19
# Output pattern 115:
00100000
# Input pattern 116:
0.78 0.15 0.27
# Output pattern 116:
10000000
# Input pattern 117:
0.1 0.91 0.05
# Output pattern 117:
00100000
# Input pattern 118:
0.76 0.23 0.82
# Output pattern 118:
10000000
# Input pattern 119:
0.25 0.34 0.73
# Output pattern 119:
00000001
# Input pattern 120:
0.58 0.39 0.18
143
# Input pattern 159:
0.7 0.09 0.87
# Output pattern 159:
10000000
# Input pattern 160:
0.04 0.54 0.56
# Output pattern 160:
00000001
# Input pattern 161:
0.84 0.09 0.2
# Output pattern 161:
10000000
# Input pattern 162:
0.29 0.96 0.69
# Output pattern 162:
00000010
# Input pattern 163:
0.42 0.6 0.06
# Output pattern 163:
01000000
# Input pattern 164:
0.22 0.22 0.05
# Output pattern 164:
01000000
# Input pattern 165:
0.91 0.73 0.02
# Output pattern 165:
00100000
# Input pattern 166:
0.72 0.06 0.82
# Output pattern 166:
10000000
# Input pattern 167:
0.68 0.75 0.04
# Output pattern 167:
01000000
# Input pattern 168:
0.5 0.55 0.5
# Output pattern 168:
00100000
# Input pattern 169:
0.12 0.91 0.1
# Output pattern 169:
00100000
# Input pattern 170:
0.19 0.44 0.2
# Output pattern 20:
00000010
# Input pattern 21:
0.07 0.36 0.12
# Output pattern 21:
00000001
# Input pattern 22:
0.92 0.54 0.5
# Output pattern 22:
00100000
# Input pattern 23:
0.66 0.43 0.57
# Output pattern 23:
10000000
# Input pattern 24:
0.34 0.13 0.26
# Output pattern 24:
10000000
# Input pattern 25:
0.9 0.77 0.77
# Output pattern 25:
10000000
# Input pattern 26:
0.17 0.22 0.3
# Output pattern 26:
00000001
# Input pattern 27:
0.68 0.74 0.59
# Output pattern 27:
01000000
# Input pattern 28:
0.93 0.9 0.81
# Output pattern 28:
00100000
# Input pattern 29:
0.67 0.67 0.02
# Output pattern 29:
01000000
# Input pattern 30:
0.17 0.35 0.41
# Output pattern 30:
00000001
# Input pattern 31:
0.49 0.72 0.04
# Output pattern 31:
01000000
# Output pattern 70:
01000000
# Input pattern 71:
0.71 0.47 0.02
# Output pattern 71:
01000000
# Input pattern 72:
0.42 0.29 0.72
# Output pattern 72:
10000000
# Input pattern 73:
0.71 0.61 0.8
# Output pattern 73:
10000000
# Input pattern 74:
0.22 0.65 0.39
# Output pattern 74:
00000001
# Input pattern 75:
0.31 0.06 0.85
# Output pattern 75:
10000000
# Input pattern 76:
0.48 0.36 0.85
# Output pattern 76:
10000000
# Input pattern 77:
0.41 0.05 0.84
# Output pattern 77:
10000000
# Input pattern 78:
0.41 0.79 0.39
# Output pattern 78:
01000000
# Input pattern 79:
0.42 0.1 0.05
# Output pattern 79:
01000000
# Input pattern 80:
0.21 0.39 0.05
# Output pattern 80:
01000000
# Input pattern 81:
0.54 0.18 0.5
# Output pattern 81:
10000000
# Output pattern 120:
01000000
# Input pattern 121:
0.51 0.83 0.2
# Output pattern 121:
01000000
# Input pattern 122:
0.03 0.12 0.81
# Output pattern 122:
00000001
# Input pattern 123:
0.62 0.29 0.93
# Output pattern 123:
00000010
# Input pattern 124:
0.36 0.64 0.21
# Output pattern 124:
01000000
# Input pattern 125:
0.46 0.43 0.37
# Output pattern 125:
01000000
# Input pattern 126:
0.62 0.15 0.6
# Output pattern 126:
10000000
# Input pattern 127:
0.82 0.69 0.57
# Output pattern 127:
01000000
# Input pattern 128:
0.61 0.36 0.72
# Output pattern 128:
10000000
# Input pattern 129:
0.58 0.71 0.07
# Output pattern 129:
01000000
# Input pattern 130:
0.6 0.8 0.7
# Output pattern 130:
00000001
# Input pattern 131:
0.64 0.6 0.53
# Output pattern 131:
01000000
144
# Output pattern 170:
00000001
# Input pattern 171:
0.08 0.72 0.71
# Output pattern 171:
00000001
# Input pattern 172:
0.29 0.55 0.4
# Output pattern 172:
00000001
# Input pattern 173:
0.24 0.29 0.41
# Output pattern 173:
00000001
# Input pattern 174:
0.03 0.31 0.47
# Output pattern 174:
00000001
# Input pattern 175:
0.79 0.8 0.9
# Output pattern 175:
00000001
# Input pattern 176:
0.14 0.06 0.37
# Output pattern 176:
10000000
# Input pattern 177:
0.25 0.75 0.19
# Output pattern 177:
01000000
# Input pattern 178:
0.62 0.14 0.32
# Output pattern 178:
10000000
# Input pattern 179:
0.88 0.22 0.31
# Output pattern 179:
10000000
# Input pattern 180:
0.73 0.96 0.1
# Output pattern 180:
00100000
# Input pattern 181:
0.28 0.42 0.93
# Output pattern 181:
00000010
# Input pattern 32:
0.9 0.06 0.55
# Output pattern 32:
10000000
# Input pattern 33:
0.79 0.8 0.35
# Output pattern 33:
01000000
# Input pattern 34:
0.51 0.88 0.09
# Output pattern 34:
01000000
# Input pattern 35:
0.19 0.41 0.15
# Output pattern 35:
01000000
# Input pattern 36:
0.51 0.56 0.51
# Output pattern 36:
00100000
# Input pattern 37:
0.85 0.55 0.01
# Output pattern 37:
01000000
# Input pattern 38:
0.41 0.94 0.38
# Output pattern 38:
00100000
# Input pattern 39:
0.46 0.11 0.47
# Output pattern 39:
10000000
# Input pattern 40:
0.45 0.04 0.65
# Output pattern 40:
10000000
# Input pattern 41:
0.03 0.44 0.61
# Output pattern 41:
00000001
# Input pattern 42:
0.85 0.91 0.21
# Output pattern 42:
00100000
# Input pattern 43:
0.62 0.21 0.2
# Input pattern 82:
0.7 0.22 0.66
# Output pattern 82:
10000000
# Input pattern 83:
0.1 0.56 0.23
# Output pattern 83:
00000001
# Input pattern 84:
0.04 0.42 0.2
# Output pattern 84:
00000001
# Input pattern 85:
0.14 0.04 0.67
# Output pattern 85:
10000000
# Input pattern 86:
0.05 0.93 0.22
# Output pattern 86:
00000010
# Input pattern 87:
0.42 0 0.21
# Output pattern 87:
10000000
# Input pattern 88:
0.6 0.14 0.26
# Output pattern 88:
10000000
# Input pattern 89:
0.34 0.16 0.93
# Output pattern 89:
00000010
# Input pattern 90:
0.72 0.39 0.38
# Output pattern 90:
01000000
# Input pattern 91:
0.66 0.37 0.01
# Output pattern 91:
01000000
# Input pattern 92:
0.1 0.25 0.14
# Output pattern 92:
00000001
# Input pattern 93:
0.71 1 0.02
# Input pattern 132:
0.39 0.19 0.57
# Output pattern 132:
10000000
# Input pattern 133:
0.89 0.58 0.04
# Output pattern 133:
01000000
# Input pattern 134:
0.54 0.58 0.73
# Output pattern 134:
00000001
# Input pattern 135:
0.58 0.49 0.1
# Output pattern 135:
01000000
# Input pattern 136:
0.13 0.35 0.64
# Output pattern 136:
00000001
# Input pattern 137:
0.02 0.18 0.06
# Output pattern 137:
00000001
# Input pattern 138:
0.94 0.31 0.56
# Output pattern 138:
00100000
# Input pattern 139:
0.76 0.26 0.74
# Output pattern 139:
10000000
# Input pattern 140:
0.97 0.75 0.58
# Output pattern 140:
00100000
# Input pattern 141:
0.12 0.38 0.47
# Output pattern 141:
00000001
# Input pattern 142:
0.08 0.03 0.69
# Output pattern 142:
10000000
# Input pattern 143:
0.85 0.4 0.27
145
# Input pattern 182:
0.56 0.15 0.18
# Output pattern 182:
10000000
# Input pattern 183:
0.25 0.18 0.64
# Output pattern 183:
10000000
# Input pattern 184:
0.05 0.87 0.34
# Output pattern 184:
00000001
# Input pattern 185:
0.44 0.19 0.73
# Output pattern 185:
10000000
# Input pattern 186:
0.11 0.9 0.41
# Output pattern 186:
00000001
# Input pattern 187:
0.85 0.41 0.97
# Output pattern 187:
00000010
# Input pattern 188:
0.95 0.36 0.3
# Output pattern 188:
00100000
# Input pattern 189:
0.01 0.22 0.3
# Output pattern 189:
00000001
# Input pattern 190:
0.06 0.08 0.57
# Output pattern 190:
00000001
# Input pattern 191:
0.33 0.4 0.33
# Output pattern 191:
00100000
# Input pattern 192:
0.04 0.02 0.28
# Output pattern 192:
10000000
# Input pattern 193:
0.94 0.55 0.32
# Output pattern 43:
01000000
# Input pattern 44:
0.22 0.66 0.6
# Output pattern 44:
00000001
# Input pattern 45:
0.69 0.83 0.12
# Output pattern 45:
01000000
# Input pattern 46:
0.72 0.32 0.79
# Output pattern 46:
10000000
# Input pattern 47:
0.52 0.48 0.55
# Output pattern 47:
10000000
# Input pattern 48:
0.83 0.1 0.07
# Output pattern 48:
01000000
# Input pattern 49:
0.09 0.33 0.84
# Output pattern 49:
00000001
# Input pattern 50:
0.25 0.54 0.28
# Output pattern 50:
00000001
# Output pattern 93:
00100000
# Input pattern 94:
0.72 0.55 0.29
# Output pattern 94:
01000000
# Input pattern 95:
0.41 0.93 0.69
# Output pattern 95:
00000010
# Input pattern 96:
0.74 0.2 0.31
# Output pattern 96:
10000000
# Input pattern 97:
0.89 0.36 0.5
# Output pattern 97:
10000000
# Input pattern 98:
0.18 0.71 0.51
# Output pattern 98:
00000001
# Input pattern 99:
0.51 0.83 0.52
# Output pattern 99:
00000001
# Input pattern 100:
0.47 0.14 0.74
# Output pattern 100:
10000000
# Output pattern 143:
01000000
# Input pattern 144:
0.2 0.3 0.58
# Output pattern 144:
00000001
# Input pattern 145:
0.18 0.6 0.51
# Output pattern 145:
00000001
# Input pattern 146:
0.64 0.94 0.81
# Output pattern 146:
00000010
# Input pattern 147:
0.03 0.99 0.15
# Output pattern 147:
00000010
# Input pattern 148:
0.07 0.34 0.76
# Output pattern 148:
00000001
# Input pattern 149:
0.12 0.41 0.64
# Output pattern 149:
00000001
# Input pattern 150:
0.96 0.18 0.7
# Output pattern 150:
00100000
146
# Output pattern 193:
00100000
# Input pattern 194:
0.87 0.91 0.49
# Output pattern 194:
00100000
# Input pattern 195:
0.91 0.02 0.59
# Output pattern 195:
00100000
# Input pattern 196:
0.1 0.47 0.46
# Output pattern 196:
00000001
# Input pattern 197:
0.78 0.87 0.19
# Output pattern 197:
01000000
# Input pattern 198:
0.45 0.09 0.36
# Output pattern 198:
10000000
# Input pattern 199:
0.79 0.32 0.87
# Output pattern 199:
10000000
# Input pattern 200:
0.17 0.48 0.87
# Output pattern 200:
00000001
I ARQUIVO DE RESULTADO DA RNA - VALIDAÇÃO
A seguir é apresentado os dados contidos na arquivos de resultado referente à validação da
RNA GSC200901-B gerado pelo JavaNNS.
SNNS result file V1.4-3D
generated at Mon Jun 15 00:56:44 2009
No. of patterns
: 911
No. of input units : 3
No. of output units : 8
startpattern
: 1
endpattern
: 911
#1.1
0.99789 0 0 0.02602 0 0 0 0.00066
#2.1
0 1 0 0.00821 0 0 0 0
#3.1
0 0.00001 0 0.04888 0 0.00004 0 0.99953
#4.1
0.99998 0 0.00006 0.01539 0 0 0 0
#5.1
0 1 0 0.00929 0 0.00001 0 0
#6.1
0.07767 0.96081 0 0.00689 0 0 0 0
#7.1
0 1 0 0.01108 0 0 0 0
#8.1
0 0.9998 0 0.01039 0 0 0 0.00002
#9.1
0 0 0 0.01784 0 0 0 1
#10.1
0 1 0 0.00768 0 0 0 0
#11.1
1 0 0 0.08717 0 0 0 0.00001
#12.1
0 0.99999 0.00002 0.00721 0 0.00001 0 0.00001
#13.1
0 1 0 0.01723 0 0 0 0
#14.1
0 1 0 0.0133 0 0 0 0
#15.1
0 1 0 0.00864 0 0 0 0
#16.1
1 0 0 0.02621 0 0 0 0.00004
#17.1
0.00003 0 0 0.0151 0 0 0 1
#18.1
0 0 0 0.01036 0 0 0.93178 0.09776
#19.1
0 0.99997 0.00001 0.00872 0 0 0 0
#20.1
0 1 0 0.00528 0 0 0 0
#21.1
0 0 0.00216 0.02383 0 0.02095 1 0
#22.1
0 0.02054 0 0.0202 0 0 0 0.96997
#23.1
0 0.99713 0.00425 0.00814 0 0 0 0
#24.1
0 0.00021 0.99835 0.0044 0 0.00053 0 0
#25.1
0 0 0 0.01332 0.00002 0.00001 1 0
#26.1
0 0.00001 0 0.02405 0 0.00003 0.00441 0.99984
#27.1
0.00004 0 0 0.02605 0 0 0 1
#28.1
0 1 0 0.00543 0 0 0 0
#29.1
0 1 0 0.00707 0 0 0 0
#30.1
0 0.0005 0 0.02849 0 0.00002 0.00121 0.99998
#31.1
0 1 0 0.00846 0 0 0 0
#32.1
0 0.99979 0.00006 0.00653 0 0 0 0
147
#33.1
0 0 0.99041 0.01269 0 0 0 0
#34.1
0 0.90227 0.0135 0.00762 0 0 0 0
#35.1
0 0 0 0.00685 0 0 1 0
#36.1
0 0 0 0.02834 0 0 0 1
#37.1
1 0 0 0.04101 0 0 0 0
#38.1
0.00001 0 0 0.0169 0 0 0 1
#39.1
1 0 0 0.0203 0 0 0 0
#40.1
0.00005 0 0 0.01562 0 0 0.00002 0.99987
#41.1
0 0.00004 0 0.02588 0 0.00001 0.00005 1
#42.1
0 0.00217 0 0.02596 0 0.00002 0 0.99996
#43.1
1 0.00006 0 0.01285 0 0 0 0
#44.1
0.99951 0.08965 0 0.00622 0 0 0 0
#45.1
0.91129 0 0.09515 0.01011 0 0 0 0
#46.1
0 0 0 0.01482 0 0 0 1
#47.1
0.00083 0 0 0.01672 0.00005 0 1 0
#48.1
0.02044 0.94462 0 0.01835 0 0 0 0
#49.1
0 1 0 0.01221 0 0.00001 0 0
#50.1
0 0.99998 0.00006 0.01181 0 0.00003 0 0
#51.1
0 1 0.00005 0.01093 0 0.00002 0 0
#52.1
0.00097 0 0 0.02044 0 0 0 0.99972
#53.1
1 0 0 0.04179 0 0 0 0.00003
#54.1
1 0 0 0.0077 0 0 0 0
#55.1
0 1 0 0.00683 0 0 0 0
#56.1
0.00033 0 0.99244 0.00761 0 0 0 0
#57.1
0 1 0 0.00964 0 0 0 0
#58.1
0 1 0 0.01014 0 0 0 0
#59.1
1 0 0 0.01223 0 0 0 0
#60.1
0 1 0 0.00754 0 0 0 0
#61.1
0 0.00075 0.99967 0.00752 0 0.00001 0 0
#62.1
0.98382 0 0 0.0277 0 0 0 0.04138
#63.1
0 0 0 0.05042 0 0 0 1
#64.1
0 0 1 0.00537 0 0.00161 0.0001 0
#65.1
0.00073 0 0 0.01129 0 0 0.00001 0.99996
#66.1
0.07095 0 0 0.05681 0 0.0001 0.00001 0.99984
#67.1
0 0 1 0.00945 0 0.00004 0 0
#68.1
0 0.08509 0 0.03581 0 0.00001 0.00035 1
#69.1
0 0 0 0.04085 0 0.00001 0 1
#70.1
1 0 0 0.04469 0 0 0 0
#71.1
0 1 0 0.02069 0 0 0 0
#72.1
0 0.00025 1 0.0211 0.00004 0.00042 0 0
#73.1
0 1 0 0.00849 0 0 0 0
#74.1
0 1 0 0.00646 0 0 0 0
#75.1
148
1 0.00001 0 0.01189 0 0 0 0
#76.1
0 0 0.00089 0.01567 0 0.00242 1 0
#77.1
0 0 0 0.01946 0 0 0 1
#78.1
0.00216 0 0 0.02739 0 0 0 1
#79.1
0 0.99829 0 0.00886 0 0 0 0
#80.1
0 0.00023 0 0.02576 0 0.00001 0.00037 0.99999
#81.1
0 0 1 0.00801 0 0.00009 0 0
#82.1
0.00225 0 0 0.01445 0 0 1 0
#83.1
0 1 0 0.00654 0 0 0 0
#84.1
1 0 0 0.04265 0 0 0 0
#85.1
0 0 0.02756 0.02027 0 0.0234 1 0
#86.1
0 0 0 0.02596 0.01141 0 0.9995 0
#87.1
0 0.00003 1 0.00891 0 0.00003 0 0
#88.1
0 0 0 0.02718 0 0 0 1
#89.1
0.00009 0 0 0.04067 0 0 0 1
#90.1
0.99971 0 0 0.07099 0 0 0 0.00871
#91.1
0 0.99999 0.00003 0.00795 0 0.00001 0 0
#92.1
0.09252 0.96525 0 0.01055 0 0 0 0
#93.1
0 0 0 0.00745 0 0 0.99967 0.00054
#94.1
0 1 0 0.02669 0 0.00002 0 0.00458
#95.1
0 1 0 0.01556 0 0.00002 0 0
#96.1
0 0 0 0.02158 0 0.00001 0.00002 1
#97.1
0 0.99999 0.00006 0.01086 0 0.00002 0 0
#98.1
0 0.00005 0.99837 0.00687 0 0.00108 0.09654 0
#99.1
0 1 0 0.00669 0 0 0 0
#100.1
0 0 0.01831 0.02014 0 0.02009 1 0
#101.1
0 0 0 0.01218 0.00003 0 1 0
#102.1
0 0.00043 0 0.03884 0 0.00422 0.91799 0.08873
#103.1
0 0 0.99998 0.00494 0 0.00116 0.00007 0
#104.1
0 0.03256 0.99893 0.01714 0 0.00009 0 0
#105.1
0 0 0.99996 0.01037 0 0 0 0
#106.1
0 0.99995 0.00002 0.00507 0 0 0 0
#107.1
1 0 0 0.09858 0 0 0 0.00011
#108.1
0 0.00011 0 0.02541 0 0.00002 0.00025 0.99999
#109.1
0.95151 0 0 0.03355 0 0 0.0173 0
#110.1
0 0.98801 0.00047 0.00471 0 0.00001 0 0
#111.1
1 0 0 0.03785 0 0 0 0.00002
#112.1
0 1 0 0.00519 0 0 0 0
#113.1
0.99914 0.00007 0.00263 0.01563 0 0 0 0
#114.1
0.00048 0 0 0.03182 0 0 0 1
#115.1
0.99995 0 0 0.02605 0 0 0 0
#116.1
0.99894 0 0 0.01909 0 0 0 0.00004
#117.1
0 0.99965 0.00014 0.00707 0 0 0 0
149
#118.1
0 0 0 0.01841 0 0 0 1
#119.1
0 0 0 0.01941 0 0 0 1
#120.1
0.00002 0.95528 0 0.01031 0 0 0 0
#121.1
0.91352 0.00024 0.00002 0.01268 0 0 0 0
#122.1
1 0 0 0.00683 0 0 0 0
#123.1
0 0 0 0.01836 0 0 0 1
#124.1
0.00004 0 0 0.01076 0 0 0.08057 0.90566
#125.1
1 0 0 0.07836 0 0 0 0
#126.1
0 0.00111 0.99585 0.00673 0 0.00068 0.00667 0
#127.1
0.0002 0 0 0.03081 0 0 0 1
#128.1
0 0.00001 0 0.02507 0 0.00001 0.00012 1
#129.1
1 0 0 0.00651 0 0 0 0
#130.1
0.00006 0 0 0.02018 0 0 0 0.99999
#131.1
0 0 1 0.00299 0 0.00062 0 0
#132.1
0 0 0 0.0174 0 0 0.00001 1
#133.1
0 1 0.00001 0.01041 0 0.00001 0 0
#134.1
0.00019 0 0 0.02501 0.00001 0 1 0
#135.1
0 0.00001 0.99995 0.00421 0 0.00055 0.00048 0
#136.1
1 0.00046 0 0.01312 0 0 0 0
#137.1
0 0 0.99999 0.00343 0 0.00061 0 0
#138.1
0 0 0 0.02881 0.01794 0 1 0
#139.1
0.94989 0 0 0.0198 0 0 0.08029 0
#140.1
0.99998 0 0 0.02851 0 0 0 0
#141.1
0.07406 0 0 0.05358 0.00001 0 0.92209 0
#142.1
0.00001 0 0.99966 0.0149 0 0 0 0
#143.1
0 0.00014 0 0.03409 0 0.00006 0.08955 0.99518
#144.1
0 0.00027 0 0.02964 0 0.00003 0 1
#145.1
0.00719 0 0.95783 0.01318 0 0 0 0
#146.1
1 0 0 0.02669 0 0 0 0
#147.1
0 1 0 0.01037 0 0 0 0
#148.1
0.99845 0 0 0.02335 0 0 0 0.00183
#149.1
1 0 0 0.00544 0 0 0 0
#150.1
0.00179 0 0 0.04316 0 0 0 1
#151.1
0 0.00002 1 0.01125 0 0.00006 0 0
#152.1
0.00001 0 0 0.01544 0 0 0 1
#153.1
0 0 0 0.01871 0 0 0 1
#154.1
0 0 0 0.05922 0 0.00001 0 1
#155.1
1 0.0001 0 0.01526 0 0 0 0
#156.1
1 0.00009 0 0.01414 0 0 0 0
#157.1
0 0.99999 0 0.01109 0 0 0 0.00009
#158.1
0 0 0 0.01722 0 0 0 1
#159.1
0 0 0 0.02112 0.99855 0.05369 0.05745 0
#160.1
150
0 0 0 0.01905 0 0 0.90585 0.0939
#161.1
0 0 0 0.00808 0 0.00008 1 0.00111
#162.1
0 0 1 0.00585 0 0.0024 0.0001 0
#163.1
1 0 0 0.04476 0 0 0 0
#164.1
0 1 0 0.00691 0 0 0 0
#165.1
0 0 0 0.01593 0 0.05242 1 0
#166.1
0.00012 0 0 0.03527 0 0 0 1
#167.1
0 0.98752 0 0.00532 0 0 0 0
#168.1
1 0 0 0.00722 0 0 0 0
#169.1
0.99999 0 0 0.01768 0 0 0 0
#170.1
0.00001 0 0.99966 0.01351 0 0 0 0
#171.1
0 0 0.01829 0.01357 0 0.00775 1 0
#172.1
0 0 0 0.01438 0 0 0.99999 0.00001
#173.1
1 0 0 0.0075 0 0 0 0
#174.1
0.04965 0 0 0.03067 0 0 0 0.99867
#175.1
0 0.99995 0 0.02726 0 0 0 0
#176.1
1 0 0.00003 0.01296 0 0 0 0
#177.1
0.00005 0 0 0.0157 0 0 0 1
#178.1
0 0.90984 0.01321 0.00981 0 0 0 0
#179.1
0 0 0 0.01562 0.00004 0.00001 1 0
#180.1
1 0.00004 0 0.00978 0 0 0 0
#181.1
0 0.00001 0 0.01986 0 0.03403 0.9999 0
#182.1
0 0.00014 0 0.02813 0 0.00002 0.00002 1
#183.1
1 0 0 0.05374 0 0 0 0
#184.1
0.00005 0 0 0.01961 0 0 0 0.99999
#185.1
1 0.00002 0 0.01514 0 0 0 0
#186.1
0 0 1 0.00438 0 0.00661 0 0
#187.1
0 0.99998 0 0.00535 0 0 0 0
#188.1
0 0 0 0.01585 0.0001 0.00001 1 0
#189.1
1 0 0 0.02155 0 0 0 0
#190.1
1 0.00001 0 0.01 0 0 0 0
#191.1
1 0 0 0.02942 0 0 0 0
#192.1
0 1 0 0.01432 0 0 0 0
#193.1
0 0 0 0.01725 0.00006 0.00001 1 0
#194.1
0.00009 0 0 0.04304 0 0 0 1
#195.1
1 0 0 0.0286 0 0 0 0
#196.1
0 0 0 0.02214 0.00014 0.00002 1 0
#197.1
0.99952 0.00051 0.00011 0.02012 0.00003 0 0 0
#198.1
0 0 1 0.00496 0 0.00521 0.00019 0
#199.1
0.99917 0 0.00307 0.01197 0 0 0 0
#200.1
0 0.0001 0 0.04542 0 0.00123 0.06306 0.91396
#201.1
0.0056 0.99728 0 0.00477 0 0 0 0
#202.1
0 0.9718 0.04151 0.00836 0 0 0 0
151
#203.1
0 1 0 0.01194 0 0 0 0
#204.1
0.9996 0 0 0.01991 0 0 0 0.00005
#205.1
0 0 0.073 0.01048 0 0.002 0.99997 0
#206.1
0 0.00006 0 0.02339 0 0.00001 0.0007 0.99999
#207.1
1 0 0.00001 0.00895 0 0 0 0
#208.1
0 0.00068 0.99778 0.00768 0 0.00277 0.00094 0
#209.1
1 0 0 0.00973 0 0 0 0
#210.1
1 0 0 0.0161 0 0 0 0
#211.1
0 1 0 0.00752 0 0.00001 0 0
#212.1
0.99218 0 0 0.02445 0 0 0 0.00209
#213.1
1 0 0.00001 0.00651 0 0 0 0
#214.1
0 0 0 0.00646 0 0 1 0
#215.1
0 0 0 0.01805 0 0 0 1
#216.1
0 0.00003 0.96067 0.00699 0 0.00249 0.00017 0
#217.1
0 0 0.03285 0.01769 0 0.07964 1 0
#218.1
0 0 0 0.0334 0.97487 0.00002 0.01773 0
#219.1
0.00001 0 0 0.01542 0 0 0 1
#220.1
0 0.99981 0.00004 0.00676 0 0 0 0
#221.1
0.99717 0.04298 0 0.01175 0 0 0 0
#222.1
0 0.99965 0.00007 0.00835 0 0 0 0
#223.1
0 0 0.00041 0.01526 0 0.00337 1 0
#224.1
0.99728 0 0 0.02501 0 0 0 0.0024
#225.1
0 0.09587 0.97413 0.00743 0 0 0 0
#226.1
0 1 0 0.00893 0 0 0 0
#227.1
1 0 0 0.04591 0 0 0 0
#228.1
0 1 0.00004 0.00844 0 0.00003 0 0
#229.1
0.08499 0 0 0.02329 0 0 0 0.98853
#230.1
0.00105 0.99993 0 0.00589 0 0 0 0
#231.1
0 1 0 0.00742 0 0 0 0
#232.1
0 1 0 0.00883 0 0 0 0
#233.1
0 0 0 0.05279 0 0.00001 0 1
#234.1
0 0.00042 0.99994 0.00844 0 0 0 0
#235.1
0 0.09547 0 0.02903 0 0.00001 0.00009 0.99952
#236.1
0 0 1 0.00569 0 0.00135 0.00002 0
#237.1
0 0.00011 1 0.00896 0 0.00002 0 0
#238.1
0 0 0.00174 0.00909 0.09431 0.91368 1 0
#239.1
0.99988 0.01013 0 0.00877 0 0 0 0
#240.1
0 0.01598 0.99946 0.00929 0 0 0 0
#241.1
0 1 0 0.00802 0 0 0 0
#242.1
1 0 0 0.03285 0 0 0 0
#243.1
0 0 0 0.01842 0 0 0 1
#244.1
0 0 0 0.01793 0 0 0 1
#245.1
152
0 0.00005 0.99974 0.01034 0 0 0 0
#246.1
0.99999 0 0 0.03171 0 0 0 0
#247.1
0 0.99998 0.00029 0.01104 0 0.00003 0 0
#248.1
1 0.00011 0 0.01208 0 0 0 0
#249.1
0 1 0 0.01559 0 0.00001 0 0
#250.1
1 0 0 0.04071 0 0 0 0
#251.1
0.9959 0 0 0.02388 0 0 0 0.00423
#252.1
1 0 0 0.04084 0 0 0 0
#253.1
0 1 0 0.00658 0 0 0 0
#254.1
1 0 0 0.00926 0 0 0 0
#255.1
0 0.00002 0 0.02653 0 0.00001 0.00001 1
#256.1
0 0 0 0.03415 0 0.00004 0.00001 0.99999
#257.1
0 0.99997 0.00001 0.00579 0 0 0 0
#258.1
0.99992 0 0 0.02455 0 0 0 0
#259.1
0 0.99992 0.00002 0.00575 0 0 0 0
#260.1
0.00022 0 0 0.02854 0 0 0 1
#261.1
0 0 0 0.01872 0 0 0 1
#262.1
0 0 0 0.0092 0 0 1 0
#263.1
0 0.99941 0.00011 0.00892 0 0 0 0
#264.1
0 1 0 0.0111 0 0.00001 0 0
#265.1
0 0.90698 0.00028 0.00717 0 0 0 0
#266.1
0 0.99976 0.00007 0.00635 0 0 0 0
#267.1
0 1 0 0.0197 0 0 0 0
#268.1
0 0 0 0.01911 0 0 0 1
#269.1
0.00359 0 0 0.02321 0 0 0 0.99983
#270.1
0.00229 0 0.97519 0.00686 0 0 0 0
#271.1
0 0.99958 0.00029 0.00694 0 0 0 0
#272.1
0 1 0 0.00645 0 0 0 0
#273.1
0.02286 0 0.90328 0.01175 0 0 0 0
#274.1
1 0 0 0.00671 0 0 0 0
#275.1
0 1 0 0.01348 0 0 0 0
#276.1
0.00027 0.00002 0 0.0363 0 0.00038 0.00922 0.91754
#277.1
0 0 0 0.02017 0 0 0 1
#278.1
0.99778 0 0 0.02548 0 0 0 0.00054
#279.1
1 0.00001 0 0.03047 0 0 0 0
#280.1
0 0 0 0.01772 0 0 0 1
#281.1
0.95052 0 0 0.02076 0 0 0 0.09417
#282.1
0 0 0 0.01827 0 0 0 1
#283.1
1 0 0 0.05683 0 0 0 0.00151
#284.1
0 0 0.00012 0.00553 0 0.00301 1 0
#285.1
1 0.00016 0 0.01392 0 0 0 0
#286.1
0 0.00255 0 0.02714 0 0.00001 0.00051 1
#287.1
0 0.00093 0 0.08018 0 0 0 0.99971
153
#288.1
0 1 0 0.00752 0 0 0 0
#289.1
0 0 0 0.01766 0 0 0 1
#290.1
1 0 0 0.01587 0 0 0 0
#291.1
0 0.99999 0 0.01338 0 0 0 0
#292.1
0 0.00025 0 0.04869 0 0.00029 0.07489 0.91749
#293.1
0 0 0 0.01719 0 0 0 1
#294.1
0 0 0 0.01034 0 0 0.05245 0.90801
#295.1
1 0 0 0.02956 0 0 0 0
#296.1
0 0 1 0.01473 0 0 0 0
#297.1
0 0 0 0.0203 0 0 0 1
#298.1
0 0.00003 0 0.02578 0 0.00002 0.00001 1
#299.1
0.99166 0.00008 0 0.02111 0 0 0 0
#300.1
0.00569 0 0 0.0356 0 0 0 1
#301.1
0.99999 0 0 0.03164 0 0 0 0
#302.1
0.00025 0 0 0.0132 0 0 1 0
#303.1
1 0 0 0.03528 0 0 0 0
#304.1
0 0.99999 0 0.00784 0 0 0 0
#305.1
0 0 0.00095 0.01435 0 0.00336 1 0
#306.1
0 1 0 0.00834 0 0 0 0
#307.1
1 0 0 0.07935 0 0 0 0.00006
#308.1
0 0 0 0.04051 0 0.00001 0.00224 0.98346
#309.1
0 0 0 0.02118 0 0 0 1
#310.1
0 0 0 0.00717 0 0 1 0
#311.1
0 1 0 0.0095 0 0.00001 0 0
#312.1
1 0 0 0.04903 0 0 0 0
#313.1
0 0.99997 0 0.00583 0 0 0 0
#314.1
1 0 0 0.00857 0 0 0 0
#315.1
0 1 0 0.0104 0 0 0 0
#316.1
0 0 1 0.0048 0 0.00517 0.00016 0
#317.1
0 0 0 0.02369 0 0.00015 0.08509 0.92269
#318.1
0 0 0 0.01928 0 0 0 1
#319.1
0.99996 0 0 0.03053 0 0 0 0
#320.1
0 0 0 0.02399 0 0 0 1
#321.1
0 0.00258 0.99553 0.00958 0 0.00516 0.00904 0
#322.1
0 0.99998 0 0.00911 0 0 0 0.00005
#323.1
0 1 0 0.01227 0 0 0 0
#324.1
1 0 0 0.04348 0 0 0 0
#325.1
0 0 0 0.01801 0 0 0 1
#326.1
0 1 0 0.02227 0 0 0 0
#327.1
0 0.00001 0.99507 0.00541 0 0.00169 0.00011 0
#328.1
0 0 0.00027 0.01241 0 0.00131 1 0
#329.1
0 0 0.99638 0.00627 0 0.00099 0.00814 0
#330.1
154
0 0 0 0.01616 0 0 0.00001 1
#331.1
0.99999 0 0 0.02498 0 0 0 0
#332.1
1 0 0 0.01019 0 0 0 0
#333.1
1 0 0 0.04103 0 0 0 0
#334.1
0.999 0 0 0.02013 0 0 0 0.00047
#335.1
0.00006 0 0 0.03693 0 0 0 1
#336.1
0.99764 0 0.00632 0.01 0 0 0 0
#337.1
0.00001 0 0 0.02864 0.0017 0 1 0
#338.1
0 0.0009 0.99989 0.00918 0 0 0 0
#339.1
0 0 0 0.04206 0 0 0 1
#340.1
0 0.00002 0.99996 0.00974 0 0 0 0
#341.1
1 0 0 0.01377 0 0 0 0
#342.1
0 0.99999 0.00001 0.00985 0 0.00001 0 0
#343.1
1 0 0 0.00711 0 0 0 0
#344.1
1 0 0 0.04184 0 0 0 0.00007
#345.1
0 0 0 0.01634 0 0 0 1
#346.1
0 0 1 0.00385 0 0.00339 0.00003 0
#347.1
0 0 1 0.00435 0 0.02313 0 0
#348.1
0 1 0 0.01164 0 0 0 0
#349.1
0.99999 0.00038 0 0.01537 0 0 0 0
#350.1
0 0.00275 0 0.02324 0 0.00002 0.00002 0.99982
#351.1
0 0.99975 0.00006 0.0069 0 0 0 0
#352.1
0 0 0 0.02391 0.94783 0 0.0831 0
#353.1
1 0 0.00001 0.00823 0 0 0 0
#354.1
0.00066 0 0 0.06666 0 0.00005 0 0.99999
#355.1
0 0.00044 0 0.02613 0 0.00001 0.00038 0.99999
#356.1
0.99997 0 0 0.03095 0 0 0 0
#357.1
0 0 0.00112 0.01734 0 0.00636 1 0
#358.1
0 1 0 0.02897 0 0.00002 0 0.00001
#359.1
0 0 0.99998 0.00478 0 0.00288 0.00006 0
#360.1
0 0 0 0.00687 0 0 1 0
#361.1
0 1 0 0.00702 0 0 0 0
#362.1
0 0 0 0.00836 0 0 1 0
#363.1
0 0 0.99999 0.00317 0 0.00072 0 0
#364.1
1 0 0 0.06537 0 0 0 0
#365.1
0.99996 0 0 0.02908 0 0 0 0
#366.1
0 0.99999 0 0.00509 0 0 0 0
#367.1
0 0.00053 0 0.05332 0 0.00014 0 0.9992
#368.1
0 1 0 0.00547 0 0 0 0
#369.1
0 0.00013 0 0.02514 0 0.00002 0.00036 0.99999
#370.1
0 0.99999 0 0.00938 0 0 0 0
#371.1
0 1 0 0.00735 0 0 0 0
#372.1
0 0 0 0.02336 0 0.00001 0.93238 0.0807
155
#373.1
0 0 0 0.01955 0 0.00001 0.93436 0.06751
#374.1
0 0 0 0.02245 0 0.00001 0.00023 1
#375.1
0 0 1 0.00679 0 0.00009 0 0
#376.1
0 0 0 0.01159 0 0 1 0
#377.1
0.99997 0.00023 0 0.00948 0 0 0 0
#378.1
0 1 0 0.0064 0 0 0 0
#379.1
1 0 0 0.04688 0 0 0 0
#380.1
0 0.00009 0 0.02552 0 0.00002 0.00017 0.99999
#381.1
1 0 0 0.04514 0 0 0 0.00004
#382.1
0 0 0 0.03581 0.0511 0.00053 0.91545 0
#383.1
0 1 0 0.00704 0 0 0 0
#384.1
0 0 0 0.01932 0 0 0 1
#385.1
0.00388 0 0 0.02602 0 0 0.99997 0
#386.1
0 0.99659 0.00126 0.00808 0 0 0 0
#387.1
0 0 0.99999 0.01611 0.00152 0 0 0
#388.1
0 1 0 0.01243 0 0 0 0
#389.1
0 0 0.081 0.02592 0 0.03297 1 0
#390.1
0 0.00055 0.99994 0.00813 0 0 0 0
#391.1
0 1 0 0.00775 0 0 0 0
#392.1
0 1 0 0.00865 0 0 0 0
#393.1
0 0 0 0.01406 0 0 0.00002 1
#394.1
1 0 0 0.01052 0 0 0 0
#395.1
0 0 0 0.02328 0 0 0 1
#396.1
0 0 0 0.00742 0 0 1 0
#397.1
0 1 0 0.00913 0 0.00001 0 0
#398.1
0.99999 0 0 0.09005 0 0 0 0.00008
#399.1
0 0 0 0.0339 0 0.00002 0.08669 0.91391
#400.1
0 0 0 0.01846 0 0 0.06841 0.91159
#401.1
0 1 0 0.01555 0 0.00001 0 0
#402.1
0 1 0 0.00617 0 0 0 0
#403.1
0.99999 0 0 0.05108 0 0 0 0.0721
#404.1
0 0.0024 0 0.02735 0 0.00001 0.00054 1
#405.1
0 0 0 0.0213 0 0.00007 0.06936 0.9818
#406.1
0.99909 0 0 0.02066 0 0 0.00188 0
#407.1
0 0.90087 0.00624 0.00636 0 0.00003 0 0
#408.1
0 0.00048 0.99969 0.00879 0 0 0 0
#409.1
0.00386 0.99896 0 0.02899 0 0 0 0
#410.1
0.99997 0 0 0.03089 0 0 0 0.00001
#411.1
0.00039 0 0 0.0304 0 0 0 1
#412.1
0 0 0 0.02126 0 0 0 1
#413.1
0 0 0 0.00646 0 0 1 0
#414.1
0 0.00002 0 0.04039 0 0.00009 0.00001 1
#415.1
156
0.00002 0.00043 0 0.04095 0 0.00037 0.00066 0.9996
#416.1
0 0.00006 0.94071 0.0064 0 0.00181 0.00009 0
#417.1
1 0.00001 0 0.00996 0 0 0 0
#418.1
1 0 0 0.0731 0 0 0 0.00043
#419.1
0 0.09937 0.90086 0.00499 0 0.0001 0 0
#420.1
0 0.99996 0 0.00513 0 0 0 0
#421.1
0 1 0 0.01268 0 0 0 0
#422.1
0 0.00063 0.99983 0.007 0 0.00001 0 0
#423.1
0 1 0 0.00998 0 0.00001 0 0
#424.1
0 0 0 0.01768 0 0 0 1
#425.1
0 0.99998 0 0.00604 0 0 0 0
#426.1
0 0 0 0.02416 0 0 0.0002 0.99987
#427.1
0.9136 0 0.02784 0.00792 0 0 0 0
#428.1
0 0 0 0.02692 0 0 0 1
#429.1
0.00001 0 0 0.02723 0.00064 0 1 0
#430.1
1 0 0 0.01629 0 0 0 0
#431.1
0 0 0.99499 0.01508 0.01009 0 0 0
#432.1
0.00001 0 0 0.01436 0 0 0 1
#433.1
0.00001 0 0 0.04275 0 0 0 1
#434.1
0.99991 0 0 0.03122 0 0 0 0.00001
#435.1
0 0 0 0.01968 0 0 0 1
#436.1
0.08121 0 0 0.02718 0 0 0.93212 0
#437.1
0.00021 0 0 0.06276 0 0.00007 0.00002 0.99998
#438.1
0 0 0 0.01169 0 0 1 0
#439.1
0 0.09184 0 0.02787 0 0.00002 0 0.08828
#440.1
0 1 0 0.00676 0 0 0 0
#441.1
0.92188 0 0 0.02508 0 0 0 0.0148
#442.1
0 0.99771 0.00104 0.00766 0 0 0 0
#443.1
0.08954 0 0 0.02275 0 0 0 0.90659
#444.1
0.94553 0.09513 0 0.01886 0 0 0 0
#445.1
0 0.00001 0 0.02664 0 0.00004 0.0002 0.99996
#446.1
0 0 1 0.00426 0 0.03073 0 0
#447.1
0 0.00006 0 0.02249 0 0.00001 0.00069 0.99999
#448.1
0.99999 0 0.00013 0.01161 0 0 0 0
#449.1
1 0 0 0.00642 0 0 0 0
#450.1
0.00449 0 0 0.02895 0 0 0 1
#451.1
0 0 0.99978 0.00628 0 0.00127 0.001 0
#452.1
0.99929 0.09483 0 0.00768 0 0 0 0
#453.1
0 1 0.03003 0.00669 0 0.0004 0 0
#454.1
0.00429 0 0 0.04934 0 0 0 1
#455.1
0 0.00078 0 0.03079 0 0 0 0.91431
#456.1
0 0 0 0.01911 0 0 0 1
#457.1
0 0.99922 0.00031 0.00659 0 0 0 0
157
#458.1
0 1 0 0.00827 0 0 0 0
#459.1
0 0 0 0.02247 0 0 0 1
#460.1
0 0.00214 0 0.02791 0 0.00001 0.00055 0.99999
#461.1
0.0001 0 0 0.03695 0.08096 0 0.99999 0
#462.1
0 0 0 0.00738 0 0 1 0
#463.1
0 0 0 0.03947 0 0.00002 0.00207 0.99714
#464.1
0 0.94191 0.07917 0.01032 0 0 0 0
#465.1
0.99781 0 0 0.03236 0 0 0.00012 0
#466.1
0.99959 0 0.00026 0.0073 0 0 0 0
#467.1
0 1 0 0.00789 0 0 0 0
#468.1
0.99995 0 0 0.02455 0 0 0 0
#469.1
0 0 1 0.01049 0 0.00006 0 0
#470.1
0 0.00107 0.99196 0.00944 0 0.00938 0.00068 0
#471.1
0 0 0 0.02061 0.00003 0.00001 1 0
#472.1
1 0 0 0.03136 0 0 0 0
#473.1
1 0 0 0.01435 0 0 0 0
#474.1
0 0 0 0.03467 0 0.00362 0.9622 0.0045
#475.1
0.92106 0 0 0.01825 0 0 0.00172 0.00002
#476.1
0.00018 0 0 0.0095 0 0 0.00281 0.99378
#477.1
0 0 0 0.01797 0 0 0 1
#478.1
0.99999 0 0 0.03217 0 0 0 0
#479.1
1 0 0 0.008 0 0 0 0
#480.1
0.99946 0.00242 0 0.00492 0 0 0 0
#481.1
0 0 0 0.01525 0 0 0 1
#482.1
1 0.00047 0 0.01241 0 0 0 0
#483.1
0.00001 0 0 0.02416 0 0 0 1
#484.1
0 0 0 0.01008 0.00001 0.00001 1 0
#485.1
0.00004 0 0 0.04175 0.00007 0 0.99998 0
#486.1
1 0 0 0.04859 0 0 0 0
#487.1
0.99995 0.00016 0 0.01028 0 0 0 0
#488.1
1 0 0 0.00905 0 0 0 0
#489.1
0.00025 0 0 0.03528 0 0 0 1
#490.1
0 0.0001 0 0.02607 0 0.00002 0.00005 1
#491.1
0 0 1 0.00951 0 0.00005 0 0
#492.1
1 0 0 0.03732 0 0 0 0.00001
#493.1
0 0 0 0.02472 0 0.00108 0.96758 0.00451
#494.1
0.02376 0 0 0.0492 0.00367 0 0.92177 0
#495.1
0 0.00003 0 0.02467 0 0.00001 0.00023 0.99999
#496.1
0 0.99997 0 0.00608 0 0 0 0
#497.1
0 1 0 0.00749 0 0 0 0
#498.1
0.00011 0.99954 0 0.0046 0 0 0 0
#499.1
0 0.97506 0.07846 0.00762 0 0.00009 0 0
#500.1
158
0.00001 0 0 0.0344 0.09581 0 0.99999 0
#501.1
1 0 0 0.03362 0 0 0 0
#502.1
0 0 0 0.03158 0 0 0 1
#503.1
0 0.00003 0 0.03739 0 0.00006 0.00001 1
#504.1
0 0 0 0.0225 0 0 0 1
#505.1
0 1 0 0.01116 0 0 0 0
#506.1
0.00006 0 0 0.03278 0.00005 0 1 0
#507.1
0.0014 0 0 0.01529 0.00004 0 1 0
#508.1
0.9997 0 0 0.0438 0 0 0 0
#509.1
0 1 0 0.0075 0 0 0 0
#510.1
0 0.99804 0.00075 0.00713 0 0 0 0
#511.1
0 0.00002 1 0.00911 0 0.00002 0 0
#512.1
1 0 0 0.01124 0 0 0 0
#513.1
1 0 0 0.01605 0 0 0 0
#514.1
0 0.99471 0.00239 0.00787 0 0 0 0
#515.1
0.99996 0 0 0.02554 0 0 0 0
#516.1
0 0.00013 0 0.02725 0 0.00002 0.00005 1
#517.1
0 1 0 0.0075 0 0 0 0
#518.1
1 0 0 0.00708 0 0 0 0
#519.1
0 1 0 0.01596 0 0.00002 0 0
#520.1
0.99987 0 0 0.02408 0 0 0 0
#521.1
0 0 0 0.02249 0 0.00001 0.93472 0.07681
#522.1
0 0.99947 0 0.01376 0 0.00001 0 0.00147
#523.1
1 0 0 0.01003 0 0 0 0
#524.1
0 0.9935 0.00392 0.00799 0 0 0 0
#525.1
0 1 0.00001 0.00989 0 0.00002 0 0
#526.1
0 0.05223 0.98699 0.00868 0 0 0 0
#527.1
0 1 0 0.00777 0 0 0 0
#528.1
0 0.08785 0 0.04031 0 0.00291 0.94694 0.01159
#529.1
0 0 0 0.01857 0 0 0 1
#530.1
0 0 0 0.02459 0 0 0 1
#531.1
0 0 1 0.00346 0 0.04528 0 0
#532.1
0.99996 0 0 0.02788 0 0 0 0
#533.1
0 1 0 0.01522 0 0 0 0
#534.1
0 1 0 0.01442 0 0 0 0
#535.1
0.99992 0 0 0.0308 0 0 0 0.00001
#536.1
0.0056 0 0 0.05265 0 0 0 0.99996
#537.1
0 0 0 0.05675 0 0.00001 0 1
#538.1
0.99999 0 0 0.0262 0 0 0 0
#539.1
0.95121 0 0.07246 0.01482 0 0 0 0
#540.1
0 0.00006 0 0.02455 0 0.00002 0.00008 0.99999
#541.1
0 0 1 0.00335 0 0.09433 0.00003 0
#542.1
0 0.00237 0 0.05982 0 0.00015 0.00002 0.9995
159
#543.1
0.99919 0 0 0.07526 0 0 0 0.06832
#544.1
0 0 0 0.04546 0.00006 0.0001 1 0
#545.1
1 0 0 0.00676 0 0 0 0
#546.1
0 0 0 0.01777 0 0 0 1
#547.1
0 1 0 0.00809 0 0 0 0
#548.1
1 0 0 0.03552 0 0 0 0
#549.1
0 1 0 0.01572 0 0 0 0
#550.1
0.99999 0.00044 0 0.00562 0 0 0 0
#551.1
0 0 0 0.01246 0 0.00001 0.0691 0.9951
#552.1
0 0.99992 0.00002 0.00672 0 0 0 0
#553.1
0 0.99993 0.00002 0.00772 0 0 0 0
#554.1
0.08566 0 0 0.02949 0.00083 0 0 0
#555.1
1 0.00002 0 0.01024 0 0 0 0
#556.1
0 0 0 0.00959 0 0 1 0
#557.1
0 0.99984 0.00004 0.00656 0 0 0 0
#558.1
0 0 0.99998 0.01593 0.00015 0 0 0
#559.1
0.00002 0 0 0.00766 0 0 0.99994 0.00969
#560.1
1 0 0 0.00941 0 0 0 0
#561.1
0 1 0 0.00806 0 0 0 0
#562.1
0 1 0 0.00723 0 0 0 0
#563.1
0 1 0 0.01587 0 0.00001 0 0
#564.1
0 0 0 0.02817 0 0 0 1
#565.1
0 1 0 0.00678 0 0 0 0
#566.1
0 0 0 0.02919 0.04289 0 0.99999 0
#567.1
0.99921 0 0 0.02464 0 0 0 0.00034
#568.1
0 1 0 0.00613 0 0 0 0
#569.1
0 0 0 0.0183 0 0 0 1
#570.1
0 0 0 0.01764 0 0 0 1
#571.1
0 0.00001 1 0.00384 0 0.03079 0.04473 0
#572.1
0.99845 0 0 0.02235 0 0 0 0.00146
#573.1
1 0.00002 0 0.01184 0 0 0 0
#574.1
0 0.01826 0 0.03221 0 0.00001 0.00044 1
#575.1
0.00046 0 0 0.02882 0 0 0 0.01422
#576.1
1 0.00001 0 0.01169 0 0 0 0
#577.1
0 0.99999 0 0.00597 0 0 0 0
#578.1
0 0.00002 0 0.03431 0 0.00006 0.00001 0.99999
#579.1
0 0.97254 0.01796 0.00805 0 0 0 0
#580.1
0 0.99191 0 0.01418 0 0 0 0.01744
#581.1
0 0.00253 0 0.05282 0 0.00021 0.00005 0.99859
#582.1
1 0.00003 0 0.01286 0 0 0 0
#583.1
0 0.9982 0.00331 0.00632 0 0.00005 0 0.00003
#584.1
0.99999 0 0 0.02849 0 0 0 0
#585.1
160
0 0 0 0.01603 0 0 0 1
#586.1
1 0 0 0.07812 0 0 0 0
#587.1
0 0 0 0.01807 0 0.00103 0.99955 0.00004
#588.1
0 0 0 0.041 0.00164 0 1 0
#589.1
0 0.0022 0.99708 0.00468 0 0.0002 0.00003 0
#590.1
0 0 0 0.00952 0 0 1 0
#591.1
0 0.00012 0 0.02609 0 0.00002 0.00013 1
#592.1
1 0 0 0.04058 0 0 0 0
#593.1
0.99996 0 0.00029 0.00672 0 0 0 0
#594.1
0.00001 0 0 0.02021 0 0 0 1
#595.1
1 0 0 0.05724 0 0 0 0
#596.1
1 0 0 0.03543 0 0 0 0
#597.1
0 0 0 0.00672 0 0 1 0
#598.1
0 0 0 0.01101 0 0 0.99856 0.00129
#599.1
0 1 0.00001 0.00873 0 0.00001 0 0
#600.1
0 0 0.00117 0.01485 0 0.00202 1 0
#601.1
0 0.00012 0.9024 0.00697 0 0.00147 0.00001 0
#602.1
0.99994 0.00007 0 0.01672 0 0 0 0
#603.1
1 0 0 0.03323 0 0 0 0
#604.1
0 0.00135 0.99925 0.00916 0 0.00002 0 0
#605.1
0 0.0735 0.9115 0.00493 0 0.00034 0 0
#606.1
0.00001 0.99992 0 0.00515 0 0 0 0
#607.1
0 0.99371 0.0001 0.01059 0 0 0 0
#608.1
0.90687 0 0 0.02401 0 0 0 0
#609.1
0 0 1 0.00314 0 0.01169 0.00017 0
#610.1
0 0 0 0.00722 0 0 1 0
#611.1
0 0.96471 0.00063 0.0077 0 0.00048 0 0
#612.1
0 1 0 0.01254 0 0.00021 0 0.00001
#613.1
0.00023 0.99991 0 0.00958 0 0 0 0
#614.1
0.07548 0 0 0.06213 0 0 0 0.99529
#615.1
0 1 0 0.01353 0 0 0 0
#616.1
0 0 0 0.02739 0 0.00003 0.0001 0.99998
#617.1
0 0.00014 0 0.02363 0 0.00001 0.00044 0.99999
#618.1
0 0 0 0.03377 0 0 0 1
#619.1
0 0.99945 0.00191 0.00682 0 0.00003 0 0
#620.1
0 1 0 0.00774 0 0 0 0
#621.1
0.00002 0 0 0.04231 0.00113 0 1 0
#622.1
0.00003 0 0 0.05629 0 0.00009 0.01777 0.98283
#623.1
1 0 0 0.00628 0 0 0 0
#624.1
0 0.99999 0 0.01221 0 0 0 0.00001
#625.1
0 0.99513 0 0.01262 0 0 0 0.02394
#626.1
0 1 0 0.0254 0 0.00002 0 0
#627.1
0 0.99974 0.00006 0.00593 0 0 0 0
161
#628.1
1 0 0 0.05305 0 0 0 0.00011
#629.1
0 0 0 0.04354 0.00676 0 1 0
#630.1
0 0.00001 0 0.03246 0 0.00001 0 1
#631.1
0.00278 0.00017 0.99145 0.01565 0.001 0.00001 0 0
#632.1
1 0 0.00001 0.0126 0 0 0 0
#633.1
0 0.00008 0 0.02225 0 0.00001 0.00061 0.99999
#634.1
0.00158 0 0 0.03513 0 0 0 1
#635.1
0.99906 0 0 0.02693 0 0 0 0.00092
#636.1
1 0 0 0.03307 0 0 0 0
#637.1
0.00009 0 0 0.01293 0 0 0 1
#638.1
0 0 0 0.00663 0 0 1 0
#639.1
0 0 0.99999 0.01328 0 0 0 0
#640.1
0 0 0 0.01855 0 0.00002 0.00178 0.99973
#641.1
1 0 0 0.04648 0 0 0 0
#642.1
0 0 0.99994 0.00308 0 0.0003 0 0
#643.1
0.08323 0 0 0.02966 0 0 0.9461 0
#644.1
0 0 0 0.02628 0 0 0 1
#645.1
1 0 0 0.00793 0 0 0 0
#646.1
0 0 0.99325 0.0169 0.09472 0.00001 0 0
#647.1
0 0 0 0.01418 0 0 0.00109 0.99998
#648.1
0 0 0 0.04396 0 0.00001 0 1
#649.1
0 0 0.00094 0.01423 0 0.00289 1 0
#650.1
0 0.00002 0 0.03212 0 0.00005 0.00002 0.99999
#651.1
0.03379 0 0 0.04731 0 0 0.92098 0
#652.1
0.00027 0 0 0.01613 0 0 0 0.99996
#653.1
1 0.00002 0 0.01233 0 0 0 0
#654.1
0 0.9111 0 0.03868 0 0 0 0
#655.1
0 0.99998 0 0.00543 0 0 0 0
#656.1
1 0 0 0.05146 0 0 0 0
#657.1
0.00001 0.99994 0 0.0074 0 0 0 0
#658.1
1 0 0 0.04162 0 0 0 0
#659.1
0 1 0 0.00781 0 0 0 0
#660.1
0 1 0 0.02228 0 0 0 0
#661.1
1 0 0 0.03491 0 0 0 0
#662.1
0 0.00001 0 0.04057 0 0.00007 0 0.99999
#663.1
0 0 0 0.0202 0 0 0 1
#664.1
0.00001 0 0 0.01188 0 0 0 0.99998
#665.1
0 0 1 0.00313 0 0.00499 0.00007 0
#666.1
0 0.00001 0.9999 0.00564 0 0.00201 0.0001 0
#667.1
0 0 0.00123 0.01484 0 0.00246 1 0
#668.1
0 0 1 0.01422 0.00001 0 0 0
#669.1
0 0.99944 0.00004 0.00504 0 0.00001 0 0
#670.1
162
0.99979 0 0 0.02561 0 0 0 0
#671.1
0 1 0 0.01565 0 0 0 0
#672.1
0 0 0 0.02461 0 0 0 1
#673.1
0 0.00001 0 0.04444 0 0.00011 0.00001 0.99999
#674.1
1 0 0 0.03112 0 0 0 0.00001
#675.1
0.92277 0 0 0.04018 0.00001 0 0.07514 0
#676.1
0 1 0 0.0089 0 0 0 0
#677.1
0.00595 0 0.97304 0.01531 0 0 0 0
#678.1
0 0 0.09003 0.02579 0 0.03792 1 0
#679.1
0.00003 0 0 0.03311 0 0 0 1
#680.1
0.00044 0 0 0.03259 0 0 0 1
#681.1
0.00013 0 0 0.02891 0 0 0 1
#682.1
0 0 0 0.01812 0 0 0 1
#683.1
0 1 0 0.00626 0 0 0 0
#684.1
0 0.99987 0.00003 0.00582 0 0 0 0
#685.1
0 0 0 0.01731 0 0 0 1
#686.1
0.99993 0 0 0.02985 0 0 0 0.00001
#687.1
0 1 0 0.00818 0 0 0 0
#688.1
0 0 0.08987 0.01689 0.90681 0.00002 0 0
#689.1
1 0.00023 0 0.0119 0 0 0 0
#690.1
0 0 1 0.01506 0 0 0 0
#691.1
1 0.00002 0 0.01468 0 0 0 0
#692.1
0 0 0 0.01447 0.00004 0 1 0
#693.1
0 1 0 0.02534 0 0 0 0
#694.1
0 0 0.00539 0.02267 0 0.03875 1 0
#695.1
1 0.00004 0 0.01306 0 0 0 0
#696.1
1 0 0 0.00628 0 0 0 0
#697.1
0.99984 0 0 0.02557 0 0 0 0
#698.1
0 1 0 0.00799 0 0 0 0
#699.1
0 0.00064 0 0.0234 0 0.00001 0.00005 0.99996
#700.1
0 0 0 0.02765 0.99914 0.00003 0 0
#701.1
0 0 0 0.0273 0.99946 0.00003 0 0
#702.1
0 0 0 0.02678 0.99961 0.00003 0 0
#703.1
0 0 0 0.02609 0.99968 0.00004 0 0
#704.1
0 0 0 0.02819 0.99954 0.00004 0 0
#705.1
0 0 0 0.02527 0.99972 0.00004 0 0
#706.1
0 0 0 0.02663 0.99935 0.00003 0 0
#707.1
0 0 0 0.02569 0.99962 0.00004 0 0
#708.1
0 0 0 0.02146 0.99951 0.00003 0 0
#709.1
0 0 0 0.02906 0.99927 0.00004 0 0
#710.1
0 0 0 0.02431 0.9995 0.00003 0 0
#711.1
0 0 0 0.02799 0.99924 0.00004 0 0
#712.1
1 0 0 0.02226 0 0 0 0
163
#713.1
0.99931 0 0 0.02175 0 0 0.00199 0
#714.1
0.99994 0 0 0.02623 0 0 0 0
#715.1
0 0.9982 0.00068 0.00658 0 0 0 0
#716.1
0 0.99916 0.00027 0.0066 0 0 0 0
#717.1
0 0 0.09444 0.02432 0 0.02249 1 0
#718.1
0 0.00013 0 0.02694 0 0.00002 0.00006 1
#719.1
1 0 0 0.01639 0 0 0 0
#720.1
0 0.00003 0.00753 0.0176 0 0.00192 0.95301 0
#721.1
0 0.00022 0 0.02406 0 0.00001 0.00018 0.99998
#722.1
0.99998 0 0.00009 0.01421 0 0 0 0
#723.1
1 0 0 0.00527 0 0 0 0
#724.1
0 0.00001 0 0.02536 0 0 0.00002 0.99998
#725.1
1 0 0.00001 0.01004 0 0 0 0
#726.1
0 0.00005 0 0.03277 0 0.00002 0 1
#727.1
0 0 0 0.01129 0 0.05994 1 0
#728.1
0 0 1 0.00445 0 0.00321 0.00007 0
#729.1
0.99999 0 0 0.03528 0 0 0 0
#730.1
0 1 0 0.0084 0 0.00001 0 0
#731.1
0 0 0.90107 0.00778 0 0 0 0
#732.1
0 1 0 0.01437 0 0 0 0
#733.1
0 0 0 0.02559 0 0 0.99971 0
#734.1
1 0 0 0.06691 0 0 0 0.00001
#735.1
1 0 0 0.04524 0 0 0 0
#736.1
0.91011 0 0 0.06721 0.00001 0.00004 0.03095 0.00075
#737.1
0.00029 0.99356 0 0.01082 0 0 0 0
#738.1
0 0 0 0.05496 0 0.00002 0 0.99996
#739.1
0 0 0 0.03543 0.00001 0.0005 1 0.00001
#740.1
0 0 0 0.01817 0 0 0 1
#741.1
0 1 0 0.0086 0 0 0 0
#742.1
0 0.00002 0 0.01675 0 0 0.00262 0.99998
#743.1
0.90165 0 0 0.02668 0 0 0.036 0
#744.1
0 0 0 0.03361 0 0 0 1
#745.1
0 0.00001 0 0.02205 0 0.00002 0.0012 0.99993
#746.1
0 0.00367 0 0.02589 0 0.00001 0.00026 0.99993
#747.1
0 0.00108 0 0.02503 0 0 0 0.08482
#748.1
0.00021 0 0 0.01064 0 0 0 0.99998
#749.1
0 0 0.00784 0.01601 0 0.00408 0.99943 0
#750.1
1 0 0 0.03505 0 0 0 0
#751.1
1 0 0 0.00784 0 0 0 0
#752.1
0 1 0 0.01063 0 0 0 0
#753.1
0 0 0 0.014 0 0.00002 0.9518 0.94201
#754.1
0.05418 0 0 0.02181 0 0 0 0.97285
#755.1
164
0 1 0 0.00503 0 0 0 0
#756.1
0 0 0 0.01519 0 0 0.00007 1
#757.1
1 0 0 0.01481 0 0 0 0
#758.1
0.99997 0 0 0.02385 0 0 0 0
#759.1
0.08539 0 0 0.01803 0 0 0 0.97028
#760.1
0 0.99997 0 0.00726 0 0 0 0
#761.1
0 0.99999 0 0.00815 0 0 0 0.00001
#762.1
0 0 0 0.0179 0 0 0.00002 1
#763.1
0 1 0 0.01006 0 0 0 0
#764.1
0 0 0 0.01484 0.00002 0 1 0
#765.1
0.00001 0 0 0.01702 0 0 0 1
#766.1
0.00002 0 0 0.03088 0 0 0 1
#767.1
1 0.00001 0 0.01415 0 0 0 0
#768.1
0 0.95952 0.05887 0.01055 0 0.0001 0 0
#769.1
0.99998 0 0 0.08019 0.00001 0.00002 0.0014 0.00001
#770.1
0 0.00007 0 0.02683 0 0.00002 0.00002 1
#771.1
0.99976 0 0 0.0283 0 0 0 0.00014
#772.1
0.99998 0.00141 0 0.01243 0 0 0 0
#773.1
0.99993 0 0 0.02374 0 0 0 0
#774.1
0 0 0.99973 0.01164 0.00167 0 0 0
#775.1
1 0 0 0.00831 0 0 0 0
#776.1
0 0 0 0.02064 0 0.00057 0.99996 0.00008
#777.1
0 0 0.99998 0.00328 0 0.00105 0 0
#778.1
0.00001 0 0 0.0296 0 0 0 1
#779.1
0 0.09251 0 0.01853 0 0.00001 0 0.98314
#780.1
1 0 0 0.09356 0 0 0 0.00001
#781.1
0 0.00039 0 0.02282 0 0.00001 0.00105 0.99999
#782.1
0 0 0 0.0174 0 0 0 1
#783.1
1 0 0 0.00841 0 0 0 0
#784.1
0.99994 0 0.00009 0.01574 0 0 0 0
#785.1
0 1 0 0.00675 0 0 0 0
#786.1
1 0 0 0.00546 0 0 0 0
#787.1
1 0 0.00002 0.01051 0 0 0 0
#788.1
1 0 0 0.00571 0 0 0 0
#789.1
0 0.03575 0 0.0235 0 0.00002 0 0.99899
#790.1
0.00011 0 0 0.02168 0 0 0 0.99999
#791.1
0 0.00415 0 0.02999 0 0.00001 0.00026 1
#792.1
1 0 0 0.04776 0 0 0 0
#793.1
1 0 0 0.05105 0 0 0 0
#794.1
0 1 0 0.0091 0 0 0 0
#795.1
0 1 0 0.01397 0 0 0 0
#796.1
1 0 0 0.00563 0 0 0 0
#797.1
0 0.00444 0.99607 0.00739 0 0.00143 0.00164 0
165
#798.1
0.99999 0 0 0.0253 0 0 0 0
#799.1
0.99981 0 0 0.02522 0 0 0 0
#800.1
0.01472 0 0.90511 0.00769 0 0 0 0
#801.1
0.09927 0 0 0.0266 0 0 0 0.99471
#802.1
0 0 0 0.01807 0 0 0 1
#803.1
0 1 0 0.01319 0 0 0 0
#804.1
0 0 0.00376 0.00657 0 0.00056 1 0
#805.1
0 0 0 0.02165 0 0 0 1
#806.1
0 0 1 0.00413 0 0.00263 0 0
#807.1
0.99943 0 0 0.02592 0 0 0 0.00008
#808.1
0.99929 0 0 0.03084 0 0 0.00084 0
#809.1
0 1 0 0.00685 0 0 0 0
#810.1
0 0.9819 0 0.01868 0 0.00003 0 0.00205
#811.1
1 0 0 0.00729 0 0 0 0
#812.1
1 0 0 0.01749 0 0 0 0
#813.1
0 0.05595 0 0.0239 0 0.00011 0 0.02326
#814.1
0 1 0 0.008 0 0 0 0
#815.1
0 0 0 0.02039 0 0 0 1
#816.1
1 0 0 0.05191 0 0 0 0
#817.1
1 0 0 0.0323 0 0 0 0
#818.1
0.99996 0 0 0.03091 0 0 0 0
#819.1
0 0 0 0.03116 0 0 0 1
#820.1
0 0 0 0.00433 0 0.00074 1 0
#821.1
0 0.00013 0 0.02748 0 0.00002 0.00004 1
#822.1
1 0 0 0.03877 0 0 0 0
#823.1
0 0 0 0.01485 0.00004 0.00001 1 0
#824.1
0.99993 0 0 0.08703 0 0 0 0.00038
#825.1
1 0.00001 0 0.00731 0 0 0 0
#826.1
0 0 0 0.02063 0 0.00029 0.91142 0.06933
#827.1
0.99955 0 0 0.02502 0 0 0 0.0001
#828.1
0 0 0 0.02332 0 0.00098 0.99993 0
#829.1
1 0 0 0.01471 0 0 0 0
#830.1
0.00001 0.99999 0 0.00481 0 0 0 0
#831.1
0 0 0 0.01899 0 0 0 1
#832.1
0 0.00011 0 0.02707 0 0.00002 0.00003 1
#833.1
0 0.99998 0 0.00729 0 0 0 0
#834.1
0.00001 0 0.99975 0.01356 0 0 0 0
#835.1
0 0.0001 0 0.02494 0 0.00002 0.00036 0.99999
#836.1
0.00778 0 0 0.03894 0 0 0 1
#837.1
1 0 0 0.04581 0 0 0 0
#838.1
0.00002 0 0 0.06186 0 0.00001 0 1
#839.1
1 0 0 0.01327 0 0 0 0
#840.1
166
0 0 0 0.01506 0 0 0.00018 1
#841.1
0 0.99999 0.0001 0.00931 0 0.00002 0 0
#842.1
0.0001 0 0 0.05783 0 0 0 1
#843.1
1 0.00003 0 0.01194 0 0 0 0
#844.1
0.0013 0 0 0.00865 0 0 0.00701 0.98549
#845.1
0.00001 0.97872 0.00001 0.01051 0 0 0 0
#846.1
0 0 0 0.01876 0 0 0 1
#847.1
0 0.99997 0.00001 0.00563 0 0 0 0
#848.1
0 1 0 0.02597 0 0 0 0
#849.1
0.0002 0 0 0.02854 0.00006 0 1 0
#850.1
1 0 0 0.05184 0 0 0 0.00001
#851.1
0 0 0 0.02058 0.00008 0.00002 1 0
#852.1
0 1 0 0.00996 0 0 0 0
#853.1
1 0.00001 0 0.007 0 0 0 0
#854.1
0.00002 0 0 0.01596 0 0 0 1
#855.1
0 0.99999 0 0.00603 0 0 0 0
#856.1
0 1 0 0.00626 0 0 0 0
#857.1
0 0 1 0.00368 0 0.00469 0.00001 0
#858.1
0 0.00267 0.99861 0.00817 0 0.00257 0.01818 0
#859.1
0 0.99999 0 0.00793 0 0 0 0
#860.1
0 0.99998 0.00001 0.00613 0 0 0 0
#861.1
0.00001 0 0 0.03261 0.00013 0 1 0
#862.1
1 0 0 0.02272 0 0 0 0
#863.1
0.99993 0 0 0.02715 0 0 0 0
#864.1
0 0.00177 0.91215 0.00976 0 0 0 0
#865.1
0 0.99988 0 0.01078 0 0 0 0.00071
#866.1
0 0.90185 0.09423 0.00832 0 0 0 0
#867.1
1 0 0 0.02458 0 0 0 0
#868.1
0 0 0.99924 0.01085 0 0 0 0
#869.1
1 0 0 0.00531 0 0 0 0
#870.1
1 0 0.00002 0.00863 0 0 0 0
#871.1
0 1 0 0.00963 0 0 0 0
#872.1
0.99981 0 0 0.02256 0 0 0 0.00006
#873.1
0 0 1 0.00326 0 0.0051 0.00009 0
#874.1
0 0.00002 0 0.01978 0 0 0.00116 0.99999
#875.1
0.00003 0 0 0.0414 0 0 0 1
#876.1
0.00063 0 0 0.00765 0 0 0.92131 0.09061
#877.1
1 0 0 0.00789 0 0 0 0
#878.1
0 0 0 0.01701 0 0 0 1
#879.1
0 0.00103 0 0.02457 0 0 0 0.08304
#880.1
0 0 0.00019 0.01345 0 0.00043 0.90789 0
#881.1
0 0.99656 0 0.01321 0 0 0 0.01036
#882.1
0 1 0 0.00727 0 0 0 0
167
#883.1
0 1 0 0.00636 0 0 0 0
#884.1
0.00035 0.99884 0 0.00987 0 0 0 0
#885.1
0 1 0 0.01599 0 0 0 0
#886.1
0.00002 0.99854 0.08871 0.01197 0 0.00001 0 0
#887.1
1 0.00001 0 0.01279 0 0 0 0
#888.1
0 0.0003 0 0.02505 0 0.00002 0.00017 0.99999
#889.1
0.99991 0 0 0.02555 0 0 0 0
#890.1
0.99982 0 0 0.022 0 0 0.00005 0
#891.1
0 0 0.0008 0.00756 0 0.00065 1 0
#892.1
0 0.01853 0.99663 0.00746 0 0 0 0
#893.1
0.98202 0 0 0.02413 0 0 0 0.00289
#894.1
1 0 0 0.00667 0 0 0 0
#895.1
0 1 0 0.01287 0 0.00003 0 0
#896.1
1 0 0 0.00766 0 0 0 0
#897.1
0 0.93958 0.09029 0.00707 0 0.00012 0 0
#898.1
0 0 0.99991 0.01638 0.01153 0.00001 0 0
#899.1
0 0 0 0.01142 0 0 1 0
#900.1
0 1 0 0.02061 0 0 0 0
#901.1
0.09095 0.9077 0 0.00796 0 0 0 0
#902.1
0 0.00306 0 0.01908 0 0 0 0.0616
#903.1
0.99954 0.00771 0 0.023 0 0 0 0
#904.1
0 0 0 0.01182 0 0 1 0
#905.1
0 0 0 0.0308 0 0.0003 0.90852 0.09324
#906.1
0.09444 0 0 0.0271 0 0 0.9242 0
#907.1
0 1 0 0.00884 0 0 0 0
#908.1
0 0 0 0.01781 0 0 0.00004 1
#909.1
1 0 0 0.03869 0 0 0 0
#910.1
0.99994 0 0.00021 0.01466 0 0 0 0
#911.1
0 0.99824 0.00073 0.00669 0 0 0 0
168
J CÓDIGO FONTE DO APLICATIVO VALIDADOR DA RNA
A seguir é apresentado o código fonte do aplicativo validador de redes neurais , o aplicativo
contem o código fonte da RNA GSC200901-B gerado pelo aplicativo snns2c.exe.
/*********************************************************
RNA.c
-------------------------------------------------------generated at Tue Jun 16 23:40:05 2009
by snns2c ( Bernward Kett 1995 )
*********************************************************/
#include <math.h>
#include <stdio.h>
#define
#define
#ifndef
#define
#endif
Act_Logistic(sum, bias)
Act_Identity(sum, bias)
NULL
NULL (void *)0
typedef struct UT {
float act;
float Bias;
int
NoOfSources;
struct UT
**sources; /*
float *weights; /*
} UnitType, *pUnit;
( (sum+bias<10000.0) ? ( 1.0/(1.0 + exp(-sum-bias) ) ) : 0.0 )
( sum )
/* Activation
*/
/* Bias of the Unit */
/* Number of predecessor units */
predecessor units */
weights from predecessor units */
/* Forward Declaration for all unit types
static UnitType Units[29];
/* Sources definition section */
static pUnit Sources[] = {
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 4, Units + 5, Units + 6, Units + 7,
12, Units + 13,
Units + 14, Units + 15, Units + 16, Units +
Units + 4, Units + 5, Units + 6, Units + 7,
12, Units + 13,
Units + 14, Units + 15, Units + 16, Units +
Units + 4, Units + 5, Units + 6, Units + 7,
12, Units + 13,
Units + 14, Units + 15, Units + 16, Units +
Units + 4, Units + 5, Units + 6, Units + 7,
12, Units + 13,
Units + 14, Units + 15, Units + 16, Units +
Units + 4, Units + 5, Units + 6, Units + 7,
12, Units + 13,
Units + 14, Units + 15, Units + 16, Units +
Units + 4, Units + 5, Units + 6, Units + 7,
12, Units + 13,
Units + 14, Units + 15, Units + 16, Units +
Units + 4, Units + 5, Units + 6, Units + 7,
12, Units + 13,
Units + 14, Units + 15, Units + 16, Units +
Units + 4, Units + 5, Units + 6, Units + 7,
12, Units + 13,
Units + 14, Units + 15, Units + 16, Units +
*/
Units + 8, Units + 9, Units + 10, Units + 11, Units +
17, Units + 18, Units + 19, Units + 20,
Units + 8, Units + 9, Units + 10, Units + 11, Units +
17, Units + 18, Units + 19, Units + 20,
Units + 8, Units + 9, Units + 10, Units + 11, Units +
17, Units + 18, Units + 19, Units + 20,
Units + 8, Units + 9, Units + 10, Units + 11, Units +
17, Units + 18, Units + 19, Units + 20,
Units + 8, Units + 9, Units + 10, Units + 11, Units +
17, Units + 18, Units + 19, Units + 20,
Units + 8, Units + 9, Units + 10, Units + 11, Units +
17, Units + 18, Units + 19, Units + 20,
Units + 8, Units + 9, Units + 10, Units + 11, Units +
17, Units + 18, Units + 19, Units + 20,
Units + 8, Units + 9, Units + 10, Units + 11, Units +
17, Units + 18, Units + 19, Units + 20,
};
169
/* Weigths definition section */
static float Weights[] = {
-2.697980, -3.151080, -25.210899,
3.968060, 31.241920, -33.122879,
62.066269, 2.647630, -63.468349,
-7.463170, -5.524840, -3.441340,
53.176048, -1.333430, -0.141320,
-0.103780, 0.076290, 23.691320,
-15.254840, -12.395110, -8.643120,
22.911280, -19.931400, -12.234780,
25.058550, -0.458840, -8.305130,
-3.137810, 2.215350, 21.342840,
4.059160, -25.332050, 25.506620,
-13.218460, -2.055080, -5.721960,
0.191940, 72.142807, -2.894430,
-15.410860, -7.675940, 20.334330,
4.301910, -15.817540, -5.751450,
-35.093800, 36.284241, -1.786390,
1.176160, -1.482980, 64.152657,
-7.296000, -30.247690, -5.254930, 0.359240, -31.029051, 7.411190, 9.146040, 2.362280, 5.887150,
11.611230,
8.629180, 2.876830, 0.324670, -10.894670, 3.835130, -22.185930, -27.557030,
-24.520960, 28.612049, 25.793060, -2.173260, -17.753000, -7.311670, 5.735980, 6.719840, -5.433370,
-3.592840,
6.315320, 10.625830, -29.417950, -3.509090, -7.475300, 9.539540, -0.274550,
3.947710, -3.641910, 17.852579, 4.323410, 22.979490, 6.813470, -7.080890, -10.572310, 2.969300, 8.182690,
-7.683220, -2.815800, 24.532431, 2.493870, -4.299080, -11.607320, -17.397141,
-0.140040, -0.499880, -1.413580, -0.410250, 0.136820, -1.213430, -0.419550, -0.058770, -0.796160,
-1.381960,
-0.019040, 0.493110, -0.685200, -0.787300, -0.340630, -0.403260, 0.073780,
-10.479780, -3.075770, -0.412490, -1.923050, 11.304590, -3.781010, -3.455410, -3.088600, 2.473300,
-1.776250,
-3.208870, 0.195500, -6.068210, -0.078550, 2.594690, -5.294650, 10.092630,
-4.179970, 2.853000, -2.296600, -1.148260, 5.360080, -3.355930, -1.680750, -4.251740, 1.238880, 0.566210,
-2.052700, -0.711940, 5.024230, -2.299190, 0.071920, 1.587590, 0.553900,
-17.317070, 11.936430, -23.947350, 9.195400, -31.321390, -3.082180, -3.914230, -2.537760,
0.068190, 9.970860,
-7.537340, -3.353370, 26.727270, 3.585490, 4.070420, -1.535530, 26.721479,
5.626100, -18.650560, -28.874969, -2.956700, 3.562850, 3.802390, 2.693810, -11.241080, 13.761910,
-13.652430,
-9.792960, 2.345680, -31.432980, -2.139670, -3.130600, 24.893869, -26.590019,
};
/* unit definition section (see also UnitType) */
static UnitType Units[29] =
{
{ 0.0, 0.0, 0, NULL , NULL },
{ /* unit 1 (sEsq) */
0.0, -0.997500, 0,
&Sources[0] ,
&Weights[0] ,
},
{ /* unit 2 (sCnt) */
0.0, 0.127170, 0,
&Sources[0] ,
&Weights[0] ,
},
{ /* unit 3 (sDir) */
0.0, -0.613390, 0,
&Sources[0] ,
&Weights[0] ,
},
{ /* unit 4 (oculto) */
0.0, 24.020309, 3,
&Sources[0] ,
&Weights[0] ,
},
{ /* unit 5 (oculto) */
0.0, -2.205380, 3,
&Sources[3] ,
&Weights[3] ,
},
{ /* unit 6 (oculto) */
0.0, -1.550680, 3,
&Sources[6] ,
&Weights[6] ,
},
{ /* unit 7 (oculto) */
0.0, 7.870630, 3,
&Sources[9] ,
&Weights[9] ,
170
},
{ /* unit 8 (oculto) */
0.0, -47.650021, 3,
&Sources[12] ,
&Weights[12] ,
},
{ /* unit 9 (oculto) */
0.0, -1.673870, 3,
&Sources[15] ,
&Weights[15] ,
},
{ /* unit 10 (oculto) */
0.0, 21.430500, 3,
&Sources[18] ,
&Weights[18] ,
},
{ /* unit 11 (oculto) */
0.0, 4.945720, 3,
&Sources[21] ,
&Weights[21] ,
},
{ /* unit 12 (oculto) */
0.0, -12.529290, 3,
&Sources[24] ,
&Weights[24] ,
},
{ /* unit 13 (oculto) */
0.0, -19.608810, 3,
&Sources[27] ,
&Weights[27] ,
},
{ /* unit 14 (oculto) */
0.0, 0.073180, 3,
&Sources[30] ,
&Weights[30] ,
},
{ /* unit 15 (oculto) */
0.0, 2.608470, 3,
&Sources[33] ,
&Weights[33] ,
},
{ /* unit 16 (oculto) */
0.0, -64.471123, 3,
&Sources[36] ,
&Weights[36] ,
},
{ /* unit 17 (oculto) */
0.0, -3.606060, 3,
&Sources[39] ,
&Weights[39] ,
},
{ /* unit 18 (oculto) */
0.0, 0.695030, 3,
&Sources[42] ,
&Weights[42] ,
},
{ /* unit 19 (oculto) */
0.0, 0.311930, 3,
&Sources[45] ,
&Weights[45] ,
},
{ /* unit 20 (oculto) */
0.0, -58.485451, 3,
&Sources[48] ,
&Weights[48] ,
},
{ /* unit 21 (grau0) */
0.0, -0.645410, 17,
&Sources[51] ,
&Weights[51] ,
},
{ /* unit 22 (grau30) */
0.0, -19.726070, 17,
&Sources[68] ,
&Weights[68] ,
},
{ /* unit 23 (grau90) */
0.0, -22.198441, 17,
&Sources[85] ,
&Weights[85] ,
},
{ /* unit 24 (grau120) */
0.0, -0.659430, 17,
&Sources[102] ,
&Weights[102] ,
171
},
{ /* unit 25 (grau180)
0.0, -5.328110, 17,
&Sources[119] ,
&Weights[119] ,
},
{ /* unit 26 (grau220)
0.0, -5.299750, 17,
&Sources[136] ,
&Weights[136] ,
},
{ /* unit 27 (grau270)
0.0, -1.491560, 17,
&Sources[153] ,
&Weights[153] ,
},
{ /* unit 28 (grau330)
0.0, -3.975220, 17,
&Sources[170] ,
&Weights[170] ,
}
*/
*/
*/
*/
};
float separa( char strent[], char separador, int pos ) {
long inicial, localseparador, achouseparador, acumulador, divisor, contador, achouponto;
float resultado;
inicial = 0;
achouseparador = pos;
acumulador = 0;
divisor = 1;
achouponto = 0;
for( localseparador = 0; achouseparador; localseparador++)
if( ( strent[ localseparador ] == separador ) | ( strent[ localseparador] == 0 ) )
{
achouseparador--;
if( achouseparador > 0) inicial = localseparador + 1;
}
for( contador = inicial; contador < localseparador - 1; contador++)
{
if( strent[ contador] == '.') {
achouponto = 1;
} else {
if( achouponto ) divisor *= 10;
}
acumulador = acumulador * 10 + strent[ contador] - '0';
}
resultado = ((float) acumulador) / ((float) divisor);
return (resultado);
}
int main()
{
int i;
FILE *arqe, *arqs;
float ent[4];
float sai[9];
char buf[250];
if( !(arqe = fopen( "C:\\SNNSv4.2\\bin\\entrada.txt", "r" )) ){
printf( "arq n pode ser aberto!\n" );
system("PAUSE");
exit(1);
}
arqs = fopen( "C:\\SNNSv4.2\\bin\\saida.txt", "w" );
while( fgets(buf, 250, arqe)!=NULL ) {
ent[0] = separa( buf, ' ', 1 );
ent[1] = separa( buf, ' ', 2 );
ent[2] = separa( buf, ' ', 3 );
RNA( ent,sai, 0 );
}
for( i = 0; i < 8; i++ ) {
fprintf( arqs, "%2.0f", sai[i] );
}
fprintf( arqs, "\n" );
printf( "\n\n" );
172
system("PAUSE");
}
return(0);
float separa2( char strent[], char separador, int pos ) {
}
int RNA(float *in, float *out, int init)
{
int member, source;
float sum;
enum{OK, Error, Not_Valid};
pUnit unit;
/* layer definition section (names & member units) */
static pUnit Input[3] = {Units + 1, Units + 2, Units + 3}; /* members */
static pUnit Hidden1[17] = {Units + 4, Units + 5, Units + 6, Units + 7, Units + 8, Units + 9,
Units + 10, Units + 11, Units + 12, Units + 13, Units + 14, Units + 15, Units + 16, Units + 17,
Units + 18, Units + 19, Units + 20}; /* members */
static pUnit Output1[8] = {Units + 21, Units + 22, Units + 23, Units + 24, Units + 25, Units +
26, Units + 27, Units + 28}; /* members */
static int Output[8] = {21, 22, 23, 24, 25, 26, 27, 28};
for(member = 0; member < 3; member++) {
Input[member]->act = in[member];
}
for (member = 0; member < 17; member++) {
unit = Hidden1[member];
sum = 0.0;
for (source = 0; source < unit->NoOfSources; source++) {
sum += unit->sources[source]->act
* unit->weights[source];
}
unit->act = Act_Logistic(sum, unit->Bias);
};
for (member = 0; member < 8; member++) {
unit = Output1[member];
sum = 0.0;
for (source = 0; source < unit->NoOfSources; source++) {
sum += unit->sources[source]->act
* unit->weights[source];
}
unit->act = Act_Logistic(sum, unit->Bias);
};
for(member = 0; member < 8; member++) {
out[member] = Units[Output[member]].act;
}
}
return(OK);
173
K PLANILHA COM OS PADRÕES DE ENTRADA E SAÍDA
A seguir é apresentada a planilha contendo os padrões de entrada apresentados ao aplicativo
validador contruído para utilizar a RNA GSC200901-B, os padrões de saída gerados pela rede e a
especificação se a saída está correta ou incorreta.
Direções
Graus
Resultado
Esquerdo
Central Direito 000 030 090 120 180 240 270 330
0.6
0.02
0.63
1
0
0
0
0
0
0
0
Correto
0.89
0.26
0.33
1
0
0
0
0
0
0
0
Correto
0.75
0.09
0.48
1
0
0
0
0
0
0
0
Correto
0.21
0.5
0.86
0
0
0
0
0
0
0
1
Correto
0.24
0.61
0.77
0
0
0
0
0
0
0
1
Correto
0.56
0.96
0.51
0
0
1
0
0
0
0
0
Correto
0.37
0.75
0.26
0
1
0
0
0
0
0
0
Correto
0.67
0.39
0.74
1
0
0
0
0
0
0
0
Correto
0.04
0.92
0.03
0
0
0
0
0
0
0
0
Não Reconhecido
0.31
0.6
0.26
0
1
0
0
0
0
0
0
Correto
0.73
0.44
0.84
1
0
0
0
0
0
0
0
Correto
0.24
0.09
0.77
1
0
0
0
0
0
0
0
Correto
0.34
0.45
0.28
0
1
0
0
0
0
0
0
Correto
0.49
0.33
0.84
1
0
0
0
0
0
0
0
Correto
0.56
0.7
0.4
0
1
0
0
0
0
0
0
Correto
1
0.99
0.84
0
0
1
0
0
1
0
0
Errado - Duas Direções - Certo e Errado
0.26
0.95
0.59
0
0
0
0
0
0
1
0
Correto
0.84
0.31
0.56
1
0
0
0
0
0
0
0
Correto
0.32
0.79
0.55
0
0
0
0
0
0
0
1
Correto
0.11
0.01
0.98
0
0
0
0
0
0
1
0
Correto
0.07
0.36
0.12
0
0
0
0
0
0
0
1
Correto
0.92
0.54
0.5
0
0
1
0
0
0
0
0
Correto
0.66
0.43
0.57
1
0
0
0
0
0
0
0
Correto
0.34
0.13
0.26
1
0
0
0
0
0
0
0
Correto
0.9
0.77
0.77
0
1
0
0
0
0
0
0
Errado - Direção Errada
0.17
0.22
0.3
0
0
0
0
0
0
0
1
Correto
0.68
0.74
0.59
0
1
0
0
0
0
0
0
Correto
0.93
0.9
0.81
0
1
1
0
0
0
0
0
Errado - Duas Direções - Angulo Menor
0.67
0.67
0.02
0
1
0
0
0
0
0
0
Correto
0.17
0.35
0.41
0
0
0
0
0
0
0
1
Correto
0.49
0.72
0.04
0
1
0
0
0
0
0
0
Correto
0.9
0.06
0.55
1
0
0
0
0
0
0
0
Correto
0.79
0.8
0.35
0
1
0
0
0
0
0
0
Correto
0.51
0.88
0.09
0
1
0
0
0
0
0
0
Correto
0.19
0.41
0.15
0
1
0
0
0
0
0
0
Correto
0.51
0.56
0.51
0
0
0
0
0
0
0
0
Não Reconhecido
0.85
0.55
0.01
0
1
0
0
0
0
0
0
Correto
0.41
0.94
0.38
0
0
1
0
0
0
0
0
Correto
0.46
0.11
0.47
1
0
0
0
0
0
0
0
Correto
0.45
0.04
0.65
1
0
0
0
0
0
0
0
Correto
0.03
0.44
0.61
0
0
0
0
0
0
0
1
Correto
174
0.85
0.91
0.21
0
0
1
0
0
0
0
0
Correto
0.62
0.21
0.2
1
1
0
0
0
0
0
0
Errado - Duas Direções - Certo e Errado
0.22
0.66
0.6
0
0
0
0
0
0
0
1
Correto
0.69
0.83
0.12
0
1
0
0
0
0
0
0
Correto
0.72
0.32
0.79
1
0
0
0
0
0
0
0
Correto
0.52
0.48
0.55
1
0
0
0
0
0
0
0
Correto
0.83
0.1
0.07
0
1
0
0
0
0
0
0
Correto
0.09
0.33
0.84
0
0
0
0
0
0
0
1
Correto
0.25
0.54
0.28
0
0
0
0
0
0
0
1
Correto
0.46
0.56
0.01
0
1
0
0
0
0
0
0
Correto
0.07
0.49
0.49
0
0
0
0
0
0
0
1
Correto
0.97
0.51
0.44
0
0
1
0
0
0
0
0
Correto
0.81
0.29
0.21
0
1
0
0
0
0
0
0
Correto
0.65
0.55
0.35
0
1
0
0
0
0
0
0
Correto
0.59
0.21
0.66
1
0
0
0
0
0
0
0
Correto
0.53
0.9
0.58
0
0
0
0
0
0
0
1
Correto
0.89
0.71
0.76
1
0
0
0
0
0
0
0
Correto
0.58
0.81
0.24
0
1
0
0
0
0
0
0
Correto
0.8
0.29
0.4
1
0
0
0
0
0
0
0
Correto
0.26
0.23
0.4
1
0
0
0
0
0
0
0
Correto
0.69
0.02
0.35
1
0
0
0
0
0
0
0
Correto
0.85
0.04
0.98
0
0
0
0
0
0
1
0
Correto
0.57
0.07
0.71
1
0
0
0
0
0
0
0
Correto
0.15
0.91
0.05
0
1
1
0
0
0
0
0
Errado - Duas Direções - Ângulo Menor
0.21
0.93
0.69
0
0
0
0
0
0
1
0
Correto
0.71
0.51
0.41
0
1
0
0
0
0
0
0
Correto
0.22
0.46
0.21
0
1
0
0
0
0
0
0
Correto
0.82
0.55
0.68
1
0
0
0
0
0
0
0
Correto
0.37
0.65
0.02
0
1
0
0
0
0
0
0
Correto
0.71
0.47
0.02
0
1
0
0
0
0
0
0
Correto
0.42
0.29
0.72
1
0
0
0
0
0
0
0
Correto
0.71
0.61
0.8
1
0
0
0
0
0
0
0
Correto
0.22
0.65
0.39
0
0
0
0
0
0
0
1
Correto
0.31
0.06
0.85
1
0
0
0
0
0
0
0
Correto
0.48
0.36
0.85
1
0
0
0
0
0
0
0
Correto
0.41
0.05
0.84
1
0
0
0
0
0
0
0
Correto
0.41
0.79
0.39
0
1
0
0
0
0
0
0
Correto
0.42
0.1
0.05
0
1
0
0
0
0
0
0
Correto
0.21
0.39
0.05
0
1
0
0
0
0
0
0
Correto
0.54
0.18
0.5
1
0
0
0
0
0
0
0
Correto
0.7
0.22
0.66
1
0
0
0
0
0
0
0
Correto
0.1
0.56
0.23
0
0
0
0
0
0
0
1
Correto
0.04
0.42
0.2
0
0
0
0
0
0
0
1
Correto
0.14
0.04
0.67
1
0
0
0
0
0
0
0
Correto
0.05
0.93
0.22
0
0
0
0
0
0
1
0
Correto
0.42
0
0.21
1
0
0
0
0
0
0
0
Correto
0.6
0.14
0.26
1
0
0
0
0
0
0
0
Correto
0.34
0.16
0.93
0
0
0
0
0
0
1
0
Correto
0.72
0.39
0.38
1
1
0
0
0
0
0
0
Errado - Duas Direções - Certo e Errado
0.66
0.37
0.01
0
1
0
0
0
0
0
0
Correto
0.1
0.25
0.14
0
0
0
0
0
0
0
1
Correto
175
0.71
1
0.02
0
0
1
0
0
0
0
0
Correto
0.72
0.55
0.29
0
1
0
0
0
0
0
0
Correto
0.41
0.93
0.69
0
0
0
0
0
0
1
0
Correto
0.74
0.2
0.31
1
0
0
0
0
0
0
0
Correto
0.89
0.36
0.5
1
0
0
0
0
0
0
0
Correto
0.18
0.71
0.51
0
0
0
0
0
0
0
1
Correto
0.51
0.83
0.52
0
0
0
0
0
0
0
1
Correto
0.47
0.14
0.74
1
0
0
0
0
0
0
0
Correto
0.46
0.25
0.51
1
0
0
0
0
0
0
0
Correto
0.61
0.88
0.61
0
0
0
0
0
0
0
0
Não Reconhecido
0.28
0.45
0.49
0
0
0
0
0
0
0
1
Correto
0.59
0.39
0.24
0
1
0
0
0
0
0
0
Correto
0.65
0.25
0.58
1
0
0
0
0
0
0
0
Correto
0.29
0.22
0.3
1
0
0
0
0
0
0
0
Correto
0.88
0.09
0.84
1
0
0
0
0
0
0
0
Correto
0.69
0.66
0.33
0
1
0
0
0
0
0
0
Correto
0.89
0.97
0.02
0
0
1
0
0
0
0
0
Correto
0.43
0.77
0.25
0
1
0
0
0
0
0
0
Correto
0.53
0.16
0.41
1
0
0
0
0
0
0
0
Correto
0.98
0.61
0.45
0
0
1
0
0
0
0
0
Correto
0.85
0.62
0.66
1
0
0
0
0
0
0
0
Correto
0.35
0.27
0.76
1
0
0
0
0
0
0
0
Correto
0.43
0.91
0.19
0
0
1
0
0
0
0
0
Correto
0.78
0.15
0.27
1
0
0
0
0
0
0
0
Correto
0.1
0.91
0.05
0
1
1
0
0
0
0
0
Errado - Duas Direções - Angulo Menor
0.76
0.23
0.82
1
0
0
0
0
0
0
0
Correto
0.25
0.34
0.73
0
0
0
0
0
0
0
1
Correto
0.58
0.39
0.18
0
1
0
0
0
0
0
0
Correto
0.51
0.83
0.2
0
1
0
0
0
0
0
0
Correto
0.03
0.12
0.81
0
0
0
0
0
0
0
1
Correto
0.62
0.29
0.93
0
0
0
0
0
0
1
0
Correto
0.36
0.64
0.21
0
1
0
0
0
0
0
0
Correto
0.46
0.43
0.37
0
1
0
0
0
0
0
0
Correto
0.62
0.15
0.6
1
0
0
0
0
0
0
0
Correto
0.82
0.69
0.57
0
1
0
0
0
0
0
0
Correto
0.61
0.36
0.72
1
0
0
0
0
0
0
0
Correto
0.58
0.71
0.07
0
1
0
0
0
0
0
0
Correto
0.6
0.8
0.7
0
0
0
0
0
0
0
1
Correto
0.64
0.6
0.53
0
1
0
0
0
0
0
0
Correto
0.39
0.19
0.57
1
0
0
0
0
0
0
0
Correto
0.89
0.58
0.04
0
1
0
0
0
0
0
0
Correto
0.54
0.58
0.73
0
0
0
0
0
0
0
1
Correto
0.58
0.49
0.1
0
1
0
0
0
0
0
0
Correto
0.13
0.35
0.64
0
0
0
0
0
0
0
1
Correto
0.02
0.18
0.06
0
1
0
0
0
0
0
1
Errado - Duas Direções Opostas
0.94
0.31
0.56
0
0
1
0
0
0
0
0
Correto
0.76
0.26
0.74
1
0
0
0
0
0
0
0
Correto
0.97
0.75
0.58
0
0
1
0
0
0
0
0
Correto
0.12
0.38
0.47
0
0
0
0
0
0
0
1
Correto
0.08
0.03
0.69
1
0
0
0
0
0
0
0
Correto
0.85
0.4
0.27
0
1
0
0
0
0
0
0
Correto
176
0.2
0.3
0.58
0
0
0
0
0
0
0
1
Correto
0.18
0.6
0.51
0
0
0
0
0
0
0
1
Correto
0.64
0.94
0.81
0
0
0
0
0
0
1
0
Correto
0.03
0.99
0.15
0
0
0
0
0
0
1
0
Correto
0.07
0.34
0.76
0
0
0
0
0
0
0
1
Correto
0.12
0.41
0.64
0
0
0
0
0
0
0
1
Correto
0.96
0.18
0.7
0
0
1
0
0
0
0
0
Correto
0.31
0.16
0.34
1
0
0
0
0
0
0
0
Correto
0.88
0.22
0.48
1
0
0
0
0
0
0
0
Correto
0.56
0.59
0.92
0
0
0
0
0
0
1
0
Correto
0.29
0.81
0.3
0
1
0
0
0
0
0
1
Errado - Duas Direções Opostas
0.43
0.77
0.88
0
0
0
0
0
0
0
1
Correto
0.49
0.36
0.52
1
0
0
0
0
0
0
0
Correto
0.64
0.65
0.94
0
0
0
0
0
0
1
0
Correto
0.22
0.07
0.67
1
0
0
0
0
0
0
0
Correto
0.7
0.09
0.87
1
0
0
0
0
0
0
0
Correto
0.04
0.54
0.56
0
0
0
0
0
0
0
1
Correto
0.84
0.09
0.2
1
0
0
0
0
0
0
0
Correto
0.29
0.96
0.69
0
0
0
0
0
0
1
0
Correto
0.42
0.6
0.06
0
1
0
0
0
0
0
0
Correto
0.22
0.22
0.05
0
1
0
0
0
0
0
0
Correto
0.91
0.73
0.02
0
1
0
0
0
0
0
0
Errado - Angulo Menor
0.72
0.06
0.82
1
0
0
0
0
0
0
0
Correto
0.68
0.75
0.04
0
1
0
0
0
0
0
0
Correto
0.5
0.55
0.5
0
0
0
0
0
0
0
0
Não Reconhecido
0.12
0.91
0.1
0
0
1
0
0
0
0
0
Correto
0.19
0.44
0.2
0
0
0
0
0
0
0
1
Correto
0.08
0.72
0.71
0
0
0
0
0
0
0
1
Correto
0.29
0.55
0.4
0
0
0
0
0
0
0
1
Correto
0.24
0.29
0.41
0
0
0
0
0
0
0
1
Correto
0.03
0.31
0.47
0
0
0
0
0
0
0
1
Correto
0.79
0.8
0.9
1
0
0
0
0
0
0
0
Correto
0.14
0.06
0.37
1
0
0
0
0
0
0
0
Correto
0.25
0.75
0.19
0
1
0
0
0
0
0
0
Correto
0.62
0.14
0.32
1
0
0
0
0
0
0
0
Correto
0.88
0.22
0.31
1
0
0
0
0
0
0
0
Correto
0.73
0.96
0.1
0
0
1
0
0
0
0
0
Correto
0.28
0.42
0.93
0
0
0
0
0
0
1
0
Correto
0.56
0.15
0.18
1
0
0
0
0
0
0
0
Correto
0.25
0.18
0.64
1
0
0
0
0
0
0
0
Correto
0.05
0.87
0.34
0
0
0
0
0
0
0
1
Correto
0.44
0.19
0.73
1
0
0
0
0
0
0
0
Correto
0.11
0.9
0.41
0
0
0
0
0
0
0
1
Correto
0.85
0.41
0.97
0
0
0
0
0
0
1
0
Correto
0.95
0.36
0.3
0
0
1
0
0
0
0
0
Correto
0.01
0.22
0.3
0
0
0
0
0
0
0
1
Correto
0.06
0.08
0.57
0
0
0
0
0
0
0
1
Correto
0.33
0.4
0.33
0
0
0
0
0
0
0
0
Não Reconhecido
0.04
0.02
0.28
1
0
0
0
0
0
0
0
Correto
0.94
0.55
0.32
0
0
1
0
0
0
0
0
Correto
0.87
0.91
0.49
0
0
1
0
0
0
0
0
Correto
177
0.91
0.02
0.59
1
0
0
0
0
0
0
0
Errado - Direção Errada
0.1
0.47
0.46
0
0
0
0
0
0
0
1
Correto
0.78
0.87
0.19
0
1
0
0
0
0
0
0
Correto
0.45
0.09
0.36
1
0
0
0
0
0
0
0
Correto
0.79
0.32
0.87
1
0
0
0
0
0
0
0
Correto
0.17
0.48
0.87
0
0
0
0
0
0
0
1
Correto
178
L CÓDIGO FONTE DO ARQUIVO PDRNA.DLL
#include "D:\Meus Documentos\Softwares\Dev-C++\PDRNA\PDRNA.h"
#include <windows.h>
#include <math.h>
#include <stdio.h>
#define Act_Logistic(sum, bias)
( (sum+bias<10000.0) ? ( 1.0/(1.0 + exp(-sum-bias) ) ) :
0.0 )
#define Act_Identity(sum, bias)
( sum )
#ifndef NULL
#define NULL (void *)0
#endif
typedef struct UT {
float act;
/* Activation
float Bias;
/* Bias of the Unit */
int
struct UT
*/
NoOfSources; /* Number of predecessor units */
**sources; /* predecessor units */
float *weights; /* weights from predecessor units */
} UnitType, *pUnit;
/* Forward Declaration for all unit types */
static UnitType Units[29];
/* Sources definition section */
static pUnit Sources[] =
{
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
179
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 1, Units + 2, Units + 3,
Units + 4, Units + 5, Units + 6, Units + 7, Units + 8, Units + 9, Units + 10, Units + 11,
Units + 12, Units + 13,
Units + 14, Units + 15, Units + 16, Units + 17, Units + 18, Units + 19, Units + 20,
Units + 4, Units + 5, Units + 6, Units + 7, Units + 8, Units + 9, Units + 10, Units + 11,
Units + 12, Units + 13,
Units + 14, Units + 15, Units + 16, Units + 17, Units + 18, Units + 19, Units + 20,
Units + 4, Units + 5, Units + 6, Units + 7, Units + 8, Units + 9, Units + 10, Units + 11,
Units + 12, Units + 13,
Units + 14, Units + 15, Units + 16, Units + 17, Units + 18, Units + 19, Units + 20,
Units + 4, Units + 5, Units + 6, Units + 7, Units + 8, Units + 9, Units + 10, Units + 11,
Units + 12, Units + 13,
Units + 14, Units + 15, Units + 16, Units + 17, Units + 18, Units + 19, Units + 20,
Units + 4, Units + 5, Units + 6, Units + 7, Units + 8, Units + 9, Units + 10, Units + 11,
Units + 12, Units + 13,
Units + 14, Units + 15, Units + 16, Units + 17, Units + 18, Units + 19, Units + 20,
Units + 4, Units + 5, Units + 6, Units + 7, Units + 8, Units + 9, Units + 10, Units + 11,
180
Units + 12, Units + 13,
Units + 14, Units + 15, Units + 16, Units + 17, Units + 18, Units + 19, Units + 20,
Units + 4, Units + 5, Units + 6, Units + 7, Units + 8, Units + 9, Units + 10, Units + 11,
Units + 12, Units + 13,
Units + 14, Units + 15, Units + 16, Units + 17, Units + 18, Units + 19, Units + 20,
Units + 4, Units + 5, Units + 6, Units + 7, Units + 8, Units + 9, Units + 10, Units + 11,
Units + 12, Units + 13,
Units + 14, Units + 15, Units + 16, Units + 17, Units + 18, Units + 19, Units + 20,
};
/* Weigths definition section */
static float Weights[] =
{
-2.697980, -3.151080, -25.210899,
3.968060, 31.241920, -33.122879,
62.066269, 2.647630, -63.468349,
-7.463170, -5.524840, -3.441340,
53.176048, -1.333430, -0.141320,
-0.103780, 0.076290, 23.691320,
-15.254840, -12.395110, -8.643120,
22.911280, -19.931400, -12.234780,
25.058550, -0.458840, -8.305130,
-3.137810, 2.215350, 21.342840,
4.059160, -25.332050, 25.506620,
-13.218460, -2.055080, -5.721960,
0.191940, 72.142807, -2.894430,
-15.410860, -7.675940, 20.334330,
4.301910, -15.817540, -5.751450,
-35.093800, 36.284241, -1.786390,
181
1.176160, -1.482980, 64.152657,
-7.296000, -30.247690,
5.887150, 11.611230,
-5.254930,
0.359240,
-31.029051,
7.411190,
9.146040,
2.362280,
8.629180, 2.876830, 0.324670, -10.894670, 3.835130, -22.185930, -27.557030,
-24.520960, 28.612049, 25.793060, -2.173260, -17.753000, -7.311670, 5.735980, 6.719840, 5.433370, -3.592840,
6.315320, 10.625830, -29.417950, -3.509090, -7.475300, 9.539540, -0.274550,
3.947710, -3.641910,
2.969300, -8.182690,
17.852579,
4.323410,
22.979490,
6.813470,
-7.080890,
-10.572310,
-7.683220, -2.815800, 24.532431, 2.493870, -4.299080, -11.607320, -17.397141,
-0.140040, -0.499880, -1.413580, -0.410250, 0.136820, -1.213430, -0.419550, -0.058770, 0.796160, -1.381960,
-0.019040, 0.493110, -0.685200, -0.787300, -0.340630, -0.403260, 0.073780,
-10.479780, -3.075770, -0.412490, -1.923050, 11.304590, -3.781010, -3.455410, -3.088600,
2.473300, -1.776250,
-3.208870, 0.195500, -6.068210, -0.078550, 2.594690, -5.294650, 10.092630,
-4.179970, 2.853000,
1.238880, -0.566210,
-2.296600,
-1.148260,
5.360080,
-3.355930,
-1.680750,
-4.251740,
-2.052700, -0.711940, 5.024230, -2.299190, 0.071920, 1.587590, 0.553900,
-17.317070, 11.936430, -23.947350, 9.195400, -31.321390, -3.082180, -3.914230, -2.537760,
0.068190, 9.970860,
-7.537340, -3.353370, 26.727270, 3.585490, 4.070420, -1.535530, 26.721479,
5.626100, -18.650560,
13.761910, -13.652430,
-28.874969,
-2.956700,
3.562850,
3.802390,
2.693810,
-9.792960, 2.345680, -31.432980, -2.139670, -3.130600, 24.893869, -26.590019,
};
/* unit definition section (see also UnitType) */
static UnitType Units[29] =
{
{ 0.0, 0.0, 0, NULL , NULL },
182
-11.241080,
{ /* unit 1 (sEsq) */
0.0, -0.997500, 0,
&Sources[0] ,
&Weights[0] ,
},
{ /* unit 2 (sCnt) */
0.0, 0.127170, 0,
&Sources[0] ,
&Weights[0] ,
},
{ /* unit 3 (sDir) */
0.0, -0.613390, 0,
&Sources[0] ,
&Weights[0] ,
},
{ /* unit 4 (oculto) */
0.0, 24.020309, 3,
&Sources[0] ,
&Weights[0] ,
},
{ /* unit 5 (oculto) */
0.0, -2.205380, 3,
&Sources[3] ,
&Weights[3] ,
},
{ /* unit 6 (oculto) */
0.0, -1.550680, 3,
&Sources[6] ,
183
&Weights[6] ,
},
{ /* unit 7 (oculto) */
0.0, 7.870630, 3,
&Sources[9] ,
&Weights[9] ,
},
{ /* unit 8 (oculto) */
0.0, -47.650021, 3,
&Sources[12] ,
&Weights[12] ,
},
{ /* unit 9 (oculto) */
0.0, -1.673870, 3,
&Sources[15] ,
&Weights[15] ,
},
{ /* unit 10 (oculto) */
0.0, 21.430500, 3,
&Sources[18] ,
&Weights[18] ,
},
{ /* unit 11 (oculto) */
0.0, 4.945720, 3,
&Sources[21] ,
&Weights[21] ,
},
{ /* unit 12 (oculto) */
184
0.0, -12.529290, 3,
&Sources[24] ,
&Weights[24] ,
},
{ /* unit 13 (oculto) */
0.0, -19.608810, 3,
&Sources[27] ,
&Weights[27] ,
},
{ /* unit 14 (oculto) */
0.0, 0.073180, 3,
&Sources[30] ,
&Weights[30] ,
},
{ /* unit 15 (oculto) */
0.0, 2.608470, 3,
&Sources[33] ,
&Weights[33] ,
},
{ /* unit 16 (oculto) */
0.0, -64.471123, 3,
&Sources[36] ,
&Weights[36] ,
},
{ /* unit 17 (oculto) */
0.0, -3.606060, 3,
&Sources[39] ,
&Weights[39] ,
185
},
{ /* unit 18 (oculto) */
0.0, 0.695030, 3,
&Sources[42] ,
&Weights[42] ,
},
{ /* unit 19 (oculto) */
0.0, 0.311930, 3,
&Sources[45] ,
&Weights[45] ,
},
{ /* unit 20 (oculto) */
0.0, -58.485451, 3,
&Sources[48] ,
&Weights[48] ,
},
{ /* unit 21 (grau0) */
0.0, -0.645410, 17,
&Sources[51] ,
&Weights[51] ,
},
{ /* unit 22 (grau30) */
0.0, -19.726070, 17,
&Sources[68] ,
&Weights[68] ,
},
{ /* unit 23 (grau90) */
0.0, -22.198441, 17,
186
&Sources[85] ,
&Weights[85] ,
},
{ /* unit 24 (grau120) */
0.0, -0.659430, 17,
&Sources[102] ,
&Weights[102] ,
},
{ /* unit 25 (grau180) */
0.0, -5.328110, 17,
&Sources[119] ,
&Weights[119] ,
},
{ /* unit 26 (grau220) */
0.0, -5.299750, 17,
&Sources[136] ,
&Weights[136] ,
},
{ /* unit 27 (grau270) */
0.0, -1.491560, 17,
&Sources[153] ,
&Weights[153] ,
},
{ /* unit 28 (grau330) */
0.0, -3.975220, 17,
&Sources[170] ,
&Weights[170] ,
}
187
};
//--------------------------------------------------------------------------// Rede Neural Artificial (Essa função pode ser acessada externamente por uma aplicação).
//---------------------------------------------------------------------------
__declspec(dllexport) int rede(float *in, float *out, int init)
{
int member, source;
float sum;
enum{OK, Error, Not_Valid};
pUnit unit;
/* layer definition section (names & member units) */
static pUnit Input[3] = {Units + 1, Units + 2, Units + 3}; /* members */
static pUnit Hidden1[17] = {Units + 4, Units + 5, Units + 6, Units + 7, Units + 8, Units
+ 9, Units + 10, Units + 11, Units + 12, Units + 13, Units + 14, Units + 15, Units + 16, Units +
17, Units + 18, Units + 19, Units + 20}; /* members */
static pUnit Output1[8] = {Units + 21, Units + 22, Units + 23, Units + 24, Units + 25,
Units + 26, Units + 27, Units + 28}; /* members */
static int Output[8] = {21, 22, 23, 24, 25, 26, 27, 28};
for(member = 0; member < 3; member++) {
Input[member]->act = in[member];
}
188
for (member = 0; member < 17; member++) {
unit = Hidden1[member];
sum = 0.0;
for (source = 0; source < unit->NoOfSources; source++) {
sum += unit->sources[source]->act
* unit->weights[source];
}
unit->act = Act_Logistic(sum, unit->Bias);
};
for (member = 0; member < 8; member++) {
unit = Output1[member];
sum = 0.0;
for (source = 0; source < unit->NoOfSources; source++) {
sum += unit->sources[source]->act
* unit->weights[source];
}
unit->act = Act_Logistic(sum, unit->Bias);
};
for(member = 0; member < 8; member++) {
out[member] = Units[Output[member]].act;
}
return(OK);
}
189
M CÓDIGO FONTE DO MUNDO MARLOSOBSTACULO
public MarlosObstaculo() {
/** Paredes Externas. */
Wall w1 = new Wall(new Vector3d(9, 0, 0), 18, 2, this);
w1.rotate90(1);
add(w1);
Wall w2 = new Wall(new Vector3d(-9, 0, 0), 18, 2, this);
w2.rotate90(1);
add(w2);
Wall w3 = new Wall(new Vector3d(0, 0, 9), 18, 2, this);
add(w3);
Wall w4 = new Wall(new Vector3d(0, 0, -9), 18, 2, this);
add(w4);
/** Obstáculos */
add(new Box(new Vector3d(2,0,2),new Vector3f(2,1,2),this));
add(new Box(new Vector3d(-2,0,-2),new Vector3f(3,1,2),this));
add(new Box(new Vector3d(6,0,6),new Vector3f(2,1,3),this));
add(new Box(new Vector3d(-6,0,-6),new Vector3f(3,1,2),this));
add(new Box(new Vector3d(3,0,6),new Vector3f(2,1,3),this));
add(new Box(new Vector3d(-2,0,6),new Vector3f(3,1,2),this));
add(new Box(new Vector3d(2,0,-6),new Vector3f(2,1,2),this));
add(new Box(new Vector3d(-2,0,-6),new Vector3f(3,1,2),this));
add(new Box(new Vector3d(4,0,-2),new Vector3f(3,1,2),this));
add(new Box(new Vector3d(6,0,-6),new Vector3f(3,1,2),this));
add(new Box(new Vector3d(-6,0,2),new Vector3f(2,1,11),this));
/** Robô */
add(new Robot(new Vector3d(5, 0, -8.2), "RNAn1"));
}
190
N CÓDIGO FONTE DO MUNDO MARLOSLABERINTO
public MarlosLaberinto() {
/** Paredes Externas. */
Wall w1 = new Wall(new Vector3d(9, 0, 0), 18, 2, this);
w1.rotate90(1);
add(w1);
Wall w2 = new Wall(new Vector3d(-9, 0, 0), 18, 2, this);
w2.rotate90(1);
add(w2);
Wall w3 = new Wall(new Vector3d(0, 0, 9), 18, 2, this);
add(w3);
Wall w4 = new Wall(new Vector3d(0, 0, -9), 18, 2, this);
add(w4);
/** Paredes Internas. */
Wall w5 = new Wall(new Vector3d(4, 0, 7), 6, 2, this);
add(w5);
Wall w6 = new Wall(new Vector3d(-4, 0, 7), 6, 2, this);
add(w6);
Wall w7 = new Wall(new Vector3d(7, 0, 0), 14, 2, this);
w7.rotate90(1);
add(w7);
Wall w8 = new Wall(new Vector3d(-1, 0, 8), 2, 2, this);
w8.rotate90(1);
add(w8);
Wall w9 = new Wall(new Vector3d(-7, 0, 0), 14, 2, this);
w9.rotate90(1);
add(w9);
Wall w10 = new Wall(new Vector3d(-1, 0, -7), 12, 2, this);
add(w10);
Wall w11 = new Wall(new Vector3d(5, 0, -4), 6, 2, this);
w11.rotate90(1);
add(w11);
Wall w12 = new Wall(new Vector3d(2, 0, 5), 6, 2, this);
add(w12);
Wall w13 = new Wall(new Vector3d(-1, 0, 6), 2, 2, this);
w13.rotate90(1);
add(w13);
Wall w14 = new Wall(new Vector3d(5, 0, 3), 4, 2, this);
w14.rotate90(1);
add(w14);
Wall w15 = new Wall(new Vector3d(-5, 0, 5), 4, 2, this);
add(w15);
Wall w16 = new Wall(new Vector3d(0, 0, 1), 10, 2, this);
add(w16);
Wall w17 = new Wall(new Vector3d(-1, 0, 3), 8, 2, this);
add(w17);
Wall w18 = new Wall(new Vector3d(-5, 0, -1), 8, 2, this);
w18.rotate90(1);
add(w18);
Wall w19 = new Wall(new Vector3d(3, 0, -3), 4, 2, this);
w19.rotate90(1);
add(w19);
Wall w20 = new Wall(new Vector3d(-3, 0, -3), 4, 2, this);
w20.rotate90(1);
191
add(w20);
Wall w21 = new Wall(new
add(w21);
Wall w22 = new Wall(new
add(w22);
Wall w23 = new Wall(new
add(w23);
Wall w24 = new Wall(new
w24.rotate90(1);
add(w24);
Wall w25 = new Wall(new
w25.rotate90(1);
add(w25);
Vector3d(-2, 0, -5), 6, 2, this);
Vector3d(-1, 0, -1), 4, 2, this);
Vector3d(4, 0, -1), 2, 2, this);
Vector3d(1, 0, -4), 2, 2, this);
Vector3d(-1, 0, -2), 2, 2, this);
/** Robô */
add(new Robot(new Vector3d(5, 0, -8.2), "RNAn1"));
}
192
O ALTERAÇÕES PARA ADAPTAR O ROBÔ À RNA
static public RangeSensorBelt addSonarBeltSensor(Agent agent,int nbSonars) {
double agentHeight = agent.getHeight();
double agentRadius = agent.getRadius();
/** Declaração dos Meus Vetores 3D */
Vector3d minhaPosicao1 = new Vector3d(0.29,0,0);
Vector3d minhaDirecao1 = new Vector3d(2.5,0,0);
Vector3d minhaPosicao2 = new Vector3d(0,0,0.29);
Vector3d minhaDirecao2 = new Vector3d(2.5,0,0);
Vector3d minhaPosicao3 = new Vector3d(0,0,-0.29);
Vector3d minhaDirecao3 = new Vector3d(2.5,0,0);
Vector3d pos3d[] = new Vector3d[nbSonars];
Vector3d dir3d[] = new Vector3d[nbSonars];
pos3d[0] = minhaPosicao1;
dir3d[0] = minhaDirecao1;
pos3d[1] = minhaPosicao2;
dir3d[1] = minhaDirecao2;
pos3d[2] = minhaPosicao3;
dir3d[2] = minhaDirecao3;
RangeSensorBelt sonarBelt = new RangeSensorBelt(pos3d, dir3d,
RangeSensorBelt.TYPE_SONAR,0);
sonarBelt.setUpdatePerSecond(6);
sonarBelt.setName("sonars");
Vector3d pos = new Vector3d(0, agentHeight / 2, 0.0);
agent.addSensorDevice(sonarBelt, pos, 0);
return sonarBelt;
}
--------------------------------------//---------------------------------------
/** reads the three front quadrants */
double front = sonars.getMeasurement(0);
double right = sonars.getMeasurement(1);
double left = sonars.getMeasurement(2);
/** Realiza o ajuste de valores para atender os critérios da rede neural */
public void restringeFaixa() {
for (int i = 0; i < 3; i++) {
if (VetorEntrada[i] > 1.00f) {
VetorEntrada[i] = 1.00f;
}
}
}
/** Responsável por realizar a inversão entre 0 e 1 para atender a RNA */
public void inverteExtremos() {
for (int i = 0; i < 3; i++) {
VetorEntrada[i] = (VetorEntrada[i] - 1);
if (VetorEntrada[i] < 0) {
VetorEntrada[i] = (VetorEntrada[i] * (-1));
}
}
}
193
/** Função Responsável por converter os valores de VetorSaida para 0 ou 1 */
public void converteSaida()
{
for (int x = 0; x < 8; x++){
float maior = VetorSaida[x];
for (int y = 0; y < 8; y++){
if (VetorSaida[y] < maior) {
VetorSaida[y] = 0;
}
}
}
for (int i = 0; i < 8; i++){
if (VetorSaida [i] > 0){
VetorSaida[i] = 1;
}
}
}
194
Download

universidade do vale do itajaí centro de ciências