1. Faculdade de Ciências Humanas, Saúde, Exatas
e Jurídicas de Teresina
Turma: Ciência da Computação
Período: 4º - Manhã
Disciplina: Projet0 e Análise de Algoritmos
Docente: Francisco José
Discentes: Adson Ferrett
Igor Monteiro
Marcelo Kelle
Whallysson Estevam
Copyright 2013.1
2. 1 Introdução;
2 Tipos de Problema;
2.1 A Classe P de problemas;
2.2 A Classe NP de problemas;
2.2 A Classe NP-Completo de problemas;
2.2 A Classe NP-Difícil de problemas.
3 Problema do caixeiro viajante;
3.1 Algoritmos de força bruta;
3.2 Implementação.
4 O Problema do caixeiro viajante é NP-Completo;
5 Conclusão;
6 Referências.
Copyright 2013.1
3. O problema do caixeiro viajante é 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-Completo 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.
3
4. 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.
4
5. Para compreender o problema abordado neste
trabalho, é necessário conhecer a classe de problemas
NP-Completos. Para melhor compreender essa classe
e também as classes P e NP, segue uma definição
básica de cada uma delas.
fig 1.
5
7. A classe NP de problemas é o conjunto de todos os
problemas de decisão para os quais existem
verificadores polinomiais. Esta classe corresponde à
classe dos problemas que poderíamos chamar
"razoáveis".
É importante lembrar que todo problema pertencente
à classe P também pertence à classe NP, uma vez que
se um problema pode ser resolvido em tempo
polinomial, ele pode ser igualmente verificado em
tempo polinomial.
7
2.2 A Classe NP de problemas
8. A classe NP-Completo é o conjunto de todos os
problemas completos em NP, portanto, NP-Completo
é a classe dos problemas mais "difíceis" de NP.
Esta classe de problemas é alvo de longos estudos e
pesquisa durante as últimas décadas, pois ela está no
centro de um dos impasses mais famosos dentro da
computação.
8
2.3 A Classe NP-Completo de problemas
9. Um problema NP-Difícil pode também estar em NP,
mas não necessariamente. Os problemas contidos
nesta classe são ditos ao menos tão difíceis quanto os
problemas mais difíceis de NP e não é possível
resolvê-los na exatidão, a menos que P = NP. Ou seja,
um algoritmo polinomial que encontra a solução
exata para um problema NP-Difícil implica P = NP.
9
2.4 A Classe NP-Difícil de problemas
10. O PCV consiste em, dado um grafo completo G(V,E),
com n vértices, obter um ciclo hamiltoniano de custo
mínimo, isto é, deseja-se, a partir de um vértice
inicial, passar por todos os demais vértices do grafo
uma única vez e então retornar ao vértice inicial. Cada
aresta que liga um par de vértices do grafo possui um
custo c(i, j) que determina o quanto se gasta para ir de
i até j. Esse custo pode ter diversos significados, de
acordo com a aplicação desejada.
10
11. Algoritmos de força bruta são uma forma de se
encontrar a solução ótima para um problema de
otimização através do teste exaustivo de todos os
elementos de seu domínio. Considerando o PCV, que é
o problema estudado neste trabalho, um algoritmo de
força bruta consiste em testar todas as permutações
possíveis entre os vértices de uma instância e escolher
o ciclo hamiltoniano de menor custo.
11
3.1 Algoritmos de força bruta
13. A seguir, o pseudocódigo que descreve a implementação
feita para o algoritmo de força bruta.
Força Bruta(Ciclo[n], int pos)
1. SE pos == n
2. Calcule o custo do ciclo
3. SE custo < custo mínimo
4. ENTÃO custo mínimo = custo
5. SENÃO FAÇA
6. PARA j = pos até n
7. Troca (ciclo[], pos, j)
8. Força Bruta (ciclo[], pos + 1)
9. Troca (ciclo[], pos, j)
13
3.2 Implementação
14. Os cálculos realizados no passo 2, com relação ao
custo da instância, podem ser descritos da seguinte
forma:
Custo(M[n][n], ciclo[n])
1. double custo = 0
2. PARA i = 1 até n-1
3. FAÇA custo = custo + M[ciclo[i]][ciclo[i + 1]]
4. custo = custo + M[ciclo[n]][ciclo[1]]
5. RETORNE custo.
14
3.2 Implementação
15. Voltando ao algoritmo principal, os passos 7 e 9 são
responsáveis pela permutação de fato dos vértices no
ciclo. Para isso, foi utilizado um algoritmo simples de
troca de posições em um vetor.
Troca(ciclo[n], int i, int j)
1. int aux = ciclo [i]
2. ciclo[i] = ciclo [j]
3. ciclo[j] = aux
15
3.2 Implementação
16. Através da figura 2, pode-se observar um grafo que
representa uma instância do PCV-Métrico e todas as
permutações possíveis para a obtenção da solução.
fig 2.
16
3.2 Implementação
17. (i) Decisão do Caixeiro Viajante é NP
A exibição da justificativa SIM pode ser dada por uma sequência
de vértices. A verificação da justificativa apresentada consiste em
se verificar que cada vértice aparece na sequência apenas uma
vez.
O(n) - percorrer a lista marcando os vértices, observando se já não
foram marcados, verificar se contém todos os vértices,
O(1) - durante a marcação contar os vértices, e verificar se o peso
total não ultrapassa o valor k,
O(n) - percorrer a lista somando-se os pesos das arestas,
O(1) - descobrir cada peso, se os dados estão em uma matriz de
adjacência.
Como o algoritmo é polinomial, então o problema é da classe NP.
17
18. (ii) Decisão do Ciclo Hamiltoniano ∝ Decisão do Caixeiro
Viajante
Seja um grafo G com n vértices para o qual queremos
decidir se existe ou não um ciclo hamiltoniano.
Construímos um grafo G’ a partir de G contendo todos os
vértices se arestas de G. Atribuímos peso 1 a todas estas
arestas.
fig. 3
18
19. Criamos todas as demais arestas não existentes em G’ com
peso 2. É fácil notar que existe um ciclo em G’, que passa em
todos os vértices exatamente uma vez, com peso no
máximo n, se e somente se existe ciclo hamiltoniano em
G, pois assim haveria um ciclo em G’ passando apenas por
arestas de peso 1. Se não houver, um ciclo em G’ deverá
passar por aresta de peso 2, o que ultrapassará o peso total
n.
fig. 4
19
20. Logo, como
- Decisão do Caixeiro Viajante é NP;
- Decisão do Ciclo Hamiltoniano ∝ Decisão do Caixeiro
Viajante;
- Decisão do Ciclo Hamiltoniano é NP-Completo;
então Decisão do Caixeiro Viajante é NP-Completo.
20
21. CORMEN, Thomas H.; LEISERSON, Charles E.; RIVEST, Ronald L.; STEIN, Clifford.
Algoritmos: Teoria e Prática. 2 ed. Editora Campus, São Paulo. 2002.
FONSECA, Guilherme D. da. Problemas NP-Completo. Rio de Janeiro: Unirio, [2009]. 20
slides, color, Acompanha texto.
GRONER, Loiane. NP - COMPLETUDE. 2006. 42 f. Trabalho do curso de graduação em
Ciência da Computação – Unifesp, Vitória-ES.
MORAIS, José Luiz Machado. Problema do Caixeiro Viajante Aplicado ao Roteamento de
Veículos numa Malha Viária. 2010. 70 f. Trabalho de conclusão de curso – Unifesp, São José
dos Campos-SP.
O problema do caixeiro viajante é NP-Completo. Disponível em: <
http://homepages.dcc.ufmg.br/~nivio/cursos/pa03/tp2/tp22/tp22.html>. Acesso em: 16 mai.
2013, 22:40:00.
Problema do caixeiro viajante. Disponível em:
<http://www.mat.ufrgs.br/~portosil/caixeiro.html>. Acesso em: 17 mai. 2013, 16:30:00.
21
22. Faculdade de Ciências Humanas, Saúde, Exatas
e Jurídicas de Teresina
Discentes: Adson Ferrett adson_sousa007@hotmail.com
Igor Monteiro kijigor@hotmail.com
Marcelo Kelle marcelo_kcs@hotmail.com
Whallysson Estevam avelino099@gmail.com
Copyright 2013.1