Evolutionary Algorithms
Algoritmos evolutivos fazem evoluir uma população de soluções candidatas por meio de seleção, cruzamento e mutação. Abrange os principais tipos, código e aplicações práticas.
Os algoritmos evolutivos (EAs) são uma família de algoritmos de otimização que imitam a seleção natural. Mantêm uma população de soluções candidatas, atribuem uma pontuação a cada uma através de uma função de aptidão, permitem que as melhores candidatas gerem descendentes por recombinação e mutação aleatória e repetem o processo ao longo de muitas gerações, fazendo a população evoluir para soluções melhores. Um EA só precisa de avaliar uma candidata, sem calcular gradientes, pelo que funciona em problemas que a descida do gradiente não consegue resolver: escolhas discretas, objetivos não diferenciáveis ou ruidosos e superfícies irregulares repletas de ótimos locais. Por isso, os EAs são uma ferramenta padrão para o ajuste de hiperparâmetros, a pesquisa de arquiteturas neurais, o projeto de engenharia e o escalonamento.
Como funcionam os algoritmos evolutivos#
Todos os EAs são constituídos pelos mesmos elementos:
- Representação: Cada candidata é codificada como um genoma, por exemplo, uma cadeia de bits, um vetor de números reais ou uma árvore de programas.
- Inicialização: A primeira geração costuma ser aleatória, por vezes com soluções conhecidas como boas usadas como sementes.
- Avaliação da aptidão: Uma função de aptidão atribui uma pontuação a cada candidata com base no objetivo que está a ser otimizado.
- Seleção: As candidatas mais aptas têm maior probabilidade de se tornarem progenitoras. Por exemplo, a seleção por torneio escolhe a melhor de entre algumas candidatas aleatórias, e o elitismo copia as melhores sem alterações para a geração seguinte.
- Variação: O cruzamento combina partes de dois progenitores, e a mutação introduz pequenas alterações aleatórias para manter a exploração da população.
Na aprendizagem automática (ML), a função de aptidão é muitas vezes uma métrica de validação, como a precisão ou a precisão média (mAP); assim, avaliar uma candidata significa treinar e testar um modelo, de longe a etapa mais dispendiosa. O ciclo repete-se até esgotar o orçamento ou deixar de melhorar a aptidão:
A pressão de seleção e a intensidade da mutação determinam o equilíbrio entre aproveitamento e exploração. Uma seleção forte com mutações pequenas converge rapidamente, mas pode ficar presa num ótimo local; uma seleção fraca com mutações grandes explora amplamente, mas desperdiça avaliações.
Principais tipos de algoritmos evolutivos#
- Algoritmos genéticos (GAs): Codificam as candidatas como cadeias, muitas vezes de bits, e dependem bastante do cruzamento. John Holland formalizou-os no seu livro de 1975 Adaptação em sistemas naturais e artificiais.
- Estratégias evolutivas (ES): Otimizam vetores de números reais com mutações gaussianas cujos tamanhos de passo se adaptam durante a execução. O CMA-ES, que aprende a covariância completa da sua distribuição de mutação, é um dos métodos de uso geral mais robustos para problemas contínuos de caixa-preta.
- Programação genética: Evolui programas ou expressões matemáticas representados como árvores, usados em regressão simbólica e na conceção automática de programas.
- Neuroevolução: Evolui os pesos e, por vezes, a estrutura das redes neurais. Em 2017, a OpenAI mostrou que estratégias evolutivas executadas por mais de mil trabalhadores paralelos conseguiam treinar um humanoide 3D para andar em 10 minutos, uma alternativa escalável à aprendizagem por reforço.
Um algoritmo genético em código#
O problema da mochila pergunta que itens devem ser incluídos para maximizar o valor total sem ultrapassar um limite de peso; é um problema discreto sem gradiente. Este algoritmo genético em NumPy evolui 50 genomas de cadeias de bits, com um bit por item, usando seleção por torneio, cruzamento uniforme, mutação por inversão de bits e elitismo; depois, compara a resposta com todas as 1,048,576 seleções possíveis:
import itertools
import numpy as np
rng = np.random.default_rng(0)
# Knapsack problem: pick from 20 items to maximize total value within a weight limit of 200
values, weights, limit = rng.integers(10, 100, 20), rng.integers(5, 50, 20), 200
def fitness(pop):
"""Return each selection's total value, or 0 if it exceeds the weight limit."""
return np.where(pop @ weights <= limit, pop @ values, 0)
population = rng.random((50, 20)) < 0.2 # 50 random genomes, one bit per item
for generation in range(100):
scores = fitness(population)
# Tournament selection: each parent is the better of two random genomes
pairs = rng.integers(50, size=(50, 2))
parents = population[np.where(scores[pairs[:, 0]] > scores[pairs[:, 1]], pairs[:, 0], pairs[:, 1])]
# Uniform crossover with the next parent, then flip each bit with probability 0.05
children = np.where(rng.random((50, 20)) < 0.5, parents, np.roll(parents, 1, axis=0))
children ^= rng.random((50, 20)) < 0.05
children[0] = population[scores.argmax()] # elitism: keep the best genome
population = children
all_selections = np.array(list(itertools.product([0, 1], repeat=20)))
print(f"GA best: {fitness(population).max()}, true optimum: {fitness(all_selections).max()}")Imprime GA best: 811, true optimum: 811. O algoritmo encontrou a melhor combinação possível após 5,000 avaliações de aptidão, cerca de 0.5% das um milhão de seleções que a pesquisa exaustiva teve de verificar.
Evolução de hiperparâmetros#
As definições de treino, como a taxa de aprendizagem, os pesos da função de perda e a intensidade do aumento de dados, interagem de formas que nenhuma fórmula consegue prever; cada candidata exige uma execução completa de treino, o que torna a pesquisa evolutiva uma boa opção. O método tune() do Ultralytics YOLO aplica esta abordagem aos modelos YOLO26: em cada iteração, escolhe um progenitor entre as nove melhores configurações até então, ponderando a escolha pela aptidão, aplica mutações gaussianas a cerca de metade dos 26 hiperparâmetros do espaço de pesquisa predefinido, com passos escalados de acordo com os respetivos intervalos de pesquisa, treina um modelo e regista a sua aptidão, que corresponde a mAP50-95 para deteção de objetos. Depois de 30 resultados, algumas mutações também seguem a covariância dos 20% de melhores configurações, uma técnica inspirada no CMA-ES. O guia de ajuste de hiperparâmetros apresenta o espaço de pesquisa completo:
from ultralytics import YOLO
# Carrega um modelo nano YOLO26 pré-treinado
model = YOLO("yolo26n.pt")
# Evolui os hiperparâmetros: 30 iterações, cada uma a treinar durante 10 épocas uma configuração com mutações
model.tune(data="coco8.yaml", epochs=10, iterations=30, plots=False)O afinador escreve todas as configurações e respetiva aptidão em tune_results.ndjson e guarda a melhor em best_hyperparameters.yaml, pronta para ser usada numa execução de treino completa.
Outras aplicações#
- Pesquisa de arquiteturas neurais: O AmoebaNet da Google resultou de uma evolução regularizada, um EA com seleção por torneio que elimina os modelos mais antigos em vez dos piores, e alcançou uma precisão top-1 de 83.9% no ImageNet em 2018.
- Projeto de engenharia: A missão Space Technology 5 da NASA levou ao espaço em 2006 uma antena de banda X concebida por computador através da evolução, cuja forma irregular de fios dobrados igualou o desempenho de uma antena concebida por métodos convencionais.
- Descoberta de algoritmos: O AlphaEvolve, anunciado pela Google DeepMind em maio de 2025, combina modelos Gemini que propõem alterações ao código com avaliadores automatizados e uma base de dados evolutiva de programas. Uma heurística de escalonamento que desenvolveu para os centros de dados da Google recupera, em média, 0.7% dos recursos de computação globais da empresa.
Algoritmos evolutivos vs. métodos relacionados#
- Descida do gradiente: Segue o gradiente de uma função de perda diferenciável e é muito mais eficiente para treinar pesos de redes com milhões de parâmetros. Os EAs são adequados para problemas com poucos parâmetros, avaliações dispendiosas ou sem gradiente.
- Inteligência de enxame: Métodos como a otimização por enxame de partículas movem um conjunto persistente de agentes pelo espaço de pesquisa; cada agente ajusta a sua posição com base no seu melhor resultado e nos dos seus vizinhos, sem substituição geracional, cruzamento ou mutação.
- Otimização bayesiana: Ajusta um modelo probabilístico do objetivo e escolhe cada ensaio seguinte na região em que esse modelo prevê a maior melhoria. Isto requer menos avaliações do que um EA em espaços de pesquisa pequenos e suaves, mas escala pior para muitos parâmetros e trabalhadores paralelos.










