Algorítimos Genéticos

O que são algoritmos genéticos?

Algoritmos genéticos (AGs) pertencem à família dos algoritmos evolucionários. Eles imitam o processo de seleção natural da biologia. Assim, soluções para problemas complexos podem ser encontradas. Cada possível solução é representada como um “indivíduo” em uma população. Esses indivíduos geralmente são codificados como cadeias binárias ou números reais. A qualidade de cada um é medida por uma função de aptidão (*fitness*). Quanto maior o valor de aptidão, melhor é a solução. Portanto, o algoritmo busca maximizar (ou minimizar) essa função.

Principais operadores evolutivos

Três operadores biológicos são simulados: seleção, cruzamento e mutação. A seleção escolhe os indivíduos mais aptos para reprodução. O cruzamento combina partes de dois pais para gerar filhos. A mutação introduz pequenas alterações aleatórias em um indivíduo. Dessa forma, a diversidade genética é mantida ao longo das gerações. Esses operadores são aplicados repetidamente até um critério de parada. Exemplos de critério incluem número máximo de gerações ou convergência.

Formulação matemática básica

Seja uma população de tamanho *N* na geração *t*: P(t) = {x_1(t), x_2(t), ..., x_N(t)}. Cada indivíduo x_i possui um vetor de genes. A função aptidão é f(x_i), que retorna um valor real. A probabilidade de seleção do indivíduo *i* é proporcional a f(x_i). Para maximização, usa-se p_i = f(x_i) / Σ f(x_j). No cruzamento de um ponto, dois pais trocam genes após uma posição *k*. A mutação flip inverte um bit com probabilidade p_m (taxa de mutação). A nova população P(t+1) é formada pelos filhos e, talvez, pelos melhores pais (elitismo). O processo iterativo busca o ótimo global x* tal que f(x*) ≥ f(x) para todo x. Matematicamente, o AG é um método estocástico de otimização. Ele não exige derivadas nem convexidade da função objetivo. Por isso, é amplamente usado em problemas com muitos máximos locais.

Exemplo clássico: maximização de uma função

Considere a função f(x) = x * sen(10π * x) + 1 no intervalo [0, 1]. O objetivo é encontrar o valor de x que maximiza f(x). Esta função possui várias oscilações, sendo um teste comum para AGs. O máximo global aproximado ocorre em torno de x ≈ 0.85, com f ≈ 2.85. Resolveremos este problema com um AG binário de 20 bits (precisão ~ 1e-6). Enunciado do problema: Implemente um algoritmo genético para maximizar f(x) no domínio dado. Use população de 50 indivíduos, 100 gerações, taxa de cruzamento 0.8 e mutação 0.01. Adote seleção por roleta e elitismo (manter o melhor indivíduo). Ao final, exiba o melhor x encontrado e seu valor de f(x). Gere dois gráficos: (1) evolução do melhor fitness por geração; (2) população final sobre a curva da função. A resolução em Python para o Google Colab está abaixo. O código é autoexplicativo e utiliza apenas NumPy e Matplotlib. Ao executar, o gráfico da esquerda mostra a melhora contínua do fitness. O gráfico da direita exibe todos os indivíduos finais espalhados perto do pico. O asterisco azul indica a melhor solução encontrada pelo AG. Esse exemplo demonstra a robustez do método mesmo sem conhecimento prévio. A convergência é alcançada, embora com variabilidade entre execuções. Para problemas reais, ajustes nos parâmetros são frequentemente necessários. Assim, os algoritmos genéticos oferecem uma ferramenta flexível e poderosa. Eles são aplicados em engenharia, finanças, robótica e muito mais. Com a prática, você poderá adaptá-los a seus próprios desafios.

Deixe um comentário