Faculdade Salesiana Maria Auxiliadora Macaé - RJ Introdução aos Algoritmos Genéticos Prof. Ricardo Linden Teoria da Evolução Até o século XIX os cientistas mais proeminentes acreditavam em duas teorias principais: Criacionismo (“Deus criou o universo da forma que ele é hoje”) Geração espontânea (“a vida surge de essências presentes no ar”). Em torno de 1850 Charles Darwin fez uma longa viagem no navio HMS Beagle. Ele visitou vários lugares e sua grande habilidade para observação permitiu que ele percebesse o seguinte: animais da mesma espécie eram ligeiramente diferentes que seus parentes em outros ecossistemas diferentes cada grupo era mais adaptado às necessidades e oportunidades oferecidas pelo seu ecossistema específico. Conclusão : Teoria da Evolução das Espécies Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 2 Teoria da evolução Indivíduos com uma melhor adequação do seu fenótipo ao meio ambiente (fitness melhor) reproduzem mais. Ao reproduzirem mais, têm mais chances de passar seus genes para a próxima geração. Entretanto, graças aos operadores genéticos (recombinação e mutação) os cromossomos dos filhos não são exatamente iguais aos dos pais. Assim, eles podem evoluir e se adaptar cada vez mais aos meio ambiente que os cerca. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 3 Algoritmos Evolucionários Algoritmos evolucionários usam modelos computacionais dos processos naturais de evolução como uma ferramenta para resolver problemas. Há uma grande variedade de modelos computacionais. Em comum: Conceito de simulação da evolução das espécies Uso de operadores de seleção, mutação e reprodução Todos os processos dependem do "desempenho" dos indivíduos desta espécie dentro do "ambiente". Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 4 Algoritmos Evolucionários Mantêm uma população de estruturas, denominadas indivíduos ou cromossomos Comportam-se de forma semelhante à evolução das espécies. A estas estruturas são aplicados os chamados operadores genéticos, como recombinação e mutação, entre outros. Cada indivíduo recebe uma avaliação que é uma quantificação da sua qualidade como solução do problema em questão. Baseado nesta avaliação serão aplicados os operadores genéticos de forma a simular a sobrevivência do mais apto. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 5 Por que usar a evolução? Natureza é muito eficiente para encontrar soluções. Existe uma solução (espécie) diferente para cada problema (ambiente) específico. As soluções (espécies) inclusive se adaptam a ambientes que mudam com o tempo. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 6 Exemplos de solução Soluções obtidas sem conhecer a melhor solução e sem direcionar o processo... Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 7 Sem direcionar o processo? A evolução (teologia à parte) não é um processo direcionado para a obtenção do melhor indivíduo. Simplesmente, dada a competição por recursos escassos, aqueles que são melhores, geram mais descendentes. Assim, seus genes proliferam e aquilo que lhes faz ser melhores normalmente é passado para sua prole. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 8 Como usar estes conceitos? Temos que levar para o computador os seguintes conceitos: Temos vários indivíduos (população); Todos são avaliados; Os melhores reproduzes mais vezes; Existe algo como os genes que codificam as características; Os filhos compartilham características de ambos os pais; Os indivíduos morrem com o passar do tempo. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 9 Algoritmos Evolucionários Pseudo-Código T:=0 Inicializa_População P(0) Enquanto não terminar faça Avalie_População P(t) P':=Selecione_Pais P(t) P'=Recombinação_e_mutação P' Avalie_População P' P(t+1)=Selecione_sobreviventes P(t),P' t:=t+1 Fim enquanto Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 10 Algoritmos Evolucionários São extremamente dependentes de fatores estocásticos (probabilísticos), tanto na fase de inicialização da população quanto na fase de evolução (durante a seleção dos pais, principalmente). Seus resultados raramente sejam perfeitamente reprodutíveis. Algoritmos evolucionários são heurísticas que não asseguram a obtenção do melhor resultado possível em todas as suas execuções. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 11 Conclusão Razoável Se você tem um algoritmo com tempo de execução longo o suficiente para solução de um problema, então não há nenhuma necessidade de se usar um algoritmo evolucionário. Sempre dê prioridade aos algoritmos exatos. Os algoritmos evolucionários entram em cena para resolver aqueles problemas cujos algoritmos são extraordinariamente lentos (problemas NP-completos) ou incapazes de obter solução (como por exemplo, problemas de maximização de funções multi-modais). Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 12 Algoritmos Genéticos Algoritmos genéticos (GA) são um ramo dos algoritmos evolucionários Como tal podem ser definidos como uma técnica de busca baseada numa metáfora do processo biológico de evolução natural. Os algoritmos genéticos são técnicas heurísticas de otimização global São algoritmos de busca baseados nos mecanismos de seleção natural e genética. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 13 Algoritmos Genéticos Populações de indivíduos são criados e submetidos aos operadores genéticos: Seleção Recombinação (crossover) Mutação. Estes operadores utilizam uma caracterização da qualidade de cada indivíduo como solução do problema em questão chamada de avaliação Geram um processo de evolução natural destes indivíduos Eventualmente gerará um indivíduo que caracterizará uma boa solução (talvez até a melhor possível) para o nosso problema. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 14 Esquema de um GA Graficamente: Cortes a serem efetuados : Filho 1 : Filho 2 : Seleção Operadores genéticos Módulo de população Avaliação Não Satisfizemos critério de parada ? Mortos Sobreviventes Sim Fim Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 15 Esquema de um GA Esta é somente uma visão de alto nível de nosso algoritmo. O que ela esconde é a complexidade do processo de obtenção dos seguintes elementos uma representação cromossomial que seja adequada ao problema uma função de avaliação que: penalize soluções implausíveis para nosso problema avalie satisfatoriamente o grau de adequação de cada indivíduo como solução do problema em questão. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 16 Esquema de um GA Um GA é altamente genérico. Vários de seus componentes são invariáveis de um problema para outro. Isto favorece sua implementação em uma linguagem orientada a objeto, permitindo o reaproveitamento do código para solução de vários problemas diferentes. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 17 Representação Cromossomial A representação cromossomial é fundamental para o nosso algoritmo genético. Ela consiste em uma maneira de traduzir a informação do nosso problema em uma maneira viável de ser tratada pelo computador. Quanto mais ela for adequada ao problema, maior a qualidade dos resultados obtidos. Resista à tentação de adequar o problema à sua representação! Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 18 Representação Cromossomial Cada pedaço indivisível desta representação é chamado de um gene. É importante notar que a representação cromossomial é completamente arbitrária. É interessante apenas que algumas regras gerais sejam seguidas : a) A representação deve ser a mais simples possível b) Se houver soluções proibidas ao problema, então elas não devem ter uma representação c) Se o problema impuser condições de algum tipo, estas devem estar implícitas dentro da nossa representação. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 19 Representação Cromossomial Representação mais comum: binária. Mais simples e mais usada pelos praticantes da área dos algoritmos genéticos; Um cromossomo nada mais é do que uma sequência de bits; Cada gene é somente um bit; O conceito representado por cada bit e/ou conjunto de bits é inerente ao problema. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 20 Representação Cromossomial Essa representação foi a adotada inicialmente por Holland, em seu livro seminal. Hoje em dia, por estes motivos históricos e pelo fato de ser muito simples, ela é amplamente adotada por pesquisadores da área de GA. Os operadores genéticos, como discutiremos a seguir, são compreensíveis e simples de implementar. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 21 Representação Cromossomial Representamos números (inteiros ou reais), strings, etc. usando a representação binária. Para representar números reais como números binários, temos primeiro que saber duas coisas: A faixa de operação de cada uma das variáveis; A precisão desejada. Sabendo isto, convertemos bits para números usando a seguinte fórmula: sup i infi real infi * ri k 2 1 Existe uma representação numérica direta! Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 22 Função de Avaliação A função de avaliação é a maneira utilizada pelos GAs para determinar a qualidade de um indivíduo como solução do problema em questão. É uma nota dada ao indivíduo na resolução do problema. Será usada para a escolha dos indivíduos pelo módulo de seleção de pais, sendo a forma de diferenciar entre as boas e as más soluções para um problema. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 23 Função de Avaliação Dada a generalidade dos GAs, a função de avaliação, em muitos casos, é a única ligação verdadeira do programa com o problema real. Mesmo GA pode ser usado para descobrir o máximo de toda e qualquer função de n variáveis sem nenhuma alteração das estruturas de dados e procedimentos adotados, alterando-se, apenas, a função de avaliação. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 24 Função de Avaliação Também chamada de função de custo Calcula então um valor numérico que reflete quão bons os parâmetros representados no cromossomo resolvem o problema. Usa todos os valores armazenados no cromossomo (os parâmetros) e retorna um valor numérico, cujo significado é uma métrica da qualidade da solução obtida usando-se aqueles parâmetros. A função de avaliação deve ser tal que se o cromossomo c1 representa uma solução melhor do que o cromossomo c2, então a avaliação de c1 deve ser maior do que a avaliação de c2. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 25 Função de Avaliação A função de avaliação deve portanto ser escolhida com grande cuidado. Deve embutir todo o conhecimento que se possui sobre o problema a ser resolvido, tanto suas restrições quanto seus objetivos de qualidade. Quanto mais conhecimento embutirmos em um GA, menos serão válidas as críticas sobre eles serem algoritmos genéricos Deve diferenciar entre duas soluções sub-ótimas, deixando claro qual delas está mais próxima da solução procurada. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 26 Seleção de Pais Método de seleção de pais simula o mecanismo de seleção natural: Pais mais capazes geram mais filhos; Pais menos aptos também podem gerar descendentes. Temos que privilegiar os indivíduos com função de avaliação alta, sem desprezar completamente aqueles indivíduos com função de avaliação extremamente baixa; Indivíduos com péssima avaliação podem ter características favoráveis à criação de indivíduo ótimo; Estas características podem não estar presentes em nenhum outro cromossomo. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 27 Seleção de Pais Método simples e muito adotado: método da roleta viciada. Criamos uma roleta (virtual) na qual cada cromossomo recebe um pedaço proporcional à sua avaliação (a soma dos pedaços não pode superar 100%). Rodamos a roleta Selecionado será o indivíduo sobre o qual ela parar. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 28 Seleção de Pais Exemplo: Indivíduo Avaliação Pedaço da roleta (%) Pedaço da roleta (º) 0001 1 1.61 5.8 0011 9 14.51 52.2 0100 16 25.81 92.9 0110 36 58.07 209.1 Total 62 100.00 360.0 Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 29 Seleção de Pais Exemplo (cont.) – Graficamente, temos: Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 30 Seleção de Pais Não podemos girar uma roleta dentro do computador Trabalhamos com conceitos abstratos, e não roletas físicas. Algoritmo: a) Some todas as avaliações para uma variável soma b) Selecione um número s entre 0 e soma (Não incluídos) c) i=1 d) aux=avaliação do indivíduo 1 e) enquanto aux<s f) i = i + 1 g) aux=aux+avaliação do indivíduo i h) fim enquanto Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 31 Operadores de Crossover e Mutação Iremos trabalhar agora com a versão mais simples dos operadores genéticos Nesta versão, eles atuam em conjunto, como se fossem um só. Existem versões mais avançadas. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 32 Reprodução Sexuada Formação de um novo indivíduo através da combinação de duas células gametas Na formação destas gametas, ocorre o processo de recombinação genética (crossing-over). Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 33 Operador de Crossover Vamos começar com o operador de crossover mais simples, chamado de operador de crossover de um ponto. Depois de selecionados dois pais pelo módulo de seleção de pais, um ponto de corte é selecionado. Um ponto de corte constitui uma posição entre dois genes de um cromossomo. Cada indivíduo de n genes contem n-1 pontos de corte. gen Pontos de Corte: 1 2 3 4 Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 34 Operador de Crossover Depois de sorteado o ponto de corte, nós separamos os pais em duas partes: uma à esquerda do ponto de corte e outra à direita. É importante notar que não necessariamente estas duas partes têm o mesmo tamanho. O primeiro filho é composto através da concatenação da parte esquerda do primeiro pai com a parte direita do segundo pai. O segundo filho é composto através da concatenação das partes que sobraram (a metade esquerda do segundo pai com a metade à direita do primeiro pai). Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 35 Operador de crossover Graficamente: Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 36 Mutação O processo de replicação do DNA é extremamente complexo Pequenos erros podem ocorrer ao longo do tempo, gerando mutações dentro do código genético. Estas mutações podem ser boas, ruins ou neutras Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 37 Operador de Mutação Depois de compostos os filhos, entra em ação o operador de mutação. Este opera da seguinte forma: Ele tem associada uma probabilidade extremamente baixa (da ordem de 0,5%); Nós sorteamos um número entre 0 e 1. Se ele for menor que a probabilidade pré-determinada então o operador atua sobre o gene em questão, alterando-lhe o valor aleatoriamente. Repete-se então o processo para todos os genes componentes dos dois filhos. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 38 Juntando os operadores (a) (b) Pai 1 Pai 1 Selecionamos um ponto de corte Pai 2 Pai 2 Depois do operador de crossover Filho 1 Filho 1 Depois do operador de mutação Filho 2 Gen alterado pela mutação (d) Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden Filho 2 (c) 39 Módulo de População O módulo de população é responsável pelo controle da nossa população. Por simplicidade, população não pode crescer permite que armazenemos a população em um vetor de tamanho constante. Pais têm que ser substituídos conforme os filhos vão nascendo Pode parecer estranho, visto que estamos acostumados a ver a população humana sempre crescendo. Quando nasce um bebê, não é obrigatório que alguém de alguma geração anterior caia fulminado! Entretanto, simula bem ambientes de recursos limitados Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 40 Módulo de População O módulo de população que utilizaremos por enquanto é extremamente simples. Sabemos que a cada atuação do nosso operador genético estamos criando dois filhos. São armazenados em um espaço auxiliar até que o número de filhos criado seja igual ao tamanho da população. Neste ponto o módulo de população entra em ação. Todos os pais são então descartados e os filhos copiados para cima de suas posições de memória, indo tornar-se os pais da nova geração. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 41 Execução Manual (1) Vamos tentar resolver, usando um GA, o problema de maximizar a função do exemplo 4.1, dada por , com x e y pertencentes ao intervalo [0,15]. f ( x, y ) x * y * sen ( y 4 ) Como é possível que esta função retorne um valor igual a zero, usaremos uma função de avaliação g ( x, y) 1 f ( x, y) Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 42 Execução Manual (2) População inicial, sorteada aleatoriamente: Cromossomo x y g(x,y) 01000011 4 3 9,5 00101001 2 9 13,7 10011011 9 11 71,0 00001111 0 15 1,0 10011001 5 5 18,7 11100011 14 3 30,7 Somatório das avaliações: Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 144,6 43 Execução Manual (3) Roleta completa Intervalos para função de seleção 30,7 9,5 13,7 18,7 1,0 71,0 Cromossomo 01000011 00101001 10011011 00001111 10011001 11100011 Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden g(x,y) 9,5 13,7 71,0 1,0 18,7 30,7 Intervalo [0; 9,5[ [9,5; 23,2[ [23,2; 94,2[ [94,2; 95,2[ [95,2; 113,9[ [113,9; 144,6[ 44 Execução Manual (4) Sorteio de Pais Número Sorteado Cromossomo Escolhido 12,8 00101001 65,3 10011011 108,3 10011001 85,3 10011011 1,8 01000011 119,5 11100011 Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 45 Execução Manual (5) Operadores: 001 01001 00111011 100 11011 10001001 100110 01 10011011 100110 11 10011001 0 0100 0011 01000011 1110 0011 11100011 Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden Efeito da mutação 46 Execução Manual (6) Nova geração: Cromossomo x y g(x,y) 00111011 3 3 7,4 10001001 8 9 51,9 10011011 9 11 71,0 10011000 9 8 1,0 01000011 4 3 9,5 11100011 14 3 30,7 Somatório das avaliações: Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 171,5 47 Execução Manual (7) Nova roleta: Intervalos para função de seleção 7,4 30,7 9,5 51,9 1,0 71,0 Cromossomo 00111011 10001001 10011011 10011000 01000011 11100011 Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden g(x,y) 7,4 51,9 71,0 1,0 9,5 30,7 Intervalo [0; 7,4[ [7,4; 59,3[ [59,3; 130,3[ [130,3; 131,3[ [131,3; 140,8[ [140,8; 171,5[ 48 Execução Manual (8) Sorteio de Pais Número Sorteado Cromossomo Escolhido 10,4 10001001 132,5 01000011 61,2 10011011 148,6 11100011 129,7 10011011 75,2 10011011 Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 49 Execução Manual (9) Operadores: Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 50 Execução Manual (10) Nova geração: Cromossomo x y g(x,y) 00001001 0 9 1,0 11000011 3 3 7,4 10010011 9 3 20,1 11101011 14 11 109,9 10011011 9 11 71,0 10011011 9 11 71,0 Somatório das avaliações: Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 280,4 51 Execução Manual (11) Neste momento você poderia achar que o algoritmo só funcionou porque o sorteio foi direcionado Esta é uma dúvida extremamente razoável neste ponto Só será apagada se executar os códigos do livro e ver que tudo que fizemos aqui realmente acontece. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 52 Algoritmos Genéticos GAs não são métodos de "hill climbing", logo eles não ficarão estagnados simplesmente pelo fato de terem encontrado um máximo local. Eles se parecem com a evolução natural, que só por que encontrou um indivíduo que é instantaneamente o melhor de um certo grupo não pára de “procurar” outros indivíduos ainda melhores. Na evolução natural isto também decorre de circunstâncias que mudam de um momento para outro. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 53 Atenção A evolução natural não é um processo dirigido à obtenção da solução ótima. O processo simplesmente consiste em fazer competir uma série de indivíduos e pelo processo de sobrevivência do mais apto, os melhores indivíduos tendem a sobreviver. Um GA tem o mesmo comportamento que a evolução natural: a competição entre os indivíduos é que determina as soluções obtidas. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 54 Características dos GAs Assim como na natureza, a informação deve ser codificada nos cromossomos (ou genomas); A reprodução, que no caso dos GAs, é equivalente à reprodução sexuada, se encarregará de fazer com que a população evolua; A mutação cria diversidade, mudando aleatoriamente gens dentro de indivíduos; A reprodução e a mutação são aplicadas em indivíduos selecionados dentro da nossa população. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 55 Processo de Seleção A seleção deve ser feita de tal forma que os indivíduos mais aptos sejam selecionados mais freqüentemente do que aqueles menos aptos; Objetivo: boas características daqueles passem predominar dentro da nossa população de soluções; Indivíduos menos aptos nunca devem ser descartados da população reprodutora. Isto causaria uma rápida convergência genética de todas as soluções para um mesmo conjunto de características e evitaria uma busca mais ampla pelo espaço de soluções Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden a 56 Características dos GAs GAs são técnicas probabilísticas, e não técnicas determinísticas. Iniciando um GA com a mesma população inicial e o mesmo conjunto de parâmetros podemos encontrar soluções diferentes a cada vez que executamos o programa. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 57 Características dos GAs GAs são em geral programas extremamente simples que necessitam somente de informações locais ao nosso ponto Informações relativas à adequabilidade do ponto como solução do problema em questão Não necessitam de derivadas ou qualquer outra informação adicional. Extremamente aplicáveis a problemas do mundo real que em geral incluem descontinuidades duras e funções extremamente complexas. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 58 Características dos GAs GAs trabalham com uma grande população de pontos, sendo uma heurística de busca no espaço de soluções; Um GA diferencia-se dos esquemas enumerativos pelo fato de não procurar em todos os pontos possíveis, mas sim em um (quiçá pequeno) subconjunto destes pontos; GAs diferenciam-se de esquemas aleatórios por serem uma busca que utiliza informação pertinente ao problema e não trabalham com caminhadas aleatórias (random walks) pelo espaço de soluções. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 59 Por que GAs? GA é uma técnica de busca com as seguintes características positivas, que fazem com que eles devam ser considerados: Global; Não totalmente aleatórios; Não afetada por descontinuidades na função ou em suas derivadas; Capaz de lidar com funções discretas e contínuas; Capaz de lidar com múltiplos objetivos; Boas técnicas para atacar problemas de busca com espaços de busca intratavelmente grandes, que não podem ser resolvidos por técnicas tradicionais. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 60 “Algoritmos genéticos são bons para abordar espaços de buscas grandes (potencialmente imensos) e navegá-los, procurando por combinações ótimas de coisas, soluções que talvez não fossem encontradas em uma busca mesmo que esta durasse o tempo de toda uma vida" - Salvatore Mangano (Computer Design, Maio 1995) Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 61 Conclusão Existe muito mais a falar sobre GAs... Parâmetros numéricos Otimização multi-objetivo Existem milhares de pesquisadores devotados a esta área de pesquisa. Importante ferramenta para ADICIONAR à sua caixa de ferramentas. Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 62 Contato E-mail: [email protected] CEPEL: 2598-6145 Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 63 Muito obrigado! Introdução aos Algoritmos Genéticos - Prof. Ricardo Linden 64