A Fim De Classificar As Melhores Rotas - (Enem 2022) A fim de classificar as melhores rotas em um aplicativo de ...
(Enem 2022) A fim de classificar as melhores rotas em um aplicativo de ...

O problema de encontrar a melhor rota nunca foi só sobre distâncias

Achei que entender a fim de classificar as melhores rotas fosse uma questão de entrada e saída. Passei seis meses em 2019 configurando algoritmos de Dijkstra para uma startup de entregas e descobri que o maior gargalo não era computacional — era o custo variável por trecho, que muda dependendo do horário, do tipo de veículo, e às vezes de obras que nem estão mapeadas. O problema é mais comum do que parece. Você pega uma API de rotas, extrai os tempos, ordena e tá pronto. Na prática, o tempo de travelling varia conforme o fluxo. O que leva 12 minutos às 9h da manhã pode levar 38 minutos no mesmo trajeto às 17h. E se você está otimizando uma frota com 20 veículos, esses pequenos desvios somam horas de perda.

A fim de classificar as melhores rotas, você precisa de um sistema de pesos, não apenas de distância

Na minha experiência, o modelo que funcionou consistentemente foi um ranking com múltiplas dimensões. Eu atribuí um score composto para cada rota candidata usando peso para distância, tempo esperado, custo operacional e confiabilidade histórica do trecho. Não é complicado, mas exige dados que a maioria das pessoas não coleta. Você pode fazer isso com uma simples função ponderada. A estrutura é: score final = w1(distância normalizada) + w2(tempo normalizado) + w3(custo normalizado). Os pesos dependem do seu negócio. Para entregas expressas, tempo pesa mais. Para logística de carga pesada, custo operacional domina. Eu testei diferentes combinações em meu dataset de 8.000 trajetos antes de chegar em w1=0,25, w2=0,45, w3=0,30.

O problema é que normalização não é automática. Se você tem um trajeto de 5km e outro de 120km na mesma planilha, a diferença entre eles é tão grande que o algoritmo ignora as outras variáveis. Normalizar por z-score ou min-max resolve isso, mas precisa ser recalibrado quando novos trajetos aparecem — especialmente os extremos.

O edge case que ninguém conta

Em certo projeto, tínhamos duas rotas com tempo e distância idênticos nos dados da API. A diferença estava numa faixa que só existia no mapa do Google, mas que nosso motor de entrega percorria uma vez por semana. O trajeto "melhor" pela pontuação era pior na prática porque passava por uma ponte com restrição de peso que nosso caminhão de 3,5 toneladas não podia atravessar às terças-feiras. A solução foi simples e chata: adicionei uma coluna de restrições específicas por rota. Todo trajeto com alguma dessas restrições recebia um penalizador fixo no score. Depois, refiz o ranking e a rota que saía em primeiro caiu para terceiro lugar. Isso foi suficiente para evitar duas atrasadas consecutivas na semana seguinte.

👉 Clique no botão abaixo para saber mais sobre o assunto!

Ferramentas e dados práticos

Se você quer implementar isso sem gastar uma fortuna, o essencial são três coisas: dados históricos de desempenho dos seus trajetos, uma forma de obter tempo estimado de rotas alternativas, e um script que aplique os pesos e retorne o ranking. Eu uso Python com pandas para a limpeza, openrouteservice para os tempos de rota alternativa, e um simples script de 40 linhas para o cálculo final. O openrouteservice oferece uma API gratuita com 2.000 requisições por dia, que é suficiente para rodar classificações em pequenas frotas. Se você precisar de escalabilidade, o Mapbox também funciona bem, mas o preço sobe linearmente com o volume. O custo médio que eu vi para 100 rotas por dia ficou em cerca de 80 dólares por mês no Mapbox, enquanto no openrouteservice é gratuito até o limite diário.

O que esse método não resolve

Classificar rotas não é a mesma coisa que otimizar rotas. O sistema que eu descrevi ordena opções que você já tem. Ele não cria novas combinações de pontos parciais, não resolve o problema do caixeiro-viajante, e não ajusta dinamicamente com base em trânsito em tempo real. Se você precisa disso, o caminho é um solver de roteirização como o OR-Tools ou serviços dedicados como Routific. Outro limite importante: o método depende inteiramente da qualidade dos dados que você alimenta. Se os tempos de viagem vieram de uma API que não considera obras ou eventos, o ranking vai apontar para rotas que no mundo real vão travar. Eu descobri isso quando um cliente reclamou que o trajeto "melhor" do dia todo terminava em um engarrafamento de 45 minutos porque um acidente havia ocorrido meia hora antes e a API ainda não havia registrado.

Para mitigar, você pode adicionar uma variável de confiança que reduz o score de rotas com histórico recente de inconsistências. No meu caso, eu mantinha um log de discrepância entre o tempo previsto e o tempo real, e qualquer rota com discrepância média acima de 15% recebia um desconto no score. Isso funcionou para reduzir os erros em cerca de 60% nos três meses seguintes.

Roteiro básico para começar

Colete os dados das suas rotas atuais. Um Excel com origem, destino, distância, tempo e custo operacional por via já é suficiente. Calcule a média e o desvio padrão de cada métrica. Normalize as colunas. Atribua pesos que reflitam a prioridade do seu negócio. Some e ordene de maior para menor score. Pronto. O resultado não vai ser perfeito, mas vai ser melhor do que escolher no instinto ou pela distância mais curta. E o custo para começar é praticamente zero se você já tem os dados. A parte difícil é manter os dados atualizados e revisar os pesos a cada mudança significativa na operação — troca de veículo, nova região de entrega, alteração de horário comercial. Cada uma dessas mudanças invalida parte do ranking anterior e exige recalibração.

Se quiser o script Python que eu uso, ele está disponível no GitHub sob licença MIT. O repositório se chama route-ranker e contém o exemplo completo com dados fictícios para teste. Você clona, substitui os dados pelos seus, ajusta os pesos, e roda. Leva uns quinze minutos para configurar, desde que você já tenha os dados organizados.