O algoritmo do caixeiro viajante é praticamente impossível de se resolver por força bruta. Você pode até tentar, mas a medida que o número de cidades aumentarem, o tempo irá aumentar exponencialmente.
Para a implementação desse algoritmo, você precisa de uma estrutura que diga:
a) Quais cidades existem;
b) Qual é a distância entre duas cidades.
O problema pode ser simplificado (em termos de implementação) se você partir do pressuposto que todas as cidades estão interconectadas entre si. Essa estrutura pode ser um simples array onde as linhas e colunas representam as cidades e os números do array representam as distâncias. É possível usar um número especial, como 0, para indicar que não há conexão entre duas cidades.
Essa estrutura é chamada de matriz de adjacência e é uma das formas de se representar um grafo.
O objetivo do algoritmo é, geralmente, descobrir qual é o menor caminho que faça o caixeiro passar por todas as cidades sem repetições. Algumas variações do problema incluem especificar qual vai ser a cidade inicial ou a final.
Uma das formas de resolver isso, é gerando uma matriz com as cidades em ordem. Por exemplo, digamos que você tenha as cidades A, B, C, D e E, e que “A”, e “E”, sejam os pontos de origem de destino.
Você poderia gerar a seguinte matriz:
Cidade[] cidades = {A, C, D, B, E};
Indicando que primeiro ele viajará de A até C, depois de C até D, depois de D até B, depois de B até E. Aí, basta usar sua estrutura para somar essas distâncias diretamente. (Vai na linha da cidade A e na coluna da cidade C, e ve que distância está lá. Repete o processo para as demais, até ter a distância total). Por força bruta, você teria que testar todas as permutações possíveis da matriz “cidades”, até encontrar a menor.
Técnicas que normalmente resolvem isso são os algoritmos de busca estocástica. Eles não garantem o melhor resultado, mas dão bons resultados. Dê uma olhada em algoritmos genéticos, por exemplo.