Resumo |
Uma das questões centrais da computação é atribuída a Arthur Samuel na década de 50 na qual se questiona como computadores podem fazer o que precisa ser feito, sem exatamente terem sido programados para fazê-lo? Para tanto existem métodos para o aprendizado de máquina descritos na literatura, como por exemplo: inteligência artificial, sistemas de auto-organização e sistemas de auto-melhoria, redes neurais e computação evolucionária. Tais metodologias são capazes de resolver problemas complexos particularmente problemas descontínuos, multimodais, com ótimos isolados e/ou variáveis de decisão mistas. Dentre estas metodologias, uma que vem sendo utilizada para a resolução de problemas de otimização é a computação evolucionária, a qual foi baseada na teoria da evolução das espécies. Neste projeto consistiu-se no estudo e implementação de uma técnica da computação evolucionária, a programação genética, sendo aplicada na resolução problemas relacionados à regressão simbólica de forma que se consiga encontrar uma solução partindo de um conjunto de dados sem que seja definida uma função específica. O algoritmo foi implementado em linguagem C e possui uma estrutura de dados em árvore representando uma solução para o problema, pela qual é capaz de representar funções matemáticas de forma que possam ser manipuladas pelo algoritmo. As formas de manipulação mais comuns em programação genética são cruzamento, mutação e seleção. O cruzamento mistura duas árvores de modo que resulte dois filhos, a mutação perturba uma árvore gerando outra diferente e a seleção preserva os indivíduos mais aptos para a próxima geração, desta forma o algoritmo evolui a cada geração de indivíduos até encontrar uma solução muito boa. Assim, testes foram feitos para verificar a qualidade do algoritmo proposto usando as funções de benchmark Salustowicz e Unrapped Ball, por um conjunto de dados, por uma série histórica e por uma função de teste. Os resultados obtidos foram: para a função Salustowicz o algoritmo encontrou a solução com fitness de 7.84590866*10-4 e para o conjunto de validação de 6.70941311*10-4; para a função Unrapped Ball resultou em um fitness de 5.257594911*10-3 e validação de 5.919258172*10-3; para a função de teste obteve-se um fitness de 0.700438532779 e para o conjunto de validação de 0.157594496601; para o conjunto de dados o algoritmo encontrou a solução com fitness de 3.334*10-7 e para o conjunto de validação de 4.494*10-10; para a série histórica o algoritmo retornou a solução com o fitness de 3.839947491692 e validação com 19.052621220755 e a altura da árvore de 33. A fitness é a medida que representa quão boa é uma solução sendo uma medida em relação a um erro, então quanto mais próximo de zero, melhor é a solução. Portanto, o algoritmo encontrou boas soluções para as funções de benchmark e o conjunto de dados com valores bem pequenos, porém o algoritmo encontrou dificuldade com a série histórica. |