Você está na página 1de 6

O PROBLEMA DO CAIXEIRO VIAJANTE

Mike Muya Tshibende, Marcelo Cardoso Instituto de Informática – Universidade Federal do Rio Grande do Sul (UFRGS) Caixa Postal 15.064 – 91.501-970 – Porto Alegre – RS – Brasil

muyatshib@yahoo.fr

marc.cardoso@gmail.com

Abstract: Our main objective in this paper is to prove that the travelling salesman is a NP-complete problem. We will show that it belongs to the NP class and that there is a known NP-complete problem that can be reduced to the TSP in polynomial time. Based on that, we will then conclude that the TSP is NP-complete.

Resumo: O objetivo deste trabalho é mostrar que o problema do caixeiro viajante é NP-completo. Mostraremos que ele pertence à classe NP e que existe um problema conhecido como sendo NP-completo que possa ser reduzido ao problema do caixeiro viajante em tempo polinomial. Com isso, chegaremos a conclusão de que o problema do caixeiro viajante é NP-completo.

1. Introdução

O problema do caixeiro viajante ou Travelling Salesman Problem (TSP) é um dos mais clássicos problemas de complexidades. Seja um vendedor que deve visitar n cidades e ele deseja fazer uma viagem visitando cada cidade apenas uma vez e voltar para cidade de origem usando o caminho mais curto possível. O fato de se querer encontrar o custo mínimo caracteriza o TSP como um problema de otimização. Na figura 1 se vê um exemplo de uma configuração com 5 cidades representadas por vértices e um custo c(i, j) para viajar da cidade i até a cidade j. O custo mínimo = 15 e caminho é 2-3-5-4-1-2

i até a cidade j. O custo mínimo = 15 e caminho é 2-3-5-4-1-2 Figura 1.

Figura 1. Uma instância do problema do caixeiro viajante

2. Caixeiro Viajante pertence à classe NP

A classe NP é o conjunto de todos os problemas que podem ser verificados em tempo polinomial. O algoritmo apresentado abaixo recebe como entrada uma matriz de adjacência G, um vetor contendo a sequência da viagem executada e o custo máximo do cíclo. E retorna verdadeiro caso a entrada representa a solução verdadeira (caso o vendedor passe exatamente uma vez em cada cidade, totaliza os custos dos caminhos e verifica se a soma é no máximo k) e falso caso contrário.

Verificação da solução do Problema do Caixeiro Viajante

Entradas:

G: Matriz de adjacência do grafo

v

: Vetor da sequência

k

: Custo máximo do ciclo

1.

Início

2.

Distancia = 0;

3.

n= numVert (G); // grava o numero de vértices do grafo

4.

Se n<> |v| // número de vértices do vetor de sequencia diferente do número de vertice do grafo

5.

return false

6.

Para i=1 até n Faça

7.

visitados [i] = 0; //Inicializa uma lista para controlar o numero de vezes que um vertice foi // visitado

8.

Fim Para;

9.

Para i=1 até |v| Faça

10. visitados [v[i]] = visitados [v[i]+1]; //Preenche com número de vezes que um

11. Se i <> |v| então

//vértice foi visitado

12. Distancia = Distancia + G[v[i]],v[i+1]];

13. Senão

14. Distancia = Distancia + G[v[i]] [v[1]]; // adiciona com o vertice de origem.

15. Fim Se;

16. Fim Para;

17. Para i=1 até n Faça

18. Se visitados [i] <> 1 // verifica se todos os vértices foram visitados apenas uma vez.

19. return false;

20. Fim Se

21. Fim Para;

22. Se Distancia <= k então // verifica se a soma

23. return true;

24. Senão

25. return false;

26. Fim Se

27. Fim

2.1. Cálculo da complexidade

Cp [verificação] = Cp [4 =

1+somatorio_de_i=1_ate_ n 1+1+1

5]

+ Cp [6

7]

+ Cp [9

15]

+ Cp [17

1+1+somatorio_de_i=1_ate_n

= 2 + n+ v + n+ 2

= 2n + v + 4

= O (n)

21]

+ Cp [22

27]

1+somatorio_de_i=1_ate_v

Exemplo de execução do algoritmo para uma matriz de entrada G. Essa entrada produz a saída “true”.

de entrada G. Essa entrada produz a saída “true”. v= [0, 1, 3, 2]; k =

v= [0, 1, 3, 2]; k = 250

A complexidade do algoritmo de verificação tem complexidade polinomial, isso nos garante que o problema do Caixeiro Viajante pertence à classe NP.

3. Caixeiro Viajante pertence à classe NP-Completo

Para provarmos que o problema do Caixeiro Viajante pe NP-Difícil, devemos reduzir um outro problema NP-Difícil a ele. Escolhemos o problema dos ciclo hamiltoniano para fazer essa redução.

3.1 Problema do Ciclo Hamiltoniano: definição

Um ciclo hamiltoniano é um caminho fechado que contém cada vértice de um grafo não- orientado G = (V, E). Nesse problema, os vértices são incluídos apenas uma vez, sem repetição. Um grafo que possui esse tipo de circuito é conhecido como grafo hamiltoniano.

Exemplo de um ciclo hamiltoniano em um Dodecaedro 3.2. O Problema do Caixeiro Viajante é

Exemplo de um ciclo hamiltoniano em um Dodecaedro

3.2. O Problema do Caixeiro Viajante é NP-Difícil

Para demonstrar que o problema do Caixeiro Viajante é NP-Difícil, devemos mostrar primeiro que Ciclo Hamiltoniano ≤p Caixeiro Viajante. Dado G = (V, E) uma instância do problema Ciclo Hamiltoniano, uma instância do problema caixeiro viajante pode ser construída da seguinte maneira: formamos um grafo completo G’ = (V, E’), com E’ = {(i, j) : i, j V e i j} e a função de custo: c(i, j) = {0 se (i, j) E; senão 1}. Dessa forma, G’ é um grafo completo, composto de todos os vértices de G, com arestas de custo 0 se já existiam no grafo original e custo 1 se não existiam. O algoritmo que faz essa redução executa em tempo polinomial, como pode ser visto abaixo:

Algoritmo de redução

Entradas: G, n G-> Matriz da adjacência n-> Número de vértice

1.

Inicio

2.

c = [];

3.

Para i=1 até n Faça

4.

Para j=1 até n Faça

5.

Se G[i] [j] > 0 então

6.

c[i] [j] = 0;

7.

Senão

8.

c[i] [j] = 1;

9.

Fim Se

10.

Fim Para

11.

Fim Para

12.

return c

13.

Fim

A complexidade do algoritmo de redução é dada por:

Cp [redução] = Cp [3

8] +Cp [12]

= somatorio_de_i=1_ate_n (somatorio_de_j=1_ate_n ( 1 )) + 1

= n² + 1

= O (n²)

Abaixo temos um exemplo de um grafo G e de G’ (formado com o algoritmo dado

acima):

um grafo G e de G’ (formado com o algoritmo dado acima): Grafo G é uma

Grafo G é uma instância de ciclo hamiltoniano

dado acima): Grafo G é uma instância de ciclo hamiltoniano Grafo G’ é uma instância de

Grafo G’ é uma instância de problema do Caixeiro Viajante

Se existe uma viagem h com custo zero em G, da mesma forma, existe uma viagem h’ com custo máximo zero em G’. Os custos das arestas em E’ são zero ou um, o custo da viagem h’ e exatamente zero, e cada aresta na viagem deve ter custo zero. Um grafo G’ só é hamiltoniano se e somente se possuir uma trilha fechada que percorre todas as arestas com custo máximo zero. Suponha que o grafo G tem um ciclo hamiltoniano, então cada aresta desse ciclo pertence a E e portanto, tem custo 0 em G’. G tem um ciclo hamiltoniano se e somente se existe uma instância do caixeiro viajante com circuito de tamanho menor ou igual ao número de vértices n de G. Se G tem um ciclo hamiltoniano, então essa ordem em particular de cidades (vértices) define um circuito de tamanho n. Assim, podemos concluir que h é um ciclo hamiltoniano no grafo G. Portanto, o problema de TSP pode ser reduzido em problema do ciclo hamiltoniano. Logo, o problema do caixeiro viajante é um problema NP- difícil.

4. Conclusão

Pelo apresentado nas seções 2 e 3, provamos que o Problema do Caixeiro Viajante pertence tanto à classe NP-difícil quanto à classe NP, portanto esse problema é NP-completo, como queríamos demonstrar.

5. Bibliografia

CORMEN, Thomas H.; LEISERSON, Charles E.; RIVEST, Ronald L.; STEIN, Clifford. Algoritmos: teoria e prática. Tradução da 2ª edição (americana). Rio de Janeiro:

Elsevier: Editora Campus, 2002

Falando de TI.O problema do caixeiro viajante. Disponível em:

<http://www.zanuz.com/2007/09/o-problema-do-caixeiro-viajante.html>. Acessado em

20/11/2012

Travelling Salesman Problem. Disponível em: <http://www.shannarasite.org/kb/kbse56.html>, Acessado em 20/11/2012.

WIKIPEDIA. Caminho hamiltoniano. Disponível em:

<http://pt.wikipedia.org/wiki/Caminho_hamiltoniano>. Acessado em

20/11/2012

WIKIPEDIA. Travelling Salesman Problem. Disponível em <http://en.wikipedia.org/wiki/Travelling_salesman_problem>. Acessado em

20/11/2012