🎯 Algoritmos Genéticos
Em poucas palavras
Definição técnica ou simplificada do conceito.
📝 Notas e Desenvolvimento
🔗 Conexões e Contexto
- Atlas: MdC - Programação, MdC - Matemática
- Notas Relacionadas:
📚 Referências e Fontes
Links Externos
Citações Diretas
📂 Outros Conteúdos Preservados
Informações Gerais
Contexto Histórico
- Teoria da Evolução:
- Charles Darwin, em A Origem das Espécies (1859), formalizou que a evolução é impulsionada pela sobrevivência diferencial. Não é o puro acaso que dita o sucesso, mas a interação determinística entre as características do indivíduo e a pressão do ambiente.
- Variação: Nenhuma população é homogênea. Existem variações morfológicas e comportamentais.
- Contingentes da Natureza: Escassez de recursos, mudanças climáticas e predação atuam como “filtros”.
- Seleção Natural: Indivíduos com variações adaptadas ao seu nicho possuem maior probabilidade de sobrevivência e sucesso reprodutivo.
- Teoria do DNA:
- Mendel descobriu que a herança não é uma “mistura” fluida, mas sim composta por unidades discretas.
- Segregação dos Fatores: Cada indivíduo possui um par de genes para cada característica, e estes se separam na formação das células reprodutivas.
- Independência: Diferentes características são herdadas independentemente umas das outras (base para o que fazemos ao trocar partes de um vetor no AG)
- Teoria da Mutação:
- No início do século XX, De Vries observou variações súbitas em plantas (Oenothera lamarckiana) que não eram explicadas apenas pela recombinação de Mendel.
- Mutacionismo: Introduziu o conceito de que novas características surgem por alterações espontâneas e bruscas no material genético, não apenas por herança gradual.
- Saltacionismo: A ideia de que a evolução pode dar “saltos” através dessas mutações.
- Idealização dos Algoritmos Genéticos:
- John H. Holland desenvolveu principalmente a Teoria da Adaptação.
- A premissa é elegante: em vez de tentar resolver um problema complexo “no braço”, criamos uma população de soluções candidatas e deixamos que as forças da evolução (seleção, cruzamento e mutação) filtrem as melhores ao longo das gerações.
- Algoritmos Genéticos vs Algoritmos evolutivos:
- Algoritmos Evolutivos (AEs): É o termo genérico para todos os algoritmos de busca e otimização baseados na evolução biológica. Inclui Estratégias Evolutivas, Programação Evolutiva e Programação Genética.
- Algoritmos Genéticos (AGs): são uma subcategoria dentro dos AEs. Caracteriza-se historicamente pelo uso de representações discretas (strings binárias) e pela forte ênfase no operador de crossover (recombinação).
Conceitos Fundamentais
- Pilares dos algoritmos genéticos:
- Variação (Diversidade): Garantida pela inicialização randômica e pela mutação. Sem ela, ocorre a “convergência prematura”.
- Hereditariedade (Explotação): Garantida pelo crossover. Permite que “blocos construtores” (building blocks) de soluções de sucesso sejam propagados.
- Seleção (Pressão Direcional): Garantida pela função Fitness. Empurra a população estocástica em direção às regiões ótimas do espaço de busca.
- Terminologia:
- Indivíduo (ou Cromossomo): Representa uma única solução candidata para o problema.
- Gene: É a menor unidade de informação de um indivíduo. Representa uma variável específica ou uma característica da solução
- População: O conjunto de todos os indivíduos em uma determinada iteração (geração).
- Locus: A posição específica de um gene dentro do cromossomo.
- Alelo: O valor específico que um gene assume em um determinado locus
- Função de Aptidão (Fitness): Uma função matemática que avalia o desempenho de um indivíduo.
- Geração: Uma iteração completa do algoritmo, desde a seleção até a criação de novos indivíduos que substituirão a população anterior.
Ciclo de um Algoritmo Genético Simples
graph TD A([Início]) --> B[Inicializar População Aleatória] B --> C[Decodificar Genótipos em Fenótipos] C --> D(Avaliação: Calcular Fitness de cada indivíduo) D --> E{Critério de Parada?<br>Ex: Gerações Max ou Erro Min} E -- Sim --> F([Fim: Retorna o Melhor Indivíduo global]) E -- Não --> G[Seleção de Pais] G --> H[Recombinação - Crossover] H --> I[Mutação] I --> J[Substituição - Nova Geração] J --> C
- Etapas:
- POPULAÇÃO INICIAL: Criação aleatória de um conjunto de indivíduos (soluções candidatas). É o ponto de partida no espaço de busca.
- CÁLCULO APTIDÃO: Cada indivíduo é avaliado e recebe uma nota baseada em quão bem ele resolve o problema objetivo.
- REPRODUÇÃO: Os indivíduos com melhor aptidão têm maior chance de serem selecionados como pais para gerar descendentes.
- MUTAÇÃO: Pequenas alterações aleatórias e espontâneas são introduzidas nos genes dos descendentes, visando manter a diversidade genética e evitar que o algoritmo fique preso em ótimos locais.
- SELEÇÃO: Uma nova população é formada, composta pelos melhores descendentes (e, em alguns casos, pelos melhores indivíduos da geração anterior), substituindo a população antiga.
- O CICLO EVOLUTIVO: A seta circular no centro do diagrama indica que o processo de Avaliação, Reprodução, Mutação e Nova Seleção se repete por várias gerações até que um critério de parada seja atingido.
Representação de Indivíduos e Genes
1. Representação Binária (A Clássica de Holland)
Historicamente, é a representação mais comum e a que deu origem aos teoremas fundamentais dos AGs (como o Teorema dos Esquemas). O cromossomo é um vetor estático de booleanos (0s e 1s).
- Quando usar: Problemas de decisão (Sim/Não), problemas de seleção de características (Feature Selection para modelos de Inteligência Artificial) ou problemas da Mochila (Knapsack Problem).
- Exemplo Prático (Engenharia/Redes): Otimização do consumo de energia em uma rede de sensores sem fio. Imagine que temos 8 sensores em um ambiente. Queremos descobrir qual subconjunto de sensores deve permanecer ativo para cobrir a maior área possível gastando o mínimo de bateria.
- Genótipo:
[1, 0, 0, 1, 1, 0, 1, 0] - Decodificação (Fenótipo): Os sensores nos Loci 1, 4, 5 e 7 estão LIGADOS. Os demais estão em modo sleep (desligados).
- Genótipo:
- Ponto de Atenção para a Pós-Graduação (O Hamming Cliff): Se usarmos binário para representar números inteiros contínuos (ex:
0111= 7 e1000= 8), a transição do 7 para o 8 exige a mutação de todos os 4 bits simultaneamente, criando uma “barreira” no espaço de busca. A solução clássica para isso é usar a codificação Código Gray em vez de binário puro.
2. Representação Real / Ponto Flutuante
Aqui, os genes perdem a restrição discreta e assumem valores contínuos (números de ponto flutuante). É a representação mais natural para a imensa maioria dos problemas de otimização em engenharia.
- Quando usar: Otimização de funções matemáticas contínuas, ajuste de parâmetros de controle dinâmico, ou otimização de pesos em arquiteturas de agentes inteligentes e redes neurais.
- Exemplo Prático (Controle e Automação): Sintonia de um controlador PID (Proporcional, Integral, Derivativo) para um motor elétrico. O indivíduo precisa definir as três constantes de ganho (, , ).
- Genótipo:
[12.45, 0.08, 3.14] - Decodificação (Fenótipo): , e . O fitness será calculado simulando o motor com esses ganhos e medindo o erro de regime e o overshoot.
- Genótipo:
- Vantagem: Evita a perda de precisão matemática que ocorreria ao converter números reais em longas cadeias binárias.
3. Representação Inteira e Permutação
Utilizada quando a solução é uma sequência de eventos, categorias ou rotas, onde a ordem dos fatores altera o produto ou onde itens não podem ser fracionados.
- Quando usar: Problemas de escalonamento de tarefas (Job-Shop Scheduling), roteamento de pacotes/veículos e o clássico Problema do Caixeiro Viajante (TSP - Traveling Salesman Problem).
- Exemplo Prático (Otimização Combinatória): Uma placa de circuito impresso onde um braço robótico precisa perfurar 6 furos em locais específicos. Qual a ordem de perfuração que minimiza o tempo total de deslocamento do braço?
- Genótipo (Permutação):
[3, 1, 6, 2, 5, 4] - Decodificação (Fenótipo): O robô vai primeiro ao furo 3, depois ao 1, depois ao 6, etc.
- Genótipo (Permutação):
- Ponto de Atenção para a Pós-Graduação: Na permutação, cada gene só pode aparecer exatamente uma vez. Se você aplicar um crossover clássico cortando dois pais ao meio e juntando as metades, você inevitavelmente criará indivíduos inválidos (com cidades duplicadas e cidades faltando). Isso força a introdução de operadores matemáticos especializados, como o Order Crossover (OX) ou o Partially Mapped Crossover (PMX).
4. Representação em Árvore (Programação Genética - GP)
Esta é a representação mais complexa e fascinante. Idealizada por John Koza, ela emancipa o AG da ideia de otimizar parâmetros e passa a otimizar a própria estrutura de um programa, equação ou circuito lógico. O indivíduo tem tamanho dinâmico e formato hierárquico.
- Quando usar: Regressão simbólica (encontrar a fórmula matemática que explica um conjunto de dados complexos, como leituras de sensores), síntese de circuitos elétricos ou geração de regras para agentes autônomos.
- Exemplo Prático (Regressão Simbólica): Queremos que o algoritmo descubra a relação matemática entre a temperatura () e a pressão () lidas por um sensor. O AG não otimiza variáveis, ele constrói a função.
- Estrutura: Os nós internos são Funções (operadores como
+,*,sin,exp). As folhas são Terminais (variáveis como , , ou constantes como ). - Genótipo (Árvore): Representando a equação
- Estrutura: Os nós internos são Funções (operadores como
graph TD A((+)) --> B(( * )) A --> C((sin)) B --> D[T] B --> E[2.5] C --> F[P] classDef func fill:#e1f5fe,stroke:#039be5,stroke-width:2px; classDef term fill:#f3e5f5,stroke:#8e24aa,stroke-width:2px; class A,B,C func; class D,E,F term;
- Dinâmica: O crossover aqui ocorre trocando sub-árvores inteiras entre dois indivíduos, permitindo que as fórmulas cresçam, encolham e se adaptem até “encaixarem” nos dados de treinamento.
Operadores de Seleção
A fase de seleção é onde a “sobrevivência dos mais aptos” de Darwin é quantificada. O objetivo é escolher os indivíduos da geração atual que terão o direito de passar seu material genético adiante. Indivíduos piores não são sumariamente descartados; eles apenas têm uma probabilidade menor de serem escolhidos.
1. Seleção por Roleta (Proporcional à Aptidão)
É o método clássico original, muito didático, mas que raramente usamos em problemas reais complexos hoje em dia. A ideia é que cada indivíduo ganha uma “fatia” de uma roleta viciada, cujo tamanho é estritamente proporcional ao seu valor de fitness.
-
Matemática: A probabilidade de seleção de um indivíduo é:
(Onde é o fitness do indivíduo e é o tamanho da população).
-
O Problema Crítico (Super-Indivíduo): Imagine uma população inicial aleatória onde quase todos têm nota 2, mas um indivíduo sortudo tem nota 100. Na roleta, ele ocupará 90% do espaço. Ele será selecionado dezenas de vezes, preenchendo a próxima geração com clones seus e matando a diversidade prematuramente (Convergência Prematura).
-
O Segundo Problema (Estagnação Tardia): Perto do fim da otimização, todos os indivíduos são bons e têm fitness parecido (ex: 990, 992, 995). Na roleta, as fatias ficam quase idênticas, e a seleção vira uma escolha praticamente aleatória, perdendo a pressão para encontrar o ótimo global exato.
2. Seleção por Ranking (Ajuste de Escala)
Criado especificamente para resolver os dois problemas da Roleta. O Ranking ignora o valor absoluto do fitness.
- Mecânica: A população é ordenada do pior (posição 1) ao melhor (posição ). A probabilidade de seleção é calculada com base na posição (rank), e não na nota.
- Vantagem em Pós-Graduação: Resolve o problema do super-indivíduo. Se o melhor tem nota 100 e o segundo melhor tem nota 10, a distância absoluta é 90, mas no ranking, eles são apenas o “1º” e o “2º”. A pressão seletiva é mantida constante durante toda a execução do algoritmo, do início ao fim.
3. Seleção por Torneio (O Padrão da Indústria)
Atualmente, é o método mais utilizado em engenharia e aplicações reais devido à sua elegância, eficiência computacional e facilidade de ajuste.
-
Mecânica:
- Sorteie aleatoriamente indivíduos da população (onde é o tamanho do torneio, geralmente ou ).
- Coloque-os para “batalhar”. O indivíduo com o maior fitness vence e vai para a piscina de cruzamento.
- Devolva os indivíduos à população (com reposição) e repita até ter pais suficientes.
-
Por que é o favorito?
- Eficiência: Não exige calcular a soma de todos os fitness (como na Roleta) nem ordenar um vetor inteiro (como no Ranking). por seleção.
- Controle Fino: O parâmetro é o “botão de volume” da pressão seletiva. Se , a pressão é suave. Se , apenas os mais fortes sobrevivem e a diversidade cai rápido.
- Robustez Matemática: Lida perfeitamente com valores de fitness negativos (o que quebra a matemática da Roleta).
4. Elitismo (O Salva-Vidas Complementar)
O Elitismo não é um método de seleção de pais, mas sim uma política de sobrevivência intergeracional.
- Conceito: O cruzamento e a mutação são operadores destrutivos. É perfeitamente possível que os filhos dos dois melhores indivíduos da geração atual sejam piores que os pais (azar na quebra do cromossomo). Para garantir que o algoritmo não “esqueça” a melhor solução já encontrada, o Elitismo copia diretamente os melhores indivíduos da geração para a geração , imunes à mutação.
Operadores de Cruzamento
O objetivo do Crossover é pegar duas soluções parentais promissoras e trocar informações entre elas na esperança de que os filhos herdem o melhor de ambos. A probabilidade de cruzamento () é tipicamente alta, variando de a .
1. Cruzamento de Ponto Simples (Single-Point Crossover)
O método mais antigo e intuitivo, geralmente aplicado em codificação binária ou inteira.
- Mecânica: Sorteia-se aleatoriamente um único ponto de corte (locus ) ao longo do cromossomo de tamanho , onde . Tudo que está à direita do ponto de corte é trocado entre os pais para formar dois filhos.
- Exemplo:
- Pai 1:
[ A B C | D E F ] - Pai 2:
[ 1 2 3 | 4 5 6 ] - Filho 1:
[ A B C | 4 5 6 ] - Filho 2:
[ 1 2 3 | D E F ]
- Pai 1:
- O Gargalo (Viés Posicional): Este método sofre de um problema grave de topologia. Genes que estão fisicamente distantes no vetor (ex: posições 1 e 6) têm uma probabilidade enorme de serem separados (ruptura do bloco construtor). Se a inteligência da sua solução IoT depende de uma combinação estrita entre o primeiro parâmetro (bateria) e o último (potência do rádio), o ponto simples destruirá essa combinação na maioria das vezes.
2. Cruzamento de N-Pontos (Foco no 2-Pontos)
Uma generalização natural para reduzir o viés do ponto simples. Na prática, o Cruzamento de 2 Pontos é o mais utilizado quando se lida com vetores discretos.
- Mecânica: Sorteiam-se dois pontos de corte. Os segmentos intermediários são trocados, tratando o cromossomo conceitualmente como um anel contínuo (circular) em vez de uma linha reta.
- Exemplo:
- Pai 1:
[ A B | C D | E F ] - Pai 2:
[ 1 2 | 3 4 | 5 6 ] - Filho 1:
[ A B | 3 4 | E F ]
- Pai 1:
- Vantagem: Reduz significativamente o viés posicional. Genes nas extremidades agora podem ser herdados juntos.
- O Gargalo: Se aumentarmos muito o número de pontos (ex: cruzamento de 4 ou 5 pontos em um vetor pequeno), o operador perde seu caráter de “herança de blocos” e passa a agir quase como uma embaralhação aleatória, perdendo o propósito de explorar padrões.
3. Cruzamento Uniforme (Uniform Crossover)
Aqui, abandonamos a ideia de “cortar” o cromossomo. Cada gene é avaliado individualmente.
- Mecânica: Gera-se uma “Máscara Binária” do mesmo tamanho do cromossomo, jogando uma moeda (geralmente viciada em ) para cada locus. Se a máscara for 1, o Filho 1 recebe o gene do Pai 1. Se for 0, recebe do Pai 2. O Filho 2 recebe o inverso.
- Exemplo Máscara:
[ 1, 0, 0, 1, 1, 0 ]- Pai 1:
[ A B C D E F ] - Pai 2:
[ 1 2 3 4 5 6 ] - Filho 1:
[ A 2 3 D E 6 ]
- Pai 1:
- Vantagem: Elimina em 100% o viés posicional. A distância física entre os genes no vetor se torna completamente irrelevante. Excelente para problemas onde não sabemos a correlação entre as variáveis.
- O Gargalo (Alta Taxa de Ruptura): É o operador mais destrutivo. Ele quebra facilmente building blocks longos que a evolução demorou dezenas de gerações para construir. É uma excelente ferramenta exploratória no início, mas pode impedir a convergência fina no final da otimização.
4. Cruzamento para Pontos Flutuantes (Representação Real)
Quando nossos parâmetros são contínuos (ex: variáveis de configuração no Arduino, pesagens de balanceamento na AWS), cruzar partes binárias destrói a semântica do número. Precisamos de operadores aritméticos.
- Média Aritmética Simples:
- O filho é literalmente a média entre os pais: .
- Problema Grave: Este método apenas “encolhe” o espaço de busca em direção ao centro geométrico da população. Ele é puramente explotatório e perde a capacidade de explorar os extremos do espaço.
- Cruzamento BLX- (Blend Crossover): O padrão ouro para variáveis reais, desenvolvido por Eshelman e Schaffer. Ele expande o intervalo de busca proporcionalmente à distância entre os pais.
-
Mecânica: Para cada gene real (variável), calcula-se a distância absoluta entre o Pai 1 e o Pai 2: .
-
O filho será sorteado de uma distribuição uniforme dentro do intervalo:
-
Onde é um parâmetro de controle (geralmente ).
-
Vantagem em Pós-Graduação: Se os pais estão longe (alta diversidade), o filho pode nascer em uma área bem ampla. Se os pais convergiram e estão próximos, o filho nascerá muito próximo a eles, permitindo um ajuste fino (sintonia local) automático sem precisarmos mexer no algoritmo.
-
O Gargalo: O BLX- pode gerar valores fora dos limites físicos do problema (ex: gerar um tempo de
-
Operadores de Mutação
A escolha da mutação, assim como o cruzamento, é estritamente dependente da representação (genótipo) escolhida para o problema.
1. Representação Binária: Mutação Bit-Flip
É a mutação mais rudimentar, diretamente herdada da biologia (onde uma base de DNA é trocada).
- Mecânica: O algoritmo percorre cada gene (bit) de cada indivíduo da população e “joga um dado” com probabilidade . Se o evento ocorrer, o bit é invertido ( ou ).
- Exemplo:
- Original:
[ 1, 0, 0, 1, 1 ] - Mutado (locus 3):
[ 1, 0, 1, 1, 1 ]
- Original:
- O Gargalo (O Efeito Avalanche do Genótipo-Fenótipo): Se você estiver usando binário puro para representar números inteiros, o Bit-Flip pode ser perigoso. Mudar o último bit de
1000(8) para1001(9) causa uma alteração de apenas 1 unidade no fenótipo. Mas mudar o primeiro bit de1000(8) para0000(0) causa um salto massivo no espaço de busca. A mutação perde a capacidade de fazer ajustes finos precisos se a codificação não for robusta (como o Código Gray).
2. Representação de Permutação: Mutação Swap (Troca)
Em problemas combinatórios (como o Caixeiro Viajante - TSP ou Roteamento de Veículos), não podemos simplesmente alterar um valor, pois isso duplicaria uma cidade e excluiria outra, criando uma rota inválida. A mutação deve preservar a integridade da permutação.
- Mecânica: Sorteiam-se aleatoriamente dois loci diferentes no cromossomo e trocam-se os alelos de posição.
- Exemplo (Rota de Cidades):
- Original:
[ A, B, C, D, E, F ] - Mutado (troca 2 e 5):
[ A, E, C, D, B, F ]
- Original:
- Vantagem: É computacionalmente barata e garante 100% de validade da solução.
- O Gargalo (Baixa Disrupção): Em um problema de roteamento com 5.000 cidades, trocar apenas duas cidades de lugar causa um impacto microscópico na topologia da rota. Muitas vezes, o Swap não tem força suficiente para tirar o algoritmo de um ótimo local profundo.
3. Representação de Permutação: Mutação por Inversão
Para resolver a fraqueza do Swap, a Inversão atua em escala maciça, alterando drasticamente a ordem de uma sub-rota inteira.
- Mecânica: Sorteiam-se dois pontos de corte no cromossomo. A ordem de todos os genes contidos entre esses dois pontos é invertida.
- Exemplo:
- Original:
[ 1, | 2, 3, 4, 5, | 6, 7 ] - Mutado (inverte miolo):
[ 1, | 5, 4, 3, 2, | 6, 7 ]
- Original:
- O Gargalo (Extrema Disrupção): Ao passo que o Swap é fraco demais, a Inversão pode ser destrutiva demais. Ela quebra múltiplas conexões (edges) de uma vez só. É excelente no início da otimização, mas pode impedir que o algoritmo assente em uma rota perfeita nas gerações finais.
4. Representação Real: Mutação Gaussiana
Para parâmetros contínuos (como constantes de engenharia, pesos de redes neurais, variáveis do nosso nó IoT), a mutação não deve ser uma substituição cega, mas sim uma perturbação aditiva. A Mutação Gaussiana é o padrão absoluto na indústria.
-
Mecânica: Em vez de trocar o número, nós somamos a ele um “ruído” extraído de uma Distribuição Normal (Gaussiana) centrada em zero: .
-
O Segredo (O Desvio Padrão ): A curva Gaussiana tem formato de sino. Isso significa que a imensa maioria dos ruídos gerados será muito próxima de zero, e ruídos gigantescos serão raríssimos.
- Efeito Prático: Na maioria das vezes, a mutação fará o gene virar ou (Ajuste Fino / Busca Local). Muito raramente, ela sorteará um número extremo e fará o pular para (Salto Exploratório).
-
O Gargalo (Calibração Estática vs. Dinâmica): Se você definir um grande no código, o algoritmo nunca convergirá, pois as soluções ficarão tremendo violentamente. Se definir um muito pequeno, a evolução congela. A solução moderna na pós-graduação é o Controle de Parâmetros Adaptativo: começar com um grande na Geração 1 e ir reduzindo matematicamente esse desvio padrão à medida que a otimização avança (imitando o Simulated Annealing).