Na computação evolutiva,a diversidadeé o pré-requisito para a eficácia do algoritmo: somente mantendo um número suficiente de soluções candidatas é que a pressão seletiva não comprime prematuramente a população em um ótimo local. Mas a diversidade também implica um volume computacional enorme — uma única execução frequentemente exige avaliar dezenas de milhares a milhões de soluções candidatas. Quando os candidatos são escritos como um array comum de objetos e enviados um a um para avaliação por meio de laços item a item, a maior parte do tempo de computação é consumida pelo agendamento item a item e pelo fluxo de controle da linguagem hospedeira, em vez do verdadeiro cálculo numérico. É justamente essaineficiência dos laços seriais tradicionais de CPU ao lidar com dezenas de milhares de avaliações de candidatosa causa fundamental.
O salto na forma de expressão: da lista de candidatos ao grafo computacional tensorizado
A mudança trazida pelo EvoX não é a aceleração local de um operador específico, mas simuma mudança na forma de expressar o processo evolutivo: passar do processamento em lista, candidato por candidato, para a computação em lote com tensores como cidadãos de primeira classe. O conjunto de candidatos não fica mais disperso em arrays de objetos; em vez disso, é organizado de forma unificada como tensores, junto com os resultados de avaliação e o estado do algoritmo, permitindo que participem das operações de forma integral.
- Tensor de candidatos: escrever toda a geração de candidatos como um tensor de forma [tamanho da população, dimensão da solução]. Nesse caso, "um candidato" é apenas uma linha do tensor, e não mais um objeto independente da linguagem hospedeira.
- Operadores em lote: operações como a mutação atuam diretamente sobre toda a população; uma única chamada conclui a atualização de todos os candidatos, em vez de chamar em laço N vezes.
- Avaliação em lote: obter de uma só vez os resultados de avaliação de toda a geração na forma evaluate(tensor de candidatos); a unidade de contagem das avaliações passa de "indivíduo" para "lote".
- Grafo computacional: a seleção e a atualização de estado deixam de ser apenas lógica de controle serial e passam a ser nós do grafo, ganhando assim oportunidades de otimização de compilação, como fusão de operadores e agendamento paralelo.
Comparação entre as duas formas de escrita
A escrita em lista é aproximadamente: extrair cada candidato, avaliar cada um, comparar cada um e atualizar o estado — cada etapa depende dos laços da linguagem hospedeira, sendo difícil otimizar de forma integral. Já a escrita tensorizada é: tensor de candidatos → mutação → avaliação → seleção → atualização de estado; toda a cadeia é composta por operações de tensores e expressa como um grafo computacional, e o compilador pode realizar fusão e agendamento de dispositivos sobre o grafo inteiro. Atenção: a lógica do algoritmo (distribuição de mutação, pressão seletiva) não foi reescrita; o que foi reescrito é aforma de expressão.
