INTELIGÊNCIA ARTIFICIAL

Algoritmos Genéticos: Como a Evolução Artificial Ensina Foguetes a Pousar

Visualização de algoritmo genético otimizando pouso de foguete através de gerações evolutivas
Visualização de algoritmo genético otimizando pouso de foguete através de gerações evolutivas

Algoritmos genéticos são técnicas de otimização inspiradas na evolução natural de Charles Darwin. Eles criam uma população de soluções candidatas, avaliam cada uma com uma função de fitness, selecionam as melhores para reprodução, combinam seus "genes" através de crossover, aplicam mutações aleatórias e repetem o ciclo por gerações até encontrar soluções ótimas ou quase-ótimas para problemas complexos.

Imagine ensinar um foguete a pousar sozinho — sem programar regras explícitas, apenas deixando-o experimentar milhares de tentativas, morrendo e renascendo, até que apenas os melhores "sobrevivam". É exatamente assim que algoritmos genéticos funcionam: através de seleção natural artificial.

O que são algoritmos genéticos

Em 1975, o cientista da computação John Holland publicou "Adaptation in Natural and Artificial Systems", formalizando pela primeira vez a ideia de usar evolução como algoritmo de otimização. Desde então, algoritmos genéticos (GAs, do inglês Genetic Algorithms) se tornaram uma das ferramentas mais poderosas para resolver problemas onde métodos tradicionais falham.

A premissa é simples mas profunda: se a evolução natural conseguiu criar organismos incrivelmente complexos sem um designer, por que não usar o mesmo processo para resolver problemas de engenharia?

Ao contrário de algoritmos determinísticos que seguem regras fixas, algoritmos genéticos são estocásticos — usam aleatoriedade controlada para explorar o espaço de soluções. Eles não garantem a solução ótima global, mas frequentemente encontram soluções excelentes quando outros métodos ficam presos em ótimos locais.

Pense em encontrar o pico mais alto de uma cordilheira coberta de neblina. Um algoritmo tradicional de subida de colina pode ficar preso no primeiro morro alto que encontrar. Um algoritmo genético manda centenas de exploradores em direções aleatórias simultaneamente — alguns encontram picos baixos, outros encontram o Everest. A evolução seleciona os que chegaram mais alto e os envia explorar ao redor, geração após geração.

Hoje, em 2026, algoritmos genéticos são usados para otimizar desde rotas de entrega de drones da Amazon até o design de asas de aeronaves da Boeing, passando por portfólios financeiros em Wall Street e estratégias de IA em jogos competitivos.

Como funcionam na prática

O ciclo de um algoritmo genético segue um padrão que espelha a evolução biológica. Aqui está o fluxo completo:

1. Inicialização

Crie uma população inicial de soluções candidatas, normalmente aleatórias. Cada solução é chamada de indivíduo ou cromossomo. Por exemplo, se você está otimizando pesos de uma rede neural, cada indivíduo é um conjunto de pesos.

Tamanho típico de população: 100 a 1000 indivíduos, dependendo da complexidade do problema. Populações maiores exploram mais, mas custam mais computacionalmente.

2. Avaliação (Fitness)

Calcule o fitness de cada indivíduo — uma pontuação que representa quão boa é aquela solução. A função de fitness é o coração do algoritmo: ela define o que é "sucesso".

Exemplo: num problema de roteamento de veículos, fitness poderia ser 1 / (distância_total + tempo_total). Quanto menor a distância e tempo, maior o fitness.

3. Seleção

Escolha indivíduos para reprodução baseado no fitness. Indivíduos mais aptos têm maior probabilidade de serem selecionados, mas não é determinístico — até indivíduos fracos têm alguma chance (diversidade genética).

Métodos comuns:

  • Roleta: Probabilidade proporcional ao fitness
  • Torneio: Escolhe K aleatórios, seleciona o melhor
  • Rank: Ordena por fitness, probabilidade baseada em posição

4. Crossover (Recombinação)

Combine dois pais para criar filhos que herdam características de ambos. Existem várias estratégias:

  • Crossover de um ponto: Corta cromossomos em um ponto aleatório, troca as metades
  • Crossover uniforme: Para cada gene, escolhe aleatoriamente de qual pai vem
  • Crossover aritmético: Média ponderada dos genes (para valores contínuos)

5. Mutação

Com pequena probabilidade (tipicamente 1-5%), altere aleatoriamente alguns genes dos filhos. A mutação introduz novidade no pool genético, prevenindo convergência prematura para ótimos locais.

Tipos de mutação:

  • Flip de bit: Para genes binários, inverte 0↔1
  • Perturbação gaussiana: Para genes contínuos, adiciona ruído gaussiano
  • Troca (swap): Para permutações, troca dois elementos de posição

6. Substituição

Substitua a população antiga pelos novos filhos. Estratégias:

  • Geracional: Toda a população é substituída
  • Steady-state: Apenas alguns indivíduos piores são substituídos
  • Elitismo: Os N melhores pais sempre sobrevivem intactos (recomendado!)

7. Repetir

Volte ao passo 2 e repita por G gerações ou até atingir um critério de parada (fitness mínimo, convergência, tempo limite).

Num problema típico, você pode rodar 100 a 1000 gerações. Cada geração melhora incrementalmente sobre a anterior — é evolução acelerada em fast-forward.

Os cinco componentes fundamentais

Todo algoritmo genético precisa de cinco componentes bem definidos. O sucesso ou falha do algoritmo depende crucialmente de como você projeta cada um:

1. Representação (Encoding)

Como codificar uma solução em genes? Escolhas comuns:

  • Binária: Genes são bits (0/1). Simples, mas limita precisão.
  • Inteira: Genes são números inteiros. Boa para problemas discretos.
  • Real: Genes são floats. Ideal para otimização contínua.
  • Permutação: Genes são ordenações. Usado em roteamento (TSP, VRP).
  • Árvore: Genes são programas (Programação Genética).

Regra de ouro: A representação deve tornar soluções válidas fáceis de gerar e manipular. Evite encodings que criam soluções inválidas frequentemente.

2. Função de Fitness

A função que julga soluções. Deve ser:

  • Rápida de calcular: Será chamada milhões de vezes
  • Contínua: Pequenas mudanças no genoma causam pequenas mudanças no fitness (idealmente)
  • Diferenciadora: Soluções boas têm fitness significativamente maior que ruins
  • Sem platôs: Evite regiões onde muitas soluções diferentes têm exatamente o mesmo fitness

Cuidado: Fitness mal projetada leva a "overfitting evolutivo" — soluções que "trapaceiam" otimizando métricas sem resolver o problema real.

3. Operador de Seleção

Como escolher pais. Trade-off:

  • Pressão seletiva alta: Apenas os melhores reproduzem → convergência rápida, mas risco de ótimo local
  • Pressão seletiva baixa: Todos têm chance similar → exploração ampla, mas convergência lenta

Recomendação: Seleção por torneio com tamanho 3-5 balanceia bem exploração vs. explotação.

4. Operador de Crossover

Como combinar pais. Princípio: características boas de pais diferentes devem poder se combinar nos filhos.

Taxa de crossover típica: 70-90% dos casais geram filhos por crossover. Os outros 10-30% são cópias diretas dos pais (clones).

5. Operador de Mutação

Como introduzir aleatoriedade. Princípio: mutação deve ser rara mas consequente.

Taxa de mutação típica: 1-5% por gene. Se muito alta, vira busca aleatória. Se muito baixa, perde diversidade.

Dica avançada: Use mutação adaptativa — comece com 5% e reduza para 1% conforme converge. Isso equilibra exploração inicial com refinamento final.

Exemplo prático: ensinando foguetes a pousar

Vamos ver um algoritmo genético em ação resolvendo um problema real: ensinar um foguete a pousar verticalmente em um porta-aviões flutuante, sem programar regras de controle.

Este é o mesmo desafio que SpaceX e Blue Origin enfrentam ao recuperar foguetes reutilizáveis — um problema de controle extremamente difícil com múltiplas variáveis interdependentes.

O Problema

Um foguete começa no topo da tela, caindo sob gravidade. Ele pode:

  • Ativar propulsão (0% a 100%)
  • Rotacionar (torque de -1 a +1)

Sensores do foguete detectam:

  • Altitude: Quão alto está (0 = chão)
  • Velocidade vertical: Quão rápido está caindo
  • Velocidade horizontal: Deriva lateral
  • Ângulo: Inclinação do foguete (0 = vertical)
  • Velocidade angular: Quão rápido está girando
  • Distância horizontal da base: Desalinhamento lateral
  • Vento lateral: Força externa empurrando o foguete

Objetivo: Pousar na base com velocidade vertical < 1.5, ângulo < 20°, e velocidade horizontal < 2.5. Critérios muito estreitos!

A Solução: Rede Neural + Algoritmo Genético

Cada foguete tem um "cérebro" — uma rede neural simples:

  • Entrada: 7 sensores (normalizados entre -1 e 1)
  • Camada oculta: 10 neurônios com ativação tanh
  • Saída: 2 ações (propulsão e torque)

O genoma de cada foguete é o conjunto de pesos dessa rede neural. Com 7 inputs, 10 hidden e 2 outputs, temos:

  • Pesos input→hidden: 7 × 10 = 70
  • Biases hidden: 10
  • Pesos hidden→output: 10 × 2 = 20
  • Biases output: 2
  • Total: 102 genes

Inicialmente, esses 102 números são aleatórios. Os foguetes crasham espetacularmente.

Função de Fitness

Após 500 passos de simulação (ou até crash/pouso), calculamos fitness:

Se pousou com sucesso:

  • Base: 10.000 pontos
  • Bônus por velocidade (pousou rápido na geração): +3.000
  • Bônus por ângulo perfeito: +2.000
  • Bônus por velocidade vertical suave: +1.000
  • Fitness total pode chegar a 16.000+

Se não pousou:

  • Fitness baseado em proximidade: 5000 / (distância_da_base + 1)
  • Bônus por estar baixo (perto do chão)
  • Bônus por estar horizontalmente alinhado
  • Penalidade por velocidade excessiva (-30%)
  • Penalidade por ângulo ruim (-30%)
  • Penalidade extra se crashou (-50%)

Essa função de fitness recompensa progressão — um foguete que chega perto mas crasha tem fitness maior que um que sai voando descontrolado.

Evolução em Ação

Geração 1: População de 300 foguetes com pesos aleatórios. Caos total. Aproximadamente 0% de sucesso. A maioria voa para fora da tela ou crasha violentamente. O melhor consegue apenas se aproximar da base.

Geração 5: Alguns foguetes descobrem que ativar propulsão desacelera a queda. Começam a usar propulsão perto do chão. Fitness médio sobe de ~200 para ~800. Ainda 0% de pousos bem-sucedidos.

Geração 15: Emergem estratégias primitivas: "propulsão quando altitude baixa" e "corrigir ângulo quando inclinado". Alguns foguetes batem na base suavemente, mas fora de ângulo. Taxa de sucesso: ~2%.

Geração 30: Coordenação entre propulsão e rotação melhora. Foguetes começam a se alinhar verticalmente antes de tocar o chão. Taxa de sucesso: ~15%.

Geração 50: Estratégias sofisticadas: "contrabalançar vento", "aproximar lateralmente se desalinhado", "desacelerar suavemente nos últimos metros". Taxa de sucesso: ~60%.

Geração 100: Pousos consistentes mesmo com vento forte e base em posições variadas. Taxa de sucesso: ~85-95%. O algoritmo "aprendeu" controle de foguete sem uma única linha de código de regras.

O que Torna Isso Possível

Quatro mecanismos evolutivos trabalhando juntos:

  1. Variação: Mutação (5%) cria foguetes com comportamentos ligeiramente diferentes
  2. Seleção: Foguetes que pousam melhor têm mais "filhos"
  3. Herança: Filhos herdam pesos dos pais via crossover
  4. Acumulação: Cada geração parte do melhor da anterior, sem recomeçar do zero

Após 100 gerações (o que leva ~5 minutos num PC comum), você pode exportar o genoma do melhor foguete e testá-lo em condições extremas — vento de 8 m/s, base a 90% da tela, gravidade aumentada. Ele ainda consegue pousar, porque generalizou a partir da diversidade de treino.

Aplicações no mundo real

Algoritmos genéticos estão por trás de soluções que você usa todos os dias, mesmo sem saber:

1. Logística e Transporte

  • UPS e FedEx: Otimização de rotas de entrega (problema do caixeiro viajante com restrições reais)
  • Uber: Alocação dinâmica de motoristas a passageiros
  • Amazon: Posicionamento de produtos em armazéns para minimizar tempo de coleta
  • Companhias aéreas: Scheduling de tripulações e aeronaves

2. Design e Engenharia

  • Airbus A380: Design evolutivo das asas (formato, perfil aerodinâmico)
  • General Electric: Otimização de turbinas a jato (geometria de pás, ângulos)
  • Tesla: Otimização de gerenciamento térmico de baterias
  • Arquitetura: Layout de edifícios maximizando luz natural e eficiência energética

3. Finanças

  • Hedge funds: Otimização de portfólios balanceando retorno vs. risco (fronteira de Pareto)
  • Trading algorítmico: Evolução de estratégias de compra/venda
  • Seguros: Precificação de apólices baseada em milhares de variáveis

4. Jogos e Entretenimento

  • OpenAI Five (Dota 2): Componente evolutivo nas estratégias iniciais
  • Criaturas evolutivas: Jogos como Spore e procedural generation em No Man's Sky
  • NPCs adaptativos: Inimigos que evoluem baseado em como você joga

5. Medicina e Biotecnologia

  • Design de medicamentos: Otimização de moléculas para se ligarem a proteínas-alvo
  • Radioterapia: Planejamento de ângulos e intensidades de radiação para minimizar dano a tecidos saudáveis
  • Análise de genoma: Identificação de padrões em sequências de DNA

6. Energia e Sustentabilidade

  • Smart grids: Balanceamento de carga em redes elétricas
  • Parques eólicos: Posicionamento de turbinas para maximizar captura de vento minimizando interferência
  • Painéis solares: Ângulos e orientações ótimas de instalação

Em 2025, estima-se que mais de 40% das empresas Fortune 500 usam alguma forma de algoritmo evolutivo em suas operações — seja diretamente ou através de software de terceiros.

Vantagens e limitações

Quando Usar Algoritmos Genéticos

Algoritmos genéticos brilham quando:

  • Não há gradiente: Função objetivo não é diferenciável ou tem descontinuidades
  • Múltiplos ótimos locais: Landscape de otimização é rugoso, com muitos picos e vales
  • Espaço de busca enorme: Testar todas as combinações é impossível
  • Restrições complexas: Soluções válidas são difíceis de gerar, mas fáceis de verificar
  • Busca multi-objetivo: Otimizar várias métricas simultaneamente (Pareto)
  • Robustez importa: Você quer soluções que funcionem bem em condições variadas

Quando NÃO Usar

Evite algoritmos genéticos se:

  • Função tem gradiente suave: Use gradiente descendente, BFGS ou Adam — são 10-100× mais rápidos
  • Problema é convexo: Métodos convexos garantem ótimo global
  • Recursos computacionais são limitados: GAs requerem milhares de avaliações de fitness
  • Solução ótima é necessária: GAs não garantem encontrar o ótimo global
  • Função de fitness é cara: Se cada avaliação demora horas (simulações físicas pesadas), GAs podem ser inviáveis

Vantagens Principais

Vantagem Por quê
Paralelizável Cada indivíduo pode ser avaliado independentemente — ideal para GPUs/clusters
Global search População explora várias regiões simultaneamente, escapando ótimos locais
Black-box Não precisa conhecer a estrutura interna da função — só entrada e saída
Robusto a ruído Avaliações estocásticas não destroem o algoritmo
Flexível Aplica-se a qualquer representação (binária, contínua, permutação, árvore)

Limitações e Desafios

Limitação Mitigação
Convergência prematura Use mutação adaptativa, seleção diversificada, niching
Computacionalmente caro Paralelização, GPUs, fitness aproximada (surrogate models)
Muitos hiperparâmetros Meta-GAs (usar GA para otimizar parâmetros do GA), valores padrão da literatura
Sem garantia de ótimo Combine com busca local (memetic algorithms) ou use como inicialização para métodos exatos
Difícil analisar teoricamente Use ferramentas empíricas: visualização de fitness landscape, análise de diversidade genética

Uma regra prática útil: se você pode escrever a derivada da sua função objetivo à mão, provavelmente não precisa de GA. Se a função envolve simulação, lógica condicional complexa, ou você nem sabe bem o que está otimizando — GA é uma ótima escolha.

Perguntas Frequentes

O que são algoritmos genéticos?

Algoritmos genéticos são técnicas de otimização inspiradas na evolução natural. Eles criam uma população de soluções candidatas, avaliam cada uma com uma função de fitness, selecionam as melhores, combinam-nas (crossover) e aplicam mutações aleatórias. Esse ciclo se repete por gerações até encontrar soluções ótimas ou quase-ótimas.

Como algoritmos genéticos diferem de redes neurais?

Algoritmos genéticos são métodos de otimização que podem treinar redes neurais, mas não são redes neurais em si. Enquanto redes neurais aprendem ajustando pesos através de gradiente descendente, algoritmos genéticos exploram o espaço de soluções através de evolução simulada: seleção, crossover e mutação.

Quais problemas algoritmos genéticos resolvem melhor?

Algoritmos genéticos são excelentes para problemas de otimização complexos onde: não há gradiente calculável, o espaço de busca é muito grande, existem múltiplos ótimos locais, ou a função objetivo é ruidosa. Exemplos incluem design de aeronaves, roteamento de veículos, otimização de portfólios financeiros e controle robótico.

O que é a função de fitness em algoritmos genéticos?

A função de fitness avalia quão boa é cada solução candidata. No exemplo do foguete, a fitness recompensa pousos bem-sucedidos com 10.000+ pontos, bonifica velocidade suave e ângulo correto, e penaliza distância da base e crashes. Indivíduos com maior fitness têm mais chance de reproduzir.

Qual a diferença entre mutação e crossover?

Crossover combina genes de dois pais para criar filhos, explorando combinações de características boas. Mutação altera genes aleatoriamente, introduzindo novidade e evitando convergência prematura. Crossover explora soluções conhecidas; mutação explora território inexplorado. Ambos são essenciais para o equilíbrio entre exploração e explotação.

Algoritmos genéticos podem resolver qualquer problema?

Não. Algoritmos genéticos não garantem encontrar a solução ótima global, apenas boas aproximações. São computacionalmente caros para populações grandes. Requerem uma função de fitness bem projetada. Para problemas com gradientes bem definidos, métodos como gradiente descendente são mais eficientes. Use algoritmos genéticos quando outros métodos falham.

O que é elitismo em algoritmos genéticos?

Elitismo garante que os melhores indivíduos de uma geração passem intactos para a próxima, sem crossover ou mutação. Tipicamente 5-10% da população. Isso previne perda de soluções excelentes por azar durante reprodução, acelera convergência e estabiliza o progresso do algoritmo.