A New Approach to Characterising Optimisation Problems Using Programmatic Representation and Complexity Measures
Este artigo propõe uma abordagem inovadora para caracterizar problemas de otimização através do cálculo do volume de Halstead e da entropia de suas implementações programáticas, demonstrando que essas medidas de complexidade baseadas em código servem como meta-características preditivas eficazes e livres de amostragem para a seleção de algoritmos.
Artigo original sob licença CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/). Esta é uma explicação gerada por IA do artigo abaixo. Não foi escrita nem endossada pelos autores. Para precisão técnica, consulte o artigo original. Ler aviso legal completo
Imagine que você está tentando ensinar um robô a resolver um labirinto. Às vezes o labirinto é um corredor simples e reto; outras vezes é um labirinto sinuoso e retorcido, com becos sem saída e armadilhas. No mundo da ciência da computação, isso é chamado de otimização: encontrar a melhor solução possível para um problema. Mas aqui está a parte difícil: nem todos os labirintos são iguais. Alguns são fáceis de serem resolvidos por um robô, enquanto outros fazem até os algoritmos mais inteligentes se perderem.
Para ajudar os robôs a escolherem a estratégia certa, os cientistas tentam "caracterizar" ou descrever esses labirintos antes mesmo de o robô começar a correr. Eles procuram por pistas, como o quão acidentado é o terreno ou quantos becos sem saída existem. Geralmente, para encontrar essas pistas, o robô precisa dar alguns passos, olhar ao redor e medir o terreno. Isso é como enviar um batedor para a escuridão para mapear a caverna. Mas e se o robô pudesse apenas olhar para a planta baixa do labirinto e adivinhar o quão difícil seria resolvê-lo, sem nunca colocar os pés dentro dele? Essa é a grande questão que este artigo levanta. Ele sugere que a maneira como um problema é escrito em código de computador pode conter o segredo de quão difícil ele é de resolver, assim como a complexidade de uma receita pode sugerir o quão difícil será o cozimento.
O Código como uma Bola de Cristal
Neste artigo, Marcus Gallagher e Katherine Malan propõem uma forma nova e ligeiramente mágica de olhar para esses problemas difíceis. Em vez de enviar um batedor para medir a paisagem, eles sugerem que apenas leamos a "receita" que o computador usa para criar o problema.
Pense em um problema de otimização como um nível de videogame. Para construir o nível, um programador escreve o código. Alguns níveis são simples: "Mova para frente, pule sobre um buraco, colete a moeda". O código para isso é curto e usa comandos básicos. Outros níveis são caóticos: "Se o céu estiver azul, multiplique sua velocidade pelo número de estrelas, depois subtraia a raiz quadrada da sua vida, mas apenas se você estiver usando um chapéu". O código para isso é longo, bagunçado e usa uma enorme variedade de comandos.
A grande ideia dos autores é esta: Quanto mais bagunçado e complexo for o código, mais difícil será o problema para um algoritmo resolver.
Eles pegaram emprestadas duas ferramentas do mundo da engenharia de software para medir essa "bagunça".
- Volume de Halstead: Imagine contar cada palavra e símbolo em um parágrafo. Se você tem um conto curto com palavras simples, a contagem é baixa. Se você tem um romance com vocabulário complexo e frases longas, a contagem é alta. Esta medida conta os "operadores" (como símbolos matemáticos) e "operandos" (como números e variáveis) no código.
- Entropia de Shannon: Isto é um pouco como medir o fator surpresa. Se um parágrafo usa as mesmas cinco palavras repetidamente, é previsível (baixa entropia). Se utiliza uma enorme variedade de palavras únicas em uma ordem aleatória, é imprevisível (alta entropia).
O Experimento: De Círculos Simples a Picos Caóticos
Para testar sua teoria, os autores utilizaram um conjunto famoso de 24 problemas de teste usados por cientistas em todo o mundo (conhecido como suíte BBOB). Eles variam desde a função "Esfera" (uma colina perfeitamente lisa e arredondada que é fácil de descer rolando) até a função "Lunacek bi-Rastrigin" (uma paisagem irregular e rochosa com milhares de pequenos picos e vales).
Eles escreveram o código do computador para cada um desses 24 problemas e rodaram seus calculadores de "bagunça" neles. Os resultados foram exatamente o que esperavam:
- A função Esfera, simples e suave, teve as pontuações de complexidade mais baixas.
- A função Lunacek, irregular e difícil, teve as pontuações de complexidade mais altas.
- De fato, a função Lunacek era cerca de 9,3 vezes mais complexa em sua estrutura de código do que a função Esfera.
Eles até testaram isso em um tipo diferente de problema: o treinamento de uma rede neural (um tipo de cérebro de IA). Descobriram que o código para uma rede que usa uma função de ativação "Tanh" era ligeiramente mais complexo do que um usando "ReLU", e isso coincidia com a ideia de que a versão Tanh é um quebra-cabeça um pouco mais difícil de resolver.
A Conexão Mágica: A Complexidade do Código Prediz o Desempenho
A verdadeira magia acontece quando eles comparam esses scores de código com o quão bem diferentes algoritmos realmente performaram. Eles analisaram dados de cinco algoritmos "robôs" diferentes tentando resolver esses 24 problemas.
Eles encontraram um padrão claro: Quanto mais complexo o código, pior foi o desempenho dos robôs.
É uma relação negativa. Quando o código era simples (baixo volume de Halstead), os robôs resolviam o problema de forma rápida e fácil. Quando o código era complexo (alto volume de Halstead), os robôs tinham dificuldades, levavam mais tempo ou ficavam presos. Por exemplo, em problemas de 5 dimensões, a conexão entre a complexidade do código e o mau desempenho foi bastante forte.
No entanto, os autores são cuidadosos ao notar que isso não é uma bola de cristal perfeita. Houve alguns problemas "outliers" (fora da curva) onde o código era muito complexo, mas os robôs não performaram tão mal quanto o código sugeria. Isso sugere que, embora a complexidade do código seja uma ótima dica, não é a única coisa que importa.
Por Que Isso Importa
A beleza desta abordagem é que ela é incrivelmente rápida e não requer trabalho extra. Os métodos tradicionais para entender um problema geralmente envolvem rodar o algoritmo milhares de vezes apenas para ver como é a paisagem. Isso é como enviar um batedor para percorrer todo o labirinto apenas para desenhar um mapa.
Em contraste, o método dos autores é como olhar para a planta baixa do labirinto. Você pode calcular a complexidade do código em uma fração de segundo, sem rodar o problema uma única vez. Não importa o tamanho do problema ou quantas dimensões ele possui; o método apenas olha para a estrutura das instruções.
Os autores sugerem que esta nova medida de "complexidade de código" pode ser uma adição útil à caixa de ferramentas dos cientistas que projetam algoritmos. Ela não substitui as velhas formas de olhar para os problemas, mas adiciona uma nova forma super rápida de adivinhar o quão difícil um problema será antes mesmo de começar a resolvê-lo. É um passo promissor para ajudar os computadores a escolherem a ferramenta certa para o trabalho, simplesmente lendo as instruções.
Afogado em artigos na sua área?
Receba digests diários dos artigos mais recentes que correspondam às suas palavras-chave de pesquisa — com resumos técnicos, no seu idioma.