Problema do caixeiro-viajante
O problema do caixeiro-viajante (PCV) é um problema que tenta determinar a menor rota para percorrer uma série de cidades, retornando à cidade de origem. Ele é um problema de otimização NP-difícil inspirado na necessidade dos vendedores em realizar entregas em diversos locais percorrendo o menor caminho possível, reduzindo o tempo necessário para a viagem e os possíveis custos com transporte e combustível.
A origem do nome «travelling salesman problem» é desconhecida. Não parece existir qualquer documento que prove o(a) autor(a) do nome do problema. Merril Flood, da Universidade de Princeton, um dos investigadores mais proeminentes nas primeiras aplicações do problema proferiu, no entanto, o seguinte comentário: «I don´t know who coined the peppier name "Traveling Salesman Problem" for Whitney's problem, [...]» (Applegate et al., cop. 2006, p. 2). Nos anos de 1800, problemas relacionados com o PCV começaram a ser desenvolvidos por dois matemáticos: o escocês William Rowan Hamilton e o britânico Thomas Penyngton Kerkman. A forma geral do PCV parece ter sido, pela primeira vez, estudada por matemáticos nos anos de 1930 em Harvard e Viena. O problema foi posteriormente estudado por Hassler Whitney e Merril Flood em Princeton. Exceptuando pequenas variações ortográficas, como traveling vs travelling ou salesman vs salesman's, o nome do problema ficou globalmente conhecido por volta do ano 1950 (Applegate et al., cop. 2006, p.2).
O problema do caixeiro-viajante (representado na Figura 1) consiste na procura de um circuito que possua a menor distância, começando numa cidade qualquer, entre várias, visitando cada cidade precisamente uma vez e regressando à cidade inicial (Nilsson, 1982). Dado um conjunto C = { c 1 , . . . , c n } {\displaystyle C=\{c_{1}\;,...,\;c_{n}\}} de n cidades ci e uma matriz de distâncias ( ρ i j ) {\displaystyle \left(\rho _{ij}\right)} , onde ρ i j = ρ ( c i , c j ) {\displaystyle \rho _{ij}=\rho (c_{i},\;c_{j})} ( {\displaystyle (} i , j {\displaystyle i,\;j} ∈ {\displaystyle \in } { 1 , . . . , n } {\displaystyle \{1,\;...,\;n\}} , ρ i j {\displaystyle \rho _{ij}} = ρ j i {\displaystyle =\rho _{ji}} , ρ i i {\displaystyle \rho _{ii}} = 0 ) {\displaystyle =0)} , a tarefa passa por encontrar a permutação π ∈ S n = { s : { 1 , . . . , n } → { 1 , . . . , n } } {\displaystyle \pi \in S_{n}=\{s:\{1,...,n\}\rightarrow \{1,...,n\}\}} que faça com que a função objectivo (distância do circuito) f : S n → R {\displaystyle f:S_{n}\rightarrow \mathbb {R} } , onde
A solução do PCV pode ser determinada por diferentes métodos. Estes, podem ser agrupados em métodos exactos e heurísticos. Os primeiros têm por base procedimentos «branch-and-bound» (em inglês). , isto é, de enumeração implícita em árvore onde é necessário inserir um limite inferior, no leque de soluções do problema. Existem limites inferiores triviais, como por exemplo, o elemento mínimo das soluções encontradas. Contudo, este tipo de métodos demonstram muita dificuldade quando aplicados a problemas muito complexos, isto é, um PCV com muitas cidades, uma vez que a árvore de enumeração é muito extensa (Conway, 2003). Os métodos heurísticos são procedimentos bastante particulares, o que os torna inflexíveis para a determinação de boas soluções para um outro problema ligeiramente diferente. As heurísticas podem ser agrupadas em métodos de construção de circuitos e métodos de melhorias de circuitos.
WRNN e WTA
A rede neural periódica de Wang, do inglês Wang Recurrent Neural Network (WRNN), com o princípio Winner Takes All (WTA), pode ser aplicada para a resolução do PCV. Além disso, a utilização do princípio WTA nas soluções encontradas pelo WRNN faz com que as mesmas formem circuitos exequíveis. Como tal, este é um método de construção (WRNN) e de melhoria (WTA) de circuitos. O número médio de iterações necessárias para a resolução do PCV utilizando o WRNN é de 4463, com o WRNN + WTA é de 41, isto em problemas que variam entre 3 x 3 e 20 x 20. A WRNN é caracterizada por uma equação diferencial, que engloba uma função do tipo sigmóide. Os vários parâmetros incluídos nas equações afectam a convergência da rede, pois trata-se de factores penalizantes pelas violações às restrições do problema, de controlo para a minimização da função objectivo, entre outros. Esta formulação possui ainda um termo que avalia as violações às restrições do problema dando a indicação do cumprimento das mesmas, após um certo número de iterações. Depois de encontrados tais parâmetros, aplica-se o princípio WTA que pode ser dado através do seguinte algoritmo:
Algoritmos genéticos
Os algoritmos genéticos (AGs) são um dos vários métodos que se utilizam para a resolução de problemas complexos. Este método tem por base um processo iterativo sobre uma determinada população fixa, denominados por indivíduos, que representam as várias soluções do problema. Esta técnica advém do processo de evolução dos seres vivos demonstrada por Darwin. Da mesma forma que os sistemas biológicos, ao longo da sua evolução, tiveram que se «moldar» às alterações ambientais para a sua sobrevivência, os AGs acumulam a informação sobre o ambiente com o intuito de se adptarem ao novo meio. Tal informação funciona como um sistema de triagem para a obtenção de novas soluções exequíveis.
Algoritmo ACO
O PCV tem um papel importante na optimização das colónias de formigas, «ant colony optimization (ACO)» (em inglês). , desde o primeiro algoritmo ACO, chamado «Sistema de Formigas», do inglês Ant System, até aos mais recentes. Nos algoritmos ACO, as formigas são simples agentes que, no caso do PCV, constroem circuitos através do movimento entre cidades no grafo do problema. A solução construída pelas formigas é elaborada por trilhos de feromonas (artificiais) e pela disponibilidade de informação heurística, à priori. Quando o algoritmo ACO é aplicado, é associada uma força da feromona , onde τ i j ( t ) {\displaystyle \tau _{ij}(t)} é uma informação numérica que é modificada durante o algoritmo, e t é o contador das iterações.
Algoritmo por programação dinâmica
Se pensarmos em um abordagem de força bruta, temos que avaliar todas as possíveis jornadas e retornar a melhor encontrada. Essa abordagem utiliza tempo O(n!). Em programação dinâmica temos uma solução muito mais rápida, embora não polinomial. A programação dinâmica reduz o número de possíveis combinações eliminando as que não poderão fazer parte de uma solução ótima do problema, dando assim origem a algoritmos mais eficientes. A ideia básica é construir por etapas uma resposta ótima combinando respostas já obtidas para partes menores. Assim, é possível escolher subproblemas de modo que a informação vital seja recordada e levada a diante. Precisamos saber todas as cidades visitadas, para que não repitamos nenhuma delas. Veja um subproblema apropriado:


