IMPLEMENTAÇÃO DE REDES NEURAIS ARTIFICIAIS UTILIZANDO A LINGUAGEM DE PROGRAMAÇÃO JAVA José R. Campos1, Anna D. P. Lotufo1, Carlos R. Minussi1, Mara L. M. Lopes1 1 UNESP, Ilha Solteira, Brasil, [email protected], [email protected], [email protected], [email protected] Abstract: This work develops a feedforward neural network by backpropagation algorithm emphasizing the JAVA language. To illustrate the proposed methodology is used an example with data from a Multi – Machine Electrical Power System Transient Stability Analysis aiming to provide an efficient diagnosis. complexos que não poderiam ser solucionados com antigas técnicas de programação, neste artigo serão abordados os principais conceitos da OOP como, classes, polimorfismo, encapsulamento, abstração e herança, aplicando-a no sistema neural retropropagação. A linguagem de programação JAVA foi desenvolvida pela Sun Microsystems para automação no desenvolvimento de uma rede neural. A escolha dessa linguagem se deve ao fato dela proporcionar uma extensa redução na complexidade no desenvolvimento de software e aumentar a produtividade. A análise, projeto e programação orientada a objetos são as respostas para o aumento da complexidade dos ambientes computacionais que se caracterizam por sistemas heterogêneos, distribuídos em redes, em camadas e baseados em interfaces gráficas. A OOP fundamenta-se na modelagem e design do código-fonte em unidades funcionais independentes, reduzindo a complexidade do problema e viabilizando o desenvolvimento. Além disso, foram desenvolvidos módulos para os modelos estabelecidos para a simulação/solução do problema real e não de acordo com a lógica de programação de computadores [5]. Portanto, a superioridade dessa metodologia consiste no design do código-fonte abstraindo-se os modelos físicos de acordo com o pensamento humano (classes, hierarquias e polimorfismo). No caso de um software de modelagem de um sistema elétrico, as barras, circuitos, impedâncias mútuas, faltas, etc. podem ser modelados segundo as especificações dos próprios componentes, ao contrário da mera modelagem matemática através de matrizes, que são comuns em softwares legados. A engenharia de software, por sua vez, consiste na gestão das práticas utilizadas no desenvolvimento de um aplicativo: especificações, projetos, controle de qualidade do código-fonte, organização, testes, etc. [5]. Assim, o artigo mostra uma aplicação simples de diagnóstico de dados efetuados para analise de estabilidade de um sistema elétrico de 3 máquinas [6]. Keywords: JAVA, Object Oriented Programming, Artificial Neural Networks. 1. INTRODUÇÃO As Redes Neurais Artificiais (RNA) são concepções em hardware e / ou software que exibem capacidade de aprender com a experiência. Para se conseguir os resultados desejados, ou seja, que a rede apresente condições de efetuar diagnósticos complexos como é caso do reconhecimento de padrão, previsão, etc, tais redes deverão apresentar configurações formadas por várias unidades de "neurônios", dispostas em fileiras, compondo um arranjo complexo de interligações [1]. As interligações são formadas por pesos (sinapses) que devem ser ajustados em função de um conjunto de padrões que produzam saídas desejadas. Esta atividade é definida como sendo Treinamento ou Aprendizado, sendo elaborado em off-line. Uma vez ajustada a rede deverá ser capaz de emitir, para padrões não constantes no conjunto de treinamento, um diagnóstico com precisão satisfatória. Este diagnóstico pode ser efetuado sem custo computacional. Isto, a princípio, pode ser visto como uma possibilidade de viabilização da análise em tempo real. A maioria das redes neurais feedforward supervisionadas encontradas na literatura é treinada utilizando o algoritmo retropropagação (backpropagation) [2], [3], o qual é considerado um benchmark em termos de precisão. O objetivo deste artigo é desenvolver uma programação orientada a objeto, especificamente a linguagem JAVA, envolvendo a rede neural artificial feedforward com algoritmo retropropagação. A Programação Orientada a Objeto (OOP – Object Oriented Programming) pressupõe uma organização de software em termos de coleção de objetos discretos incorporando estrutura e comportamento próprios. Deste modo, essa organização se difere fundamentalmente das estruturas dos softwares tradicionais [4]. O desenvolvimento de softwares se tornou cada vez mais complexo durante os anos, e assim, foram surgindo grandes necessidades para resolução de problemas cada vez mais 2. REDES NEURAIS ARTIFICIAIS 2.1. Estrutura da Rede Neural Uma rede neural artificial, [1], [7], [8] corresponde a um conjunto de neurônios artificiais separados em camadas (entrada, intermediária e saída). 1 Proceedings of the 9th Brazilian Conference on Dynamics Control and their Applications Serra Negra, SP - ISSN 2178-3667 391 Implementação De Redes Neurais Artificiais Utilizando A Linguagem De Programação Java José R. Campos, Anna D. P. Lotufo, Carlos R. Minussi, Mara L. M. Lopes O processamento de um neurônio artificial resume-se em [9]: sendo: θi (h) γ h ∇i (h) 1. Um conjunto de entradas (sinais) X, x1, x2, ..., xn, são apresentados à rede; 2. Cada sinal é ponderado por um peso associado V, w1, w2, ..., wn, que indica sua influência na saída da unidade; 3. As entradas ponderadas são aplicadas ao bloco somatório, Σ , onde se adiciona também uma entrada independente, x0 = 1, denominada bias; 4. A saída intermediária do neurônio é, então, dada por [3]: si = n ∑ wi j x j Vi Vi (h + 1) = Vi (h) − θ i (h) = = = = γ [∇i (h)]; taxa de treinamento; índice da iteração; gradiente do erro quadrático com relação aos pesos do neurônio i avaliado em h; = vetor contendo os pesos do neurônio i = [ w0i w1i w2i . . . wni ]T. O parâmetro γ serve como controle de estabilidade do processo iterativo. Na Equação (3), a direção adotada para minimizar a função objetivo do erro quadrático corresponde à direção contrária ao gradiente. O gradiente ∇i (h) pode ser expresso por [3], [7]: (1) j 5. A saída é, então, convertida em não-linearidade através das funções de ativação (relé ou sigmóide). 2.1. Treinamento da Rede Neural ∇ i ( h) = A rede neural possui a capacidade de aprender, para tanto, ela deve ser treinada, ajustando assim os seus pesos. Para tal, necessita-se de algoritmo de treinamento, neste caso, utiliza-se o algoritmo retropropagação. O algoritmo retropropagação é um procedimento sistemático de adaptação de pesos de redes neurais, baseado no método do gradiente descendente, que consiste em adaptar os pesos de tal forma, que o erro quadrático da rede seja minimizado. É realizado da seguinte forma [3], [9]: yi = (4) 1 (5) 1 + e( −λ si ) sendo: λ = constante que determina a inclinação da curva yi Diferenciando a Equação (2) com relação ao vetor Vi, obtém-se: ∂ yi ∂ yi ∂ si ∂ εi =− = ∂ Vi ∂ Vi ∂ si ∂ Vi (6) Da Equação (6), resulta-se: O algoritmo retropropagação consiste na adaptação de pesos, tal que, o erro quadrático da rede é minimizado. A soma do erro quadrático instantâneo de cada neurônio alocado na última camada é dada por [3]: ns ∂ εi ∂ ε i2 = 2 εi ∂ Vi (h) ∂ Vi (h) A função de ativação utilizada na aplicação abordada (neste caso, analise de estabilidade cuja variável analisada é à margem de segurança do sistema) é a função sigmóide definida por [3], [7], [9]: 1. Apresentação de um padrão X à rede, o qual fornece uma saída Y; 2. Cálculo do erro (diferença entre o valor desejado e a saída) para cada saída; 3. Determinação do erro retropropagado pela rede associado à derivada parcial do erro quadrático; 4. Ajuste dos pesos de cada elemento; 5. Por fim, um novo padrão é apresentado à rede e o processo é repetido até que ocorra a convergência, ou seja, (erro < tolerância preestabelecida) ou o número de iterações corresponda a um valor máximo previamente estabelecido ε 2 = ∑ ε i2 (3) em que: sgm' ( si ) = (2) ∂εi ∂ si = − sgm' ( si ) ∂ Vi ∂ Vi ∂ yi = λ yi ( 1 − yi ) , derivada parcial de yi ∂ si com relação a si. Observa-se que: i =1 sendo: εi = d i - yi ; di = saída desejada do i-ésimo elemento da última camada da rede; y i = saída do i-ésimo elemento da última camada da rede; ns = número de neurônios da última camada da rede. (7) ∂ si = Xi ∂ Vi (8) sendo: Xi Δ vetor padrão; = [ x 0 i x1i x 2 i K x n i ] T. Substituindo a Equação (8) na Equação (7), tem-se: Considerando-se o neurônio de índice i da rede, e utilizando-se o método do gradiente descendente [3], [9], o ajuste de pesos pode ser formulado como: ∂εi = − sgm' ( s i ) X i ∂ Vi (9) 2 Proceedings of the 9th Brazilian Conference on Dynamics Control and their Applications Serra Negra, SP - ISSN 2178-3667 392 Inserindo-se a Equação (9) na Equação (4), resulta em: ∇ i (h) = − 2 ε i sgm' ( s i ) X i Nesta seção serão abordados os principais conceitos que permeiam o uso das técnicas de OOP utilizando a linguagem de programação JAVA. Um dos grandes diferenciais desta técnica em relação a outros paradigmas de programação é o conceito de herança, mecanismo no qual permite a extensão de definições já existentes. É importante enfatizar também juntamente com o conceito de herança a importância do polimorfismo, que é a capacidade de invocar métodos que tem a mesma identificação (assinaturas), porém comportamentos distintos [12]. Para considerar-se um sistema OOP, é necessário levar em conta pelo menos 4 características: (10) Utilizando (10) estimado no método do gradiente descendente, obtém-se o seguinte algoritmo [3], [7]: Vi (h + 1) = Vi (h) + 2 γ ε i ( λ yi ( 1 − yi ) ) X i (11) Os pesos iniciais são normalmente adotados como números randômicos, visto que a iniciação nula quase sempre proporciona baixa convergência [3]. Uma formulação bastante interessante é o algoritmo retropropagação com momento que faz com que o algoritmo se torne mais rápido. O processo de aprendizagem exige com que a mudança nos pesos seja proporcional a ∂ ε i / ∂ Vi . O gradiente descendente requer que uma infinidade de passos sejam tomados. Considera-se, por exemplo, uma taxa de treinamento grande o possível para que haja oscilação sem direção. Assim, um meio de evitar a oscilação para γ grande, é tomar uma variação no peso dependente da variação do peso passado acrescentando o termo momento. Este procedimento se constitui no algoritmo retropropagação com momento [11]. A adaptação dos pesos, neste caso, pode ser formulada da seguinte forma [3]: sendo: Δvij (h) = = vij γ η = = vij (h+1) = vij (h) + Δvij (h) • • • • Classificação; Herança; Polimorfismo; Encapsulamento. 3.1. Classe A definição de classes e seus inter-relacionamentos são conhecidos como o gabarito para a definição de seus objetos, apresentando-se quais propriedades, atributos o objeto terá. Classe, não descreve somente os atributos, mas também o comportamento dos objetos, ou seja, quais funcionalidades poderão ser aplicadas aos objetos, essas funcionalidades são descritas através de métodos. Um método nada mais é que o análogo a uma função ou procedimento, diferindo-se somente que ele manipula os atributos da classe e variáveis locais definidos [13]. Um exemplo de classe utilizando a linguagem JAVA é descrito na Figura 1. (12) 2 γ (1 - η) βj xi + ηΔvij (h-1); (13) peso correspondente à interligação entre o iésimo e j-ésimo neurônio; taxa de treinamento; constante momento (0 ≤ η < 1). Se o elemento j encontrar-se na última camada então: βj = σj εj (14) em que: σj = derivada da função sigmóide com relação a sj. se: Figura 1. Exemplo de classe. Se o elemento j encontrar-se nas demais camadas tem- βj =σ j ∑ w j k βk A Figura 1 apresenta uma classe MLP (Multi Layer Perceptron) que compõe o pequeno projeto de redes neurais artificiais cujo algoritmo de treinamento utilizado é o algoritmo retropropagação. (15) k ∈R ( j) sendo: R(j) = conjunto dos índices dos elementos que se encontram na fileira seguinte à fileira do elemento j e que estão interligados ao elemento j. 3.2. Objeto No contexto de OOP, um objeto é uma entidade capaz de guardar estados (informações) e de realizar operações (comportamento) que podem se utilizar dos estados, bem como modificá-los, um objeto também é conhecido como instância quando pertencer a uma classe. As declarações de um objeto são denominadas métodos e suas informações atributos [13]. 3. ORIENTAÇÃO A OBJETO A orientação a objeto (OOP) não tem a intenção de substituir a programação estrutural tradicional, desta forma ela é uma evolução das técnicas que vem sendo muito empregadas nos últimos tempos, porém não formalizadas, como visibilidade, escopo e utilização de variáveis locais [12]. 3.3. Herança O conceito de herança organiza as classes para reuso, isto é, faz-se o uso da herança para resolver o problema de 3 Proceedings of the 9th Brazilian Conference on Dynamics Control and their Applications Serra Negra, SP - ISSN 2178-3667 393 Implementação De Redes Neurais Artificiais Utilizando A Linguagem De Programação Java José R. Campos, Anna D. P. Lotufo, Carlos R. Minussi, Mara L. M. Lopes classes que compartilham características iguais. Tomando como exemplo a classe Neurônio, Neurônio Intermediário, Neurônio de Saída, ambos são variações da classe Neurônio, ou seja, todos eles têm características iguais, porém comportamentos diferentes ao longo do programa. Neurônio, seja de entrada, intermediário ou de saída, pode conter pesos, dados de entradas, dados de saídas, porém o cálculo do erro para cada um se difere [13]. específico, há alguns passos necessários para a o sucesso do aprendizado da rede. São eles: 4.1.1. Coleta dos dados e configuração Os dois primeiros passos para o desenvolvimento da rede é a abstração dos dados relativos ao problema e a sua separação em conjuntos, treinamento e diagnóstico. Esta tarefa requer uma minuciosa análise para que não haja problemas como ambigüidade e erros nos dados. Além disso, os dados devem ser significativos e cobrir amplamente o problema em questão. Normalmente os dados coletados são separados em duas categorias, dados de treinamento que serão utilizados para o treinamento da rede e diagnóstico, que serão utilizados para verificação da performance (desempenho) sob condições reais de utilização. Figura 2. Exemplo de classe com herança. 4.1.2. Configuração da rede O terceiro passo é quem denomina o comportamento da rede conforme os padrões de entrada e diagnósticos apresentados no passo um e dois. Determinação dos parâmetros da rede como: A Figura 2 ilustra um exemplo de classe utilizando herança, em Java pode-se observar o uso da palavra extends, isto indica que a classe Neurônio Intermediário herda as características da classe Neurônio, deste modo, é notório o reuso da classe poupando assim a sobrecarga de códigos repetitivos. Herança é a principal característica de um sistema OOP. Como citado em [14], um sistema que não faz o uso de herança não é considerado um sistema totalmente OOP. Desta forma, a principal vantagem da herança é evitar a duplicidade, podendo unicamente herdar características de uma classe-pai e especializar métodos e atributos. a) b) c) d) e) Taxa de Treinamento - γ; Inclinação da função de ativação - λ; Bias; Taxa do momento - η; Escolha da função de ativação. Estes passos tem um grande impacto na performance (desempenho) da rede neural, pois, uma boa escolha desses parâmetros a rede terá grande sucesso em sua convergência, embora a definição dessas configurações seja de forma empírica. 3.4. Polimorfismo A característica de polimorfismo é a capacidade de modificar e interagir com os objetos sem a necessidade do conhecimento prévio de sua classe, através de comportamento dinâmico [15]. Em outras palavras, esses comportamentos podem possuir métodos homônimos, porém com resultados distintos e comportamentos distintos. Assim o polimorfismo, junto com o encapsulamento, que será abordado a seguir, proporciona um código mais inteligível e aumenta o nível da dinâmica proposta pela OOP [15]. 4.2. Integração Finalmente, com a rede já configurada e treinada, ela já pode ser introduzida no ambiente da aplicação na qual ela foi projetada. Para maior facilidade da operação, foi desenvolvido uma interface gráfica para os passos um, dois e três visando um grande aumento de produtividade e minimizando a complexidade da integração. 3.5. Encapsulamento 4.3. Idealização da Rede Neural Segundo Jacobson [15], é a capacidade de definir restrição a visibilidade, de acesso e modificação dos atributos e métodos, assim é possível encapsular métodos e atributos para que exista uniformidade de acesso durante e depois do acesso, sem que haja a necessidade da modificação dos objetos dependentes de tais operações. O sistema desenvolvido traz consigo uma interface bem intuitiva para o usuário, pois ela permite a configuração da rede de forma rápida e bem customizada em três etapas. Na primeira, é apresentado ao usuário um sistema de procura de arquivo em que se encontram os dados inerentes ao treinamento em questão. Neste arquivo, constam os padrões de entradas e saídas. O próximo passo requer a configuração das camadas da rede. O sistema automaticamente arbitra os melhores dados de acordo com os dados fornecidos na primeira etapa, porém, também possível a seleção do número de neurônios em cada camada através do botão “Customizar”. Nesta fase, é então apresentado um preview do arquivo na janela do programa, conforme visto na Figura 5. 4. APLICAÇÃO DA REDE NEURAL EM JAVA 4.1. Desenvolvimento da Aplicação Para este trabalho foi desenvolvido na linguagem JAVA uma interface gráfica para que o usuário entre com as configurações e os dados de entrada por um arquivo 4 Proceedings of the 9th Brazilian Conference on Dynamics Control and their Applications Serra Negra, SP - ISSN 2178-3667 394 Na terceira e última etapa, o usuário entrará com os dados referentes ao treinamento, tais como: taxa de treinamento, erro mínimo tolerável, quantidade de épocas, valor do bias, inclinação da função de ativação, momento, tipo de função de ativação e as configurações iniciais dos pesos. Nestas duas últimas, o sistema permite ao usuário selecionar através de caixa de seleção outros comportamentos a seguir: Após ter concluído as três etapas, inicia-se o treinamento clicando no botão “Iniciar o processo de treinamento”. Caso a rede tenha convergido, é apresentado um gráfico (Figura 6) contendo a média do erro quadrático da rede, e ao mesmo tempo, sugere-se ao usuário diagnosticar a rede para a conferência do treinamento, o gráfico do diagnóstico é ilustrado na Figura 7. a) Seleção do tipo da função de ativação: Sigmóide Logística, Tangente Hiperbólica, Relé, etc. mostrada na Figura 3; Neste artigo considera-se um exemplo para aplicação na Análise de Estabilidade Transitória de um Sistema de Energia Elétrica composto por 3 máquinas síncronas, 7 linhas de transmissão e 9 barras [16]. Na análise de estabilidade transitória é adotado o modelo clássico [6] e ela corresponde à obtenção da margem de segurança para contingências de curto-circuito com saída de linha de transmissão sob defeito. O objetivo do trabalho é evidenciar a aplicabilidade e simplicidade da rede neural feedforward com algoritmo retropropagação através da linguagem de programação JAVA. Neste artigo será mostrada a aplicação da rede neural para o diagnóstico da margem de segurança para o sistema de 3 máquinas [6]. 4.4. Aplicação na análise de sensibilidade Tabela 1. Parâmetros utilizados na rede neural. Item Número de vetores padrões Número de camadas Número de neurônios por camadas Tolerância Taxa de treinamento - γ Momento - η Inclinação da função sigmóide - λ Figura 3. Escolha da função de ativação. b) Seleção do tipo de sementes iniciais para os pesos: Pesos com valor entre -1 e 1, com valores entre 0 e 1 ou pesos aleatórios como ilustra a Figura 4. Sistema Anderson & Fouad 40 3 5-10-1 0,0001 0,3 0,8 0,3 Na Tabela 1 são apresentados os parâmetros que foram utilizados no treinamento e diagnostico da rede neural. Figura 5. Interface da rede neural na linguagem JAVA. Figura 4. Escolha dos pesos. 5 Proceedings of the 9th Brazilian Conference on Dynamics Control and their Applications Serra Negra, SP - ISSN 2178-3667 395 Implementação De Redes Neurais Artificiais Utilizando A Linguagem De Programação Java José R. Campos, Anna D. P. Lotufo, Carlos R. Minussi, Mara L. M. Lopes A Figura 5 mostra a interface do programa JAVA para a rede neural feedforward com algoritmo retropropagação. Pode-se observar que a interface proporciona ao usuário a disponibilização de todos os parâmetros que são utilizados no processamento da rede neural. Nota-se também, que os dados de entrada da rede neural utilizados na aplicação tanto para o treinamento quanto para o diagnostico da rede neural, que neste caso é analise de sensibilidade, são indexados ao processo como um arquivo de dados. A interface proporciona ao mesmo tempo uma conexão da entrada de dados, que serão utilizados na rede neural, e da saída de dados que fornecem os resultados pertinentes a cada aplicação. A saída do número de iterações obtida pela rede neural e o tempo de processamento estão indicados na parte inferior da interface. Durante o processamento do treinamento da rede neural é criada uma interface gráfica após a convergência da rede como mostra a Figura 6. Esta interface representa a evolução do erro obtido no treinamento da rede neural até a convergência. Tabela 2. Resultados reais e obtidos pela rede neural. Saída Real Saída Obtida Saída Real Saída Obtida Saída Real Saída Obtida Saída Real Saída Obtida 0.510 0.420 0.225 0.225 0.585 0.665 0.470 0.310 0.415 0.270 0.519 0.434 0.221 0.220 0.598 0.675 0.478 0.321 0.421 0.262 0.345 0.355 0.155 0.155 0.445 0.575 0.370 0.240 0.330 0.195 0.349 0.353 0.139 0.131 0.431 0.582 0.378 0.236 0.339 0.197 0.215 0.300 0.090 0.100 0.265 0.505 0.295 0.180 0.265 0.135 0.214 0.279 0.091 0.082 0.269 0.482 0.292 0.176 0.261 0.148 0.100 0.225 0.035 0.040 0.105 0.370 0.255 0.125 0.210 0.090 0.128 0.218 0.063 0.056 0.150 0.386 0.219 0.132 0.195 0.112 Na Tabela 2 observam-se os resultados obtidos, via método PEBS (saída real) [16] e pela rede neural feedforward com treinamento retropropagação (saída obtida). Observa-se que a RNA gerar diagnósticos próximos dos dados fornecidos via PEBS. 5. CONCLUSÃO Este artigo apresenta uma metodologia para treinamento de redes neurais feedforward baseado no algoritmo retropropagação executada através de uma programação orientada a objeto. Para demonstrar a facilidade da analise e do desenvolvimento da rede neural feedforward com algoritmo retropropagação foi desenvolvido um sistema de análise de estabilidade transitória de um Sistema de Energia Elétrica Multimáquinas (Sistema Anderson & Fouad) [6]. O enfoque principal do artigo é a implementação da rede neural de tal forma que ela tivesse uma linguagem mais acessível para vários profissionais de diversas áreas podendo ser aplicada em inúmeras situações. A dificuldade de implementação do algoritmo faz com que os pesquisadores procurem programas mais dinâmicos como por exemplo o MATLAB. Porém, nem todos os programas oferecem o suporte técnico necessário para a análise total da aplicação. Uma técnica inovadora que está sendo muito difundida no ambiente de desenvolvimento de aplicativos é a programação orientada ao objeto. A grande vantagem de utilizar a técnica de programação orientada a objeto é que ela proporciona maior facilidade na programação, uma maior reutilização de código e independência no desenvolvimento de módulos. Dentre as linguagens de programação orientada a objeto existentes foi escolhida a linguagem de programação JAVA, por ser totalmente orientada a objeto, por ter grande facilidade na construção de interfaces gráficas através do aplicativo NetBeans IDE 6.8. Desta forma, foram desenvolvidas interfaces para a interação com o usuário a fim de estabelecer simplicidade na customização da rede. O presente trabalho não enfatiza somente o desenvolvimento da rede neural para a análise de estabilidade, mas sim na utilização da técnica da OOP. Foram apresentadas no decorrer do trabalho, várias vantagens na utilização e aplicação da mesma, dessa forma, os resultados esperados foram muito satisfatórios. Figura 6. Interface gráfica do erro obtido pela rede neural. Após a execução do treinamento torna-se ativo o ícone de diagnostico o qual é realizado seguidamente gerando a interface gráfica ilustrada pela Figura 7. Este gráfico mostra os resultados reais da aplicação e os resultados obtidos pela rede neural. Figura 7. Comparação entre os resultados reais e resultados obtidos. No caso da aplicação na análise de estabilidade transitória o objetivo, neste artigo, é utilizar a rede neural para diagnosticar as margens de segurança para um conjunto de potências. AGRADECIMENTOS Agradeço a Universidade Estadual Paulista - Júlio de Mesquita Filho (UNESP) Campus de Ilha Solteira por ter 6 Proceedings of the 9th Brazilian Conference on Dynamics Control and their Applications Serra Negra, SP - ISSN 2178-3667 396 proporcionado uma estrutura adequada para o término deste trabalho. REFERENCIAS [1] T. L. Fine, “Feedforward Neural Network Methodology”, Springer-Verlag, USA, 1999. [2] P. J. Werbos, “Beyond Regression: New Tools for Prediction and Analysis in the Behavioral Sciences”, Master Thesis, Harvard University, 1974. [3] B. Widrow, M. A. Lehr, “30 Years of Adaptive Neural Networks: Perceptron, Madaline, and Backpropagation”, in Proceedings of the IEEE, Vol. 78, No. 9, pp. 1415-1442, 1990. [4] A. Boente, “Livro Aprendendo a Programar em Java 2 Orientado a Objetos”, ed. 1, Brasport, São Paulo, 2003. [5] G. Voss, M. G. Hill, “Object-Oriented Programming: An Introduction”, Addison Wesley, New York, 1991. [6] P. M. Anderson, A. A. Fouad, “Power System Control and Stability”, IEEE Series on Power Engineering, USA, ed. 2, 2003. [7] S. Haykin, “Neural Networks: A Comprehensive Foundation”, Prentice-Hall, Upper Saddle River, New Jersey, USA, 1999. [8] P. K. Simpson, “Artificial Neural Systems: Foundations, Paradigms, Applications and Implementations”, Pergamon Press, New York, 1989. [9] M. L. M. Lopes, “Desenvolvimento de um Sistema Previsor de Cargas Elétricas via Redes Neurais”, Dissertação de Mestrado, Programa de Pós-graduação em Engenharia Elétrica - Faculdade de Engenharia de Ilha Solteira - UNESP, 2000. [10] C. R. Minussi, M. C. G. Silveira, “Electric Power System Transient Stability by Neural Networks”, 38 Th Midwest Symposium On Circuits And System, Rio de Janeiro-RJ, pp. 1305-1308, 1995. [11] B. Krose, P. V. Smagt, “An Introduction to Neural Networks”, University of Amsterdam, November 1996. [12] A. A. Melo, M. G. F. Nascimento, “Aprenda a Desenvolver Sistemas Profissionais Orientados a Objetos com Padrões de Projeto”, ed. 1, Novatec, São Paulo, 2007. [13] C. Cardoso, “Orientação a Objetos na Prática”, ed. 1, Ciência Moderna, São Paulo, 2006. [14] A. Leite, “FJ-11 - Java e Orientação a Objetos”, Apostila do Curso FJ11 – CAELUM Ensino e Inovação, 2009. [15] I. Jacobson, “Object Oriented Software Engineering: A Use Case Driven Approach (Hardcover)”, Addison-Wesley, 1992. [16] A. D. P. Lotufo, “Análise de Sensibilidade por Redes Neurais para Estudos de Estabilidade Transitória de Sistemas Elétricos de Potência”, Tese de Doutorado, Programa de Pós-Graduação em Engenharia Elétrica, UNESP, Campus de Ilha Solteira, 2004. 7 Proceedings of the 9th Brazilian Conference on Dynamics Control and their Applications Serra Negra, SP - ISSN 2178-3667 397