O PROBL PROBLEMA EMA DO CAIXEIRO VIAJ VIAJ ANTE Mike Muya Tshibende, Marcelo Cardoso Insti tut o de Inform ática – Uni Universid versid ade Federal Federal do Rio Grande do Sul (UFR (UFRGS GS)) Caixa Post al 15.064 15.064 – 91.501 91.501-970 -970 – Port o Alegr e – RS – Brasil Bras il muyat shi b@yahoo. yahoo. f r mar c. car doso@gmai l . com
Ab st rac t: 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. NP-completo. Mostraremos 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. Intro Intro duçã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 orig origem em 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. otimização. Na figura 1 se vê um exemplo de uma configuração 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-52-3-5-4-1-2 4-1-2
Figura 1. Uma instância do problema 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 //vértice foi visitado
11. Se i <> |v| então 12. Distancia = Distancia + G[v[i]],v[i+1]]; Senão 13. 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...5] + Cp [6...7] + Cp [9...15] + Cp [17...21] + Cp [22...27] = 1+1+somatorio_de_i=1_ate_n 1+somatorio_de_i=1_ate_v 1+somatorio_de_i=1_ate_ n 1+1+1 = 2 + n+ v + n+ 2 = 2n + v + 4 = O (n) Exemplo de execução do algoritmo para uma matriz de entrada G. Essa entrada produz a saída “true”.
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ãoorientado 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 é 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: Algo ri tm o 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):
Grafo G é uma instância de ciclo hamiltoniano
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 cai xeiro viajante. Disponível em: . Acessado em 20/11/2012 Travelling Salesman Problem. Disponível e m: , Acessado em 20/11/2012. WIKIPEDIA. Caminho hamiltoniano. Disponível em: . Acessado em 20/11/2012 WIKIPEDIA. Travelling Salesman Problem. Disponível em . Acessado e m 20/11/2012