O problema do Caixeiro-Viajante em Excel

Arnaldo Gunzi
4 min readDec 5, 2023

--

Imagine que você é um vendedor que precisa passar por vários clientes em diferentes cidades. Você tem um mapa que mostra as cidades e as distâncias entre elas. Você quer visitar todas as cidades, visitar os clientes e voltar para casa no menor tempo possível. Mas você não sabe qual é a melhor ordem para visitar as cidades, porque existem muitas possibilidades.

Por exemplo, se você tem 4 cidades para visitar, você pode fazer 24 rotas diferentes. Se você tem 5 cidades, você pode fazer 120 rotas diferentes. Se você tem 10 cidades, você pode fazer 3.628.800 rotas diferentes! Isso é muito difícil de comparar, não é?

Esse é o problema do caixeiro viajante: encontrar a rota mais curta para visitar todas as cidades e voltar para casa. Esse problema é importante para muitas empresas que precisam planejar a logística: motoristas, pilotos, entregadores, etc.

Vamos comparar 3 técnicas de resolução deste.

1) Busca cega: como o próprio nome dá uma dica, é uma busca sem considerar nenhuma informação prévia sobre o problema. Em outras palavras, puro chute!

Por exemplo, tenho 5 cidades, e escolho aleatoriamente a rota a seguir.
2–5–3–1–4

Outra solução possível: 2–5–4–1–3

Não é um método muito esperto — note que as cidades 1 e 2 são próximas, mas como a rota é aleatória, ela vai de 2 a 3.

2) Cidade mais próxima. Ora, que tal usar uma heurística? Ir sempre para a cidade mais próxima? É o que o ser humano faria.
No mesmo caso das 5 cidades acima, ótimo, vou chegar numa boa solução com esta técnica.

Porém, o que acontece se eu aumentar o número de cidades?

Com 18 cidades, o método guloso (esse de pegar o melhor imediato) mostra situação estranha: há momentos em que a rota chega a “becos sem saída”, e obriga o pobre viajante a percorrer uma distância enorme para compensar (como da cidade 3 para a 8, ou da cidade 10 para 13).

3) Metaheurística: uma metaheurística evolutiva pode fugir dos mínimos locais do método guloso.

Uma metaheurística possível é a seguinte:

  • Para cada cidade, liste as cidades mais próximas não visitadas
  • Escolha aleatoriamente uma das cidades, sendo que as de menor distância terão mais chance de serem escolhidas
  • Tire a cidade já visitada da lista
  • Prossiga até o final

Há diversas metaheurísticas inspiradas na natureza. Uma delas é a da Otimização por Colônia de Formigas.
Uma característica da colônia de formigas é colocar um feromônio no caminho para buscar comida. Se muitas formigas forem por este caminho, o feromônio é mais forte, senão, ele vai se apagando.

Podemos adaptar o algoritmo para considerar o feromônio. Se, numa dada interação, a rota foi da cidade 1 para a cidade 15, o peso da ligação 1–15 aumenta um pouco para ser escolhido na próxima interação, senão, há um fator de esquecimento para ir diminuindo o peso.

Utilizando metaheurísticas, chegamos a uma solução melhor, para as mesmas 18 cidades anteriores.

O problema do Caixeiro-Viajante é difícil (NP-hard), de modo que não é muito simples achar boas soluções quando o número de cidades aumenta. Além disso, metaheurísticas não garantem o ótimo global, apenas uma solução boa.

Para 60 cidades, utilizando o método guloso:

Para as mesmas 60 cidades, utilizando o método evolutivo:

Foi um pouquinho melhor, com FO de 2748 (contra 2824 do guloso), porém, não muito melhor, ainda dá para melhorar bem o algoritmo utilizado.

O arquivo Excel para download no link ( https://1drv.ms/x/s!Aumr1P3FaK7jsmTBb2yFLRs35JnT?e=rcyjQP)
implementa as três técnicas de otimização mostradas. É necessário ativar macros.

O problema do Caixeiro Viajante tem sido bastante estudado na literatura, com inúmeros métodos, benchmarks e também competições, como a abaixo, que pedia ao leitor encontrar a menor distância para percorrer 50 cidades americanas.

Originally published at https://ideiasesquecidas.com on December 5, 2023.

--

--

Arnaldo Gunzi
Arnaldo Gunzi

Written by Arnaldo Gunzi

Project Manager - Advanced Analytics, AI and Quantum Computing. Sensei of Analytics.

No responses yet