Automatos Finitos Evolutivos

Professora

O que são autômatos finitos evolutivos?

Autômatos finitos evolutivos (AFE) são máquinas de estados que aprendem por evolução artificial. Cada indivíduo é um autômato finito determinístico (AFD) com estados, transições e saídas. A evolução altera o número de estados, as transições ou os símbolos de saída. Diferentemente de redes neurais, eles são discretos, interpretáveis e leves. A aptidão mede o quão bem o autômato resolve uma tarefa sequencial. Por exemplo, ele pode prever o próximo elemento de uma série temporal. Ou pode classificar padrões binários que chegam ao longo do tempo. A programação evolutiva foi originalmente criada para evoluir esses autômatos. Portanto, os AFE são a aplicação clássica da programação evolutiva.

Como funciona a evolução de um autômato?

Inicialmente, uma população de autômatos aleatórios é gerada. Cada um tem um número fixo de estados (ex.: 5) e alfabeto de entrada. As transições são tabelas que mapeiam (estado, símbolo) para próximo estado. Cada estado também possui uma saída (ex.: 0 ou 1 para classificação). A mutação pode alterar uma transição, uma saída ou adicionar/remover estados. O crossover pode trocar sub-tabelas de transição entre dois autômatos. A avaliação percorre o autômato com uma sequência de entrada conhecida. A saída gerada é comparada com a saída desejada (supervisionado). A aptidão é a acurácia ou o erro acumulado ao longo da sequência. Os melhores autômatos são selecionados para a próxima geração.

Aplicações e vantagens práticas

AFE são usados em reconhecimento de padrões temporais e linguagens regulares. Eles também são aplicados em controle de robôs com sensores discretos. Uma grande vantagem é a total interpretabilidade do comportamento aprendido. O engenheiro pode inspecionar estados e transições para entender a decisão. Além disso, eles exigem pouca memória e executam em tempo real. Contudo, eles não lidam bem com entradas contínuas ou ruidosas. Para esses casos, pré-processamento ou fuzzificação é necessário. Ainda assim, os AFE são uma ferramenta didática e poderosa.

Os autômatos finitos evolutivos foram popularizados por Fogel no final dos anos 1960. Ele usou AFE para prever o comportamento de sinais de radar e econômicos. Cada autômato previa o próximo bit de uma sequência binária. A aptidão era a porcentagem de acertos ao longo de todo o histórico. A mutação podia trocar uma transição ou inverter a saída de um estado. Não havia crossover na versão original, apenas mutação pura. Com o tempo, variantes com crossover e auto-adaptação surgiram. Hoje, os AFE são usados em jogos, segurança e bioinformática. Por exemplo, eles podem detectar anomalias em tráfego de rede. Também podem modelar o comportamento de usuários em sistemas interativos. Sua simplicidade os torna ideais para dispositivos embarcados. Eles são frequentemente comparados a redes neurais recorrentes discretizadas. A principal diferença é a ausência de pesos contínuos. Assim, os AFE oferecem um equilíbrio entre expressividade e clareza.

Um exemplo clássico é o problema de previsão do próximo símbolo em uma sequência. Dada uma sequência binária gerada por uma máquina de estados oculta. O AFE deve inferir a regra subjacente sem conhecer a máquina original. Por exemplo, a sequência alterna entre 0 e 1 após cada dois dígitos. O autômato evolui sua tabela de transições até acertar a previsão. Esse problema é simples, mas ilustra perfeitamente o mecanismo de aprendizado.


Enunciado do exemplo clássico

Evolua um autômato finito determinístico com 4 estados para prever o próximo bit da sequência de Fibonacci binária (módulo 2). A sequência é: 0,1,1,0,1,1,0,1,1,… (período 3: 0,1,1 repetido). Use 100 exemplos de treinamento (bits) e 50 de teste (após o treino). População de 50 autômatos, mutação de transição (10%) e saída (5%) por geração. Execute 100 gerações, com seleção por torneio de tamanho 3. Plote a acurácia de treino e teste ao longo das gerações. Plote também um diagrama do melhor autômato encontrado (texto).

Este código evolui um AFD para prever a sequência de Fibonacci binária. A curva de acurácia mostra a melhoria tanto em treino quanto em teste. O diagrama textual exibe as transições e saídas do melhor autômato. Observe que o autômato converge para o período 3 (0,1,1) após algumas gerações. A interpretabilidade é total: cada estado e transição podem ser lidos. Para iniciantes, este exemplo conecta evolução, autômatos e previsão. Os autômatos finitos evolutivos são, portanto, uma ferramenta educativa e prática.

Programação Evolutiva

Professora

O que é programação evolutiva?

Programação evolutiva (PE) é uma técnica de computação inspirada na evolução natural. Diferentemente dos algoritmos genéticos, ela enfatiza mutação em vez de crossover. Cada indivíduo é uma estrutura que representa um programa ou uma máquina de estados. Originalmente, ela evoluía autômatos finitos para prever sequências temporais. Hoje, a PE é aplicada a problemas de otimização contínua e discreta. A aptidão é medida pelo desempenho do indivíduo em uma tarefa específica. Os melhores indivíduos são selecionados para produzir filhos por mutação. Não há recombinação genética na forma clássica da PE. Portanto, a diversidade é mantida exclusivamente por variações mutacionais. Ela é considerada uma das abordagens evolutivas mais antigas.

Mecanismos centrais de funcionamento

A PE opera com uma população de tamanho fixo, geralmente entre 50 e 200. Cada indivíduo sofre mutação gaussiana ou cauchy em seus parâmetros. A intensidade da mutação pode ser fixa ou auto-adaptativa, como nas ES. Após a mutação, todos os filhos são avaliados pela função de aptidão. A seleção é feita por torneio estocástico ou por truncamento (μ,λ). Os indivíduos sobreviventes formam a próxima geração. Esse ciclo se repete até que um critério de parada seja satisfeito. A PE é particularmente eficaz para funções com muitas variáveis. Além disso, ela lida bem com ruído e incertezas nos dados.

Diferenças e aplicações práticas

A grande diferença da PE para os algoritmos genéticos é a ausência de crossover. Isso a torna mais simples de implementar e ajustar. Por outro lado, ela pode convergir mais lentamente em paisagens complexas. A PE é amplamente usada em previsão de séries temporais e finanças. Também é aplicada em controle de processos industriais e robótica. Sua capacidade de evoluir estratégias de tomada de decisão é notável. Para iniciantes, a PE oferece um ponto de entrada suave na computação evolutiva.

A programação evolutiva foi proposta por Lawrence Fogel nos anos 1960. Ele utilizou autômatos finitos para prever eventos em ambientes incertos. Cada autômato era uma sequência de estados e transições mutáveis. A aptidão media a precisão da previsão ao longo do tempo. Com o tempo, a PE foi generalizada para vetores numéricos reais. Atualmente, ela é frequentemente confundida com estratégias evolutivas. Contudo, a PE mantém sua identidade pela ênfase na mutação pura. Muitos pesquisadores a usam para problemas onde o crossover é prejudicial. Por exemplo, em otimização de redes neurais recorrentes. A mutação pode alterar pesos, arquitetura ou funções de ativação. A PE também é usada para gerar regras fuzzy automaticamente. Sua flexibilidade permite incorporar conhecimentos específicos do domínio. Ela é uma ferramenta valiosa para problemas mal definidos. Assim, a PE complementa outras técnicas evolutivas no arsenal do cientista.

Um exemplo clássico é evoluir um controlador para o problema do pêndulo invertido. O objetivo é manter a haste na vertical aplicando forças laterais. Cada indivíduo é um vetor de parâmetros de um controlador PID. A aptidão é o tempo que o pêndulo permanece equilibrado. A mutação ajusta os ganhos proporcional, integral e derivativo. Após algumas gerações, a PE encontra um conjunto estável de parâmetros. Esse problema ilustra a capacidade de otimização contínua da PE.


Enunciado do exemplo clássico

Utilize programação evolutiva para minimizar a função de Schwefel em 5 dimensões: f(x) = 418.9829*5 – Σᵢ xᵢ * sin(√|xᵢ|), com xᵢ ∈ [-500, 500]. O mínimo global é em xᵢ = 420.9687 para todo i, com f ≈ 0. Use população de 100 indivíduos, mutação gaussiana com sigma=15, auto-adaptação. Seleção por torneio estocástico de tamanho 2, com 80% de chance de vencer. Execute 300 gerações e armazene o melhor fitness por geração. Plote a curva de convergência e a distribuição final dos parâmetros.

Este código implementa a PE clássica com mutação auto-adaptativa. A curva de convergência mostra a redução do erro ao longo do tempo. O gráfico de violino revela a dispersão dos parâmetros na última geração. Observa-se que a maioria dos indivíduos se aproxima do ótimo teórico. A ausência de crossover é compensada pela diversidade da mutação. Para iniciantes, este exemplo demonstra a eficácia da PE pura. A programação evolutiva é, portanto, uma alternativa simples e poderosa.