O USO DE ALGORITMOS GENÉTICOS PARA DETERMINAR ZEROS DE FUNÇÕES NÃO LINEARES Ediany Batista Silva Universidade Católica de Brasília Curso de Matemática RESUMO Os algoritmos genéticos utilizam conceitos provenientes do princípio de evolução natural para abordar uma série ampla de problemas, em especial de otimização. Robustos, genéricos e facilmente adaptáveis, consistem de uma técnica amplamente estudada e utilizada em diversas áreas. O cálculo de raízes de equações não lineares é um problema muito estudado em matemática computacional e, dentro de certas condições, bastante mal condicionado. Isso faz com que a implementação de algoritmos numéricos para determinar as raízes de equações algébricas e transcendentes traga consigo grandes problemas como a instabilidade numérica e cancelamento catastrófico, dentre outros. Além disso, os processo iterativos tradicionais não podem garantir a convergência para um problema em geral. O objetivo principal deste trabalho é estudar o comportamento dos algoritmos genéticos e aplicá-lo ao cálculo de raízes de equações não lineares. Palavras-chave: algoritmos genéticos; raízes de equações não lineares. 1. INTRODUÇÃO Otimização, num sentido amplo significa melhorar o que já existe, ou seja, projetar o novo com mais eficiência e menor custo. A própria evolução da espécie pode ser vista como um processo de otimização: ao longo do tempo, os seres vivos se tornam cada vez mais adaptados a um meio ambiente em constante mudança. Atualmente, existe uma tendência de buscar modelos encontrados na natureza para representar métodos de otimização (Haupt, 1998). Tudo indica que os processos naturais relacionados aos seres vivos são bem concebidos e adaptam-se ao mundo científico. Algoritmos Genéticos fazem parte de uma família de modelos computacionais inspirados na evolução: algoritmos evolutivos – simulam processos naturais aplicando a soluções de problemas reais – surgidos então como novas alternativas para resolução de problemas complexos. Processo de otimização consiste em melhorar a performance, com o objetivo de alcançar um ou vários pontos ótimos. É desta forma que funcionam os Algoritmos Genéticos (AGs). Eles combinam a sobrevivência do mais adaptado, com uma troca de informações ao mesmo tempo aleatória e estruturada. Os AGs trabalham seguindo as seguintes etapas, que serão detalhadas na próxima seção. Primeiramente, é gerada uma população de palavras ou cromossomos (strings), que são seqüências de códigos, geralmente de forma binária, que representam determinados parâmetros. Durante o processo evolutivo esta população é avaliada e uma porcentagem será mantida podendo ainda sofrer modificações em suas características fundamentais através de cruzamento e/ou mutação, gerando descendentes para a próxima geração. Este processo, chamado de reprodução é repetido até que uma solução satisfatória seja encontrada. Então por este processo de seleção obtém-se os indivíduos melhores adaptados que neste caso seriam os valores que fornecem os pontos ótimos. Por isso podemos classificá-los como métodos randômicos de otimização, diferenciando das técnicas clássicas de otimização que podem apresentar algumas dificuldades numéricas e problema de robustez relacionadas com continuidade das funções, multimodalidade, existência de máximos e mínimos locais. Neste trabalho é apresentada uma aplicação do algoritmo genético para o cálculo de raízes de equações não lineares. Para isto, o problema de achar as raízes deve ser transformado num problema equivalente de máximos e mínimos, como mostrado na seção 3. 2. ALGORITMO GENÉTICO Os Algoritmos Genéticos representam uma família de modelos computacionais, onde seu funcionamento encontra inspiração em um dos mecanismos básicos da evolução da natureza. Portanto podemos fazer uma analogia entre evolução biológica e algoritmos genéticos. Estes algoritmos foram inicialmente desenvolvidos pelo professor John Holland, da Universidade de Michigan, nos Estados Unidos da América (Holland, 1975), em suas explorações dos processos adaptativos de sistemas naturais e suas possíveis aplicabilidades em projetos de softwares de sistemas artificiais. Os AGs podem se apresentar de duas formas: com parâmetros binários e com parâmetros reais. Neste trabalho utiliza-se a codificação binária. Assim como no seu desenvolvimento, o vocábulo dos algoritmos genéticos é baseado na genética natural. Fala-se sobre indivíduos (genótipos) de uma população. Estes indivíduos também são chamados de cromossomos. Cromossomos são compostos de unidades ou elementos, cada elemento equivale a um gene, dispostos em uma seqüência linear. Observe o esquema abaixo. cromossomo X1 X2 gene X3 X4 ... Xn 1 0 1 1 0 alelo 1 Sendo n o número de variáveis (genes) e cada gene com um comprimento m. Como exemplo, considere uma função com duas variáveis f(x,y), então as variáveis serão representadas através de um cromossomo com dois gene, sendo m = 6, o número de alelos de cada gene. Cromossomo 101101011001 x y Algoritmos genéticos são algoritmos iterativos, e a cada iteração a população é modificada, usando as melhores características dos elementos da geração anterior e submetendoas a três tipos básicos de operadores para produzir melhores resultados (Braga, 1998). Estes operadores são denominados: Seleção, Cruzamento e Mutação. Segundo Bittencourt (1998), O Algoritmo Genético básico realiza as seguintes funções: inicializa a população de cromossomos (soluções); avalia cada cromossomo da população; cria novos cromossomos a partir da população atual (aplica mutação e cruzamento, substituindo os ascendentes pelos descendentes); termina, se o critério de fim for alcançado, se não, reinicializa. Vejamos o diagrama das operações supracitadas: Definir: Função de Custo: F(xi) Variáveis de Projeto: (xi) Criar População Avaliar custo Seleção Cruzamento Mutação Teste de convergência Fim Os procedimentos aplicados serão detalhados na seqüência O primeiro passo para a aplicação de algoritmos genéticos a um problema qualquer é encontrar alguma representação cromossômica conveniente, cujo gene represente o espaço de busca do problema, com vetores binários de zeros e um (0,1), os quais são gerados aleatoriamente. O comprimento m do gene depende da precisão requerida para o problema (Haupt, 1998). Como exemplo, seja a seguinte função: f(x) = 3 + 10*sen(5*x) + 7*cos(4*x), cujo intervalo de interesse é (0,9). Então o espaço de busca, ou seja, o domínio da função tem amplitude I = 9 – 0 = 9. Utilizaremos precisão de duas casas decimais, portanto o intervalo deve ser dividido em I*10P subintervalos iguais, 9*102 = 900 pontos. Logo a seqüência binária deverá ter pelo menos 10 bits, pois 512 = 29 < 900 < 210 = 1024 A seguir é gerada uma população inicial de seis cromossomos obtida aleatoriamente, onde cada gene é um vetor binário de m bits, sendo m em função da precisão exigida (nesse caso 10-2) e da amplitude do intervalo que contém os pontos desejados (I = 9). C1 = 1010010000 C2 = 0010100001 C3 = 1000010001 C4 = 0010010101 C5 = 1000010101 C6 = 1001101110 2.1 Seleção É um processo que será atribuído às cadeias que possuem o maior valor objetivo e, portanto uma probabilidade mais elevada de contribuir à geração seguinte, criando pelo menos um descendente. Quanto maior o valor da função objetivo, maior são as chances do indivíduo sobreviver no ambiente e reproduzir-se passando parte de seu material genético a gerações posteriores (Braga, 1998). Usando a probabilidade, expressa pela equação (2.1), tem-se que se o individuo for de baixa adequabilidade, tem alta probabilidade de desaparecer da população, caso contrário, os indivíduos terão grandes chances de permanecer na população. Sendo x um vetor com os valores da população inicial. Pi = f ( x) , sendo F ( x) = F ( x) f ( xi ) (2.1) Para se calcular o valor da função de adaptação f(x), deve-se converter a seqüência binária (base 2) para base 10, ou seja, deve-se decodificar um cromossomo, dadas pelas equações (2.2) e (2.3). C = [b7b6...b2b1b0 a7a6...a2a1a0] (2.2) x= m −1 i =0 bi × 2 i e y = m −1 i =0 ai × 2 i (2.3) Feito isso, temos que calcular o valor de x e y reais, dentro da região viável, com a seguinte equação: x = ai + x bi − a i 2m − 1 b −a y = ai + y i m i 2 −1 (2.4) sendo: ai e bi - domínio das variáveis x e y. m - comprimento total do gene. Com a população inicial já definida, o próximo passo será o cálculo da função objetivo (adaptação). Utilizando o exemplo anterior, será mostrado o cálculo da função objetivo do primeiro cromossomo criado para a população inicial (C1). Seja C1 = 1010010000 Passando para a base 10, utilizando as equações (2.2) e (2.3) x= m −1 i =0 bi × 2 i = 1 x 29 + 0 x 28 + 1 x 27 + 0 x 26 +0 x 25 + 1 x 24 + 0 x 23 + 0 x 22 + 0 x 21 + 0 x 20 x= m −1 i =0 bi × 2 i = Os valores reais de x dentro da região viável, são dados por: x = ai + x x = 0 + 341 bi − ai 2m − 1 9−0 = 5.7713 210 − 1 e o valor da função é: f(x) = 3 + 10*sen(5*x) + 7*cos(4*x) f(x) = 3 + 10*sen(5* 5.7713) + 7*cos(4* 5.7713) f(x) = -5.7099 Os resultados para cada cromossomo da população inicial estão escritos no quadro abaixo: Cromossomos 1010010000 0010100001 1000010001 0010010101 1000010101 1001101110 f (x) x 5.7713 1.4164 4.6540 1.3109 4.6891 5.4721 f(x) -5.7099 15.8734 0.2334 9.2224 0.0372 3.9541 23.6106 A função f(x) é o árbitro final que decide sobre a vida ou morte de cada cromossomo. O mecanismo para seleção das melhores cadeias, ou seja, as mais adaptadas, são definidas pelo uso das probabilidades proporcionais, dadas pela equação (2.1). p1 = -0.2418 p2 = 0.6723 p3 = 0.0099 p4 = 0.3906 p5 = 0.0016 p6 = 0.1675 sendo p1 + p2 + p3 + p4 + p5 + p6 = 1,00 Considerando que as probabilidades acumulativas qi de cada cromossomo são dadas por: qi = i j =1 Pj Obtém-se os seguintes valores acumulativos: q1 = p1 = -0.2418 q2 = p1 + p2 = -0.2418 + 0.6723 = 0.4305 q3 = p1 + p2 + p3 = -0.2418 + 0.6723 + 0.0099 = 0.4403 q4 = p1 + p2 + p3 + p4 = -0.2418 + 0.6723 + 0.0099 + 0.3906 = 0.8310 q5 = p1 + p2 + p3 + p4 + p5 = -0.2418 + 0.6723 + 0.0099 + 0.3906 + 0.0016 = 0.8325 (2.5) q6 = p1 + p2 + p3 + p4 + p5 + p6 = -0.2418 + 0.6723 + 0.0099 + 0.3906 + 0.0016 + 0.1675= 1,0000 A seguir deve-se selecionar as cadeias que irão contribuir para a geração seguinte. Esta seleção considera um conjunto de números r, escolhidos randomicamente entre [0,1], em quantidade igual ao número de cadeias. A análise é feita através das seguintes opções: Se r < q1, então se seleciona o 1º cromossomo (C1). Se r > q1, então se passa para o subseqüente e faz a análise novamente. Vale ressaltar que alguns cromossomos poderão ser selecionados mais de uma vez, ou seja, os melhores serão copiados mais vezes, enquanto que outros irão morrer. Utilizando o mesmo exemplo dado, considere que foram gerados os seguintes números randômicos: r1 = 0.1957 r2 = 0.2632 r3 = 0.7138 r4 = 0.9776 r5 = 0.6371 r6 = 0.5459 A seleção dos cromossomos é dada por: r1 = 0.1957 > q1 = -0.2418 r1 = 0.1957 < q2 = 0.4305 então seleciona C2 r2 = 0.2632 > q1 = -0.2418 r2 = 0.2632 < q2 = 0.4305 então seleciona C2 r3 = 0.7138 > q1 = -0.2418 0.7138 < q4 = 0.8310 r3 = 0.7138 > q2 = 0.4305 r3 = 0.7138 > q3 = 0.4403 r3 = r4 = 0.9776 > q1 = -0.2418 r4 = 0.9776 > q2 = 0.4305 r4 = 0.9776 > q3 = 0.4403 0.9776 > q4 = 0.8310 r4 = 0.9776 > q5 = 0.8325 r4 = 0.9776 < q6 =1,0000 r4 = então seleciona C4 então seleciona C6 r5 = 0.6371 > q1 = -0.2418 0.6371 < q4 = 0.8310 então seleciona C4 r5 = 0.6371 > q2 = 0.4305 r5 = 0.6371 > q3 = 0.4403 r5 = r6 = 0.5459 > q1 = -0.2418 0.5459 < q4 = 0.8310 r6 = 0.5459 > q2 = 0.4305 r6 = 0.5459 > q3 = 0.4403 r6 = então seleciona C6 Depois de selecionados, os cromossomos dão origem a uma nova população. C1’ = 0010100001 C2’ = 0010100001 C3’ = 0010010101 C4’ = 1001101110 C5’ = 0010010101 C6’ = 0010010101 gerados de C2 gerados de C2 gerados de C4 gerados de C6 gerados de C4 gerados de C4 2.2 Cruzamento É um processo no qual a combinação em partes de cada um de dois cromossomos gera um novo descendente. Seja o ponto k que define a posição de cruzamento na cadeia de bits de cada cromossomo escolhido aleatoriamente. A quantidade de cromossomos a ser submetida ao processo de cruzamento é definida através da probabilidade de cruzamento pc, especificada pelo usuário. Cada cadeia é partida neste ponto k e todas as informações de um cromossomo (A), a partir do ponto escolhido, são copiadas para um outro cromossomo (B) e vice-versa. O processo de escolha de quem será cruzado deve ser feito em pares, sorteando números randômicos (ri) em [0,1]. Quando não for possível formar os pares um novo sorteio deverá ser feito até obter os pares necessários para o cruzamento. Por exemplo, se ri for menor que a probabilidade de cruzamento pc, pré estabelecida, então o cromossomo (C1’) será selecionado. O valor da probabilidade de cruzamento pc = 25% tem sido adotada como um valor padrão (Braga, 1998). Após ter feito isso, temos que gerar um novo número randômico para determinar a posição k, onde novas cadeias são formadas pela roca de todos os caracteres compreendidos entre as posições k+1 e m. Esta posição k é determinada pela seguinte fórmula: k = 1 + rand [(m-1)-1] (2.6) Será submetida ao cruzamento a última população de cromossomos selecionada. Sejam os seguintes números randômicos (ri) r1 = 0,27 r2 = 0,20 r3 = 0,15 r4 = 0,17 r5 = 0,19 C1’> pc C2’< pc C3’< pc C4’< pc C5’< pc r6 = 0,50 C6’> pc sendo selecionado para o cruzamento os cromossomos C1’ e C2’, C3’ e C5’. Agora, é só gerar um número randômico e utilizando a equação (2.6) determinar k, a posição de cruzamento. Seja rand = 0.45; então: k = 1 + 0,45 [ ( 10 - 1 ) - 1 ] = 4,6 Como k é um número inteiro, então k = 5. Logo, C2’ - 0010100001 C3’ - 0010010101 Trocando os caracteres, tem-se: C2” - 0010000001 C3” - 0010110101 e C4’ - 1001101110 C5’ - 0010010101 Trocando os caracteres, tem-se: C4” - 0010001110 C5” - 1001110101 Assim, após a aplicação do operador cruzamento, a população é dada por: C1” - 0010100001 C2” - 0010000001 C3” - 0010110101 C4” - 0010001110 C5” - 1001110101 C6’ - 0010010101 2.3 Mutação A mutação é uma modificação aleatória do valor de um alelo da cadeia. Caso o alelo escolhido seja zero passa a ser um e vice-versa. Seleciona randomicamente uma posição em um cromossomo, obedecendo a probabilidade de mutação pm e muda o valor deste bit. O processo de mutação é controlado por um parâmetro fixo pm, probabilidade de mutação, que é geralmente recomendada como 1% (Braga, 1998). Este operador tem um papel importante e necessário, porque a reprodução e o cruzamento podem perder material genético potencialmente útil. O operador de mutação protege os algoritmos genéticos contra perdas irreparáveis. Tomada isoladamente, a mutação se constituiria na exploração aleatória do espaço das cadeias. Utilizada com cuidado, juntamente com os outros dois operadores, protege-se o procedimento da perda prematura de informações importantes (Braga,1998). Para aplicar o operador mutação ao exemplo em estudo, considere a população atual uma matriz (m x n), então torna-se necessário gerar 60 números randômicos r entre [0,1]. Se r for menor que a probabilidade pm = 0,01 será feita a mutação no bit correspondente. Considere que foram gerados 60 números r entre 0 e 1 e que quatro tiveram probabilidades menores que pm. Foram os seguintes números r: r3 = 0,007 < pm = 0,01 r16 = 0,009 < pm = 0,01 r45 = 0,0036 < pm = 0,01 Considerando a população atual, C1” - 0010100001 C2” - 0010000001 C3” - 0010110101 C4” - 0010001110 C5” - 1001110101 C6’ - 0010010101 Submetendo os bits 3, 16 e 45 ao processo de mutação têm-se: C1” - 0000100001 C2” - 0010010001 C3” - 0010110101 C4” - 0010001110 C5” - 1001010101 C6’ - 0010010101 Após a aplicação dos três operadores, encerra-se o ciclo da primeira geração. Assim, é interessante observar como está ocorrendo a evolução dos cromossomos da população inicial. Veja o quadro abaixo: Cromossomos C1” - 0000100001 C2” - 0010010001 C3” - 0010110101 x 0.2903 1.2757 1.5924 f(x) 15.7162 6.6126 19.9158 C4” - 0010001110 C5” - 1001010101 C6’ - 0010010101 f (x) 1.2493 5.2522 1.3109 4.5975 8.1512 9.2224 64.2157 Comparando os valores da população inicial com os valores da ultima população é possível observar que a população inicial melhorou no sentido de caminhar em direção a maximização da função após aplicar os três operadores, pois os valores de f (x) passaram de 23.6106 para 64.2157. Executando outras iterações espera-se uma adaptação ainda melhor da população. A cada passo do processo de evolução uma nova geração é criada a partir da população anterior, e esta última é atualizada. Para que o processo de evolução possa ser considerado eficiente é necessário que em cada geração nova geração tenda a ser melhor (mais adaptado) que suas anteriores (Lucas, 2002) 2.4 Finalização A finalização não envolve o uso de nenhum operador genético: ela simplesmente é composta de um teste que dá fim ao processo de evolução caso o AG tenha chegado a algum ponto pré-estabelecido de parada. Os critérios para a parada podem ser vários, desde o número de gerações já criadas até o grau de convergência da população (por convergência entende-se o grau de proximidade da avaliação de cada indivíduo da população). O grau de convergência é característica das populações dos AGs, e diz respeito a diferença entre a média de adaptação da geração atual e suas anteriores. A ascensão deste índice indica que o processo de evolução está efetivamente promovendo a melhora da média de adaptação da população, e sua estabilização em torno de um mesmo valor por muitas gerações normalmente indica que a população se estacionou em um determinado valor médio de adaptação, caso em que a continuação do processo de evolução se torna improdutiva (Lucas, 2002). Uma observação deve ser feita. Como a maioria dos códigos computacionais para algoritmos genéticos costuma maximizar funções e caso de problemas de minimizar uma função, a função objetiva pode ser reescrita como: min f(x, y, ...) = max [-f(x, y, ...)] 3. RAÍZES E EQUAÇÕES NÃO LINEARES O cálculo das raízes de equações não lineares, em particular, a determinação dos zeros de polinômios é um dos problemas mais antigos da matemática numérica. Dentro de certas condições, o problema pode se apresentar como mal condicionado. Isto faz com que a implementação de algoritmos numéricos para determinar as raízes de equações algébricas e transcendentes traga consigo grandes problemas, como instabilidade numérica e cancelamento catastrófico, dentre outros (Lopes et al, 1999). Por isso, neste trabalho, propõe-se uma nova alternativa para a resolução dessa classe de problemas. Um método numérico muito utilizado, no cálculo de raízes de equações, é o método de Newton Raphson (MNR). Este é determinado de tal forma que monta-se também um processo iterativo, mas realiza buscas locais, ou seja, para que haja a convergência para uma raíz necessitase de um intervalo pré determinado que contenha a raíz, não sendo uma condição de fácil acesso, visto que o teorema de convergência do método garante a existência do intervalo, mas não como determiná-lo. Teorema: Sejam f , f 'e f " , funções contínuas num intervalo [a, b], onde existe uma raiz ξ . Supor que f '( x) ≠ 0 para x ∈ [a, b]. Então existe um intervalo [a , b ] ⊂ [a, b] , contendo a raiz ξ , tal que se x0 ∈ [a, b ] , a seqüência {xn} gerada pelo processo iterativo x n +1 = x n − f ( xn ) f '( x n ) converge para a raiz. Para a solução de problemas de equações não lineares através da utilização de Algoritmos Genéticos procuramos o máximo de uma função objetiva. Ou seja, a solução de f(x) = 0 será obtida através da função objetiva (ou função de mérito) escrita como: Fm1 = max - f (x) (2.7) Na próxima seção apresentamos resultados numéricos, que mostram as vantagens e desvantagens de cada método. 4. RESULTADOS NUMÉRICOS GAOT (Genetic Algorithms Optimization Toolbox) executa evoluções simuladas no software Matlab usando medições binárias e representações reais. Suas bases de representações são adicionadas no toolbox desse software. Essas implementações são muito flexíveis nas operações genéticas, seleção e terminação de funções bem como avaliação das funções que podem ser usadas. Esse programa foi desenvolvido pela Universidade da Carolina do Norte, EUA, Houck et al (1995). Portanto para representar os exemplos através dos AGs será utilizado o GAOT , sendo possível acompanhar a evolução graficamente. Então a seguir será feita a implementação do algoritmo genético para a obtenção de raízes de equações não lineares utilizando uma precisão de quatro casas decimais para as raízes. O conjunto de equações testadas são exemplos clássicos, que apresentam um elevado grau de dificuldade para a obtenção de raízes usando métodos tradicionais. A título de ilustração, será testado duas funções utilizando os dois métodos (MNR e AG): Exemplo 1: Seja f(x) = e-x - x Newton Raphson: Considerando que f(x) possui uma raíz no intervalo [0,1], procura-se uma aproximação usando x0 = 0.5 e = 0.006, apresenta uma aproximação de x = 0.5671 com 2 iterações. Sendo, f ′( x) = −e − x − 1 tem-se o processo iterativo f ( xn ) e−x − x x n +1 = x n − x n +1 = x n + − x f '( x n ) e +1 assim, e − x0 − x 0 e − x0 + 1 e − x1 − x x 2 = x1 + − x1 1 e +1 x1 = x 0 + = 0.5663 |x1 - x0| = 0.0663 > 0.006 = 0.5671 |x2 – x1| = 0.0008 < 0.006 Algoritmo Genético: Seja f(x) = e-x - x e g(x) = -f(x)a função de adaptação ou função objetiva. Figura 4.1 Gráfico de f(x) Figura 4.2 Gráfico de g(x) Figura 4.3 População inicial Figura 4.4 Seleção dos cromossomos melhores adaptados Figura 4.5 Melhor solução após o ciclo evolutivo Logo a raiz da equação converge para x = 0.5671 Exemplo 2: Seja f(x) = e(-x.^ 2) * cos ( x* 3.5 * pi) Newton Raphson: Esse é um exemplo em que o MNR tem problema. De acordo com o método montou-se uma tabela de 3 linhas e 7 colunas. Na primeira linha temos a condição inicial xo. Na segunda linha o resultado r que ele apresenta e na terceira linha a quantidade de iteração n. x0 r N 0.5300 0.7143 6 0.5400 0.1429 4 0.5500 -0.1429 5 0.5600 -3.2857 5 0.5700 1.5714 5 0.5800 1.0000 5 0.5900 0.7143 7 Observe que as condições iniciais mudam muito pouco e as raízes mudam muito. Isto é chamado de instabilidade do método. Algoritmo Genético: Figura 4.1 Gráfico da função f(x). Figura 4.2 Gráfico da função objetiva g(x) = |f(x)|. Figura 4.3 População inicial. Figura 4.4 Seleção dos cromossomos melhores adaptados. Figura 4.5 Melhor solução. Logo a raiz da equação converge para uma raiz x = 2.9573 Para melhor sistematização será apresentado mais duas equações utilizando o AG. Exemplo 3: Seja f(x) = x*e-x^2 Figura 4.1 Gráfico da função f(x). Figura 4.2 Gráfico da função objetiva g(x) = |f(x)|. Figura 4.3 População inicial. Figura 4.4 Seleção dos cromossomos melhores adaptados. Figura 4.5 Melhor solução. Figura 4.6 Performance do algoritmo genético durante a evolução (número gerações x melhor aproximação). Na figura 4.6 a linha vermelha representa a melhor solução e a linha amarela representa a evolução da população. Logo a raiz da equação x*e-x^2 converge para x = 0 Exemplo 3: Seja f(x) = (x-10)*x + 23 - x0.4 Figura 4.1 Gráfico da função f(x). Figura 4.2 Gráfico da função objetiva g(x) = |f(x)|. Figura 4.3 População inicial. Figura 4.4 Seleção dos cromossomos melhores adaptados. Figura 4.5 Melhor solução. Logo a raiz da equação converge para x = 3.1094 5. CONCLUSÃO O presente estudo propôs a utilização de um outro recurso para o cálculo de raízes de equações não lineares: através dos algoritmos genéticos, levando assim a compreensão dos princípios fundamentais dessa técnica de otimização randômica, bem como permitiu o entendimento dos mecanismos dos operadores genéticos. Para encontrar a raíz procurada, a técnica de transformar o problema da resolução de equações não lineares em problema de maximização por meio de função de mérito, demostrou nos bons resultados, a eficiência da metodologia. Em seguida, dois exemplos foram submetidos a resolução através de um dos métodos numéricos mais usados (MNR) e através do AG. Então feita uma comparação tem-se as seguintes observações: i) O M.N.R. é também um método eficiente, mas realiza buscas locais, ou seja, procura a raíz da função dentro de um intervalo pré-determinado, encontrando assim, uma raíz de cada vez. ii) Ainda no M.N.R a condição de que para realizar a iteração é necessário um x0 dentro do intervalo determinado, não é uma condição de fácil verificação, visto que o Teorema garante a existência do intervalo, mas não como determiná-lo. iii) Já o método AG mostrou bastante eficiente, não apresentando problema de mau condicionamento ou instabilidade numérica. Mas, segundo (Pérez, 2000), os AGs não trabalham sobre o domínio do problema, mas sim sobre representações de seus elementos. Tal fator impõe ao seu uso uma restrição: para resolver um problema é necessário que o conjunto de soluções viáveis para este possa ser de alguma forma codificada em uma população de indivíduos. iv) O fato também dos AGs não utilizarem funções de derivação é uma vantagem, pois evita cancelamento catastrófico. v) Observou-se em relação aos AGs a necessidade de tomar cuidado com o intervalo de busca, caso exista mais de uma raíz, pois haverá convergência para alguma das raízes dependendo dos valores que a população representar. A fase de isolamento necessária nos métodos clássicos de obtenção de raízes (Método de Newton Raphson) continua sendo importante. Considerando os aspectos observados através da comparação feita entre os dois métodos (MNR e AG) é possível concluir que o MNR continua sendo um método eficiente para resolução de uma larga escala de problemas, mas existem casos em que o M.N.R é falho como foi mostrado no exemplo 2. Por isso a obtenção de raízes de equações não lineares utilizando AGs se torna bastante eficaz por não apresentar problema de mal condicionamento ou de instabilidade numérica. REFERÊNCIAS BIBLIOGRÁFICAS BRAGA, C. G. O uso de Algoritmos Genéticos para aplicação de Otimização de Sistemas Mecânicos. Dissertação de mestrado, Universidade Federal de Uberlândia, 1998. HAUPT, Randy L. e Haupt Sue E. Practical Genetic Algorithm. New York: John Wiley & Sons, Inc., 2002. HOLLAND, J. H. Adaptation in Natural and Artificial Systems. Ann Arbor: University of Michigan Press, 1975. BITTENCOURT, M. L. Applying c++ templates to the development of finite element classes. Computers & Structures (submetido), 1998. LUCAS, C. Diogo. Algoritmos Genéticos: uma Introdução. 2002. PÉREZ SERRADA, A. Una introducción a la computación evolutiva. Disponível via WWW em http://geocities.com/igoryepes/spanish.zip. (Setembro de 2000). HOUCK, J.A. Joines e M.G. Kay. A Genetic Algorithm for Function Optimization: a Matlab Implementation. NCSU-IE Technical Report,1995.