Você está na página 1de 18

UNIVERSIDADE FEDERAL DO RIO DE JANEIRO

CENTRO DE TECNOLOGIA – COPPE


PESC – ÁREA INTERDISCIPLINAR DE HCTE

PROBLEMAS NP-COMPLETO: O PROBLEMA DO CAIXEIRO


VIAJANTE E APLICAÇÕES NA TEORIA DOS GRAFOS
  
POR
 
  Daniel Felipe Neves Martins

dmartin@cos.ufrj.br
COMPLEXIDADE EM ALGORÍTMOS COMPUTACIONAIS

ROTEIRO

1. Conceitos Históricos

2. O Conceito de Complexidade Computacional

3. A eficiência de algoritmos

4. Algoritmos P e NP

5. O problema do Caixeiro Viajante

6. Algoritmos Pseudo-Polinomiais

7. Conclusão
COMPLEXIDADE EM ALGORÍTMOS COMPUTACIONAIS

1. NOTAS HISTÓRICAS
 
(a)    Pioneiros em problemas NP-Completos: Steven Cook (1971) e Richard Karp
(1972)

(b)   Garey e Johnson lançaram o primeiro livro em 1979 contendo uma série de
problemas NP-Completo.

(c) Principais problemas: A questão da satisfabilidade, os conjuntos


independentes de vértices, Cliques, Isomorfismo de sub-grafos.

(d) A terminologia atual para a questão do estudo da complexidade de


algoritmos deve-se a Richard Karp.

(e) O critério para considerar os algoritmos polinomiais como eficientes é


anterior aos estudos de Steven Cook
COMPLEXIDADE EM ALGORÍTMOS COMPUTACIONAIS

2. O CONCEITO DE COMPLEXIDADE

2.1- A Complexidade Computacional é um ramo da Matemática


Computacional que estuda a eficiência dos algoritmos.

2.2- Para medir a eficiência de um algoritmo freqüentemente usamos um


tempo teórico que o programa leva para encontrar uma resposta em
função dos dados de entrada.

2.3- Se a dependência do tempo com relação aos dados de entrada for


polinomial, o programa é considerado rápido, pois dado um polinômio
p(x) sabemos que p(x) cresce para + com x. Se, entretanto, a
dependência do tempo for exponencial o programa é considerado lento.
COMPLEXIDADE EM ALGORÍTMOS COMPUTACIONAIS

3- ALGORITMOS P E NP

3.1- A classe de algoritmos P é formada pelos procedimentos para os quais


existe um polinômio p(n) que limita o número de passos do processamento se
este for iniciado com uma entrada de tamanho n.

3.2- Os algoritmos NP não se referem a procedimentos não polinomiais (na


verdade isto é uma conjectura). A leitura correta para procedimentos NP é dizer
que se referem a algoritmos "não-determinísticos-polinomiais" no tempo.
COMPLEXIDADE EM ALGORÍTMOS COMPUTACIONAIS

4- UM PROBLEMA DE COMPLEXIDADE (I)

O número 4.294.967.297 é um número primo?

Solução pelo crivo de Erastóstenes – Lenta – Tente !

Procurar fatorar o número – Menos lenta – Euler


resolve a questão em 1732.
COMPLEXIDADE EM ALGORÍTMOS COMPUTACIONAIS

5- O QUE SÃO OS ALGORITMOS NP AFINAL ?

5.1- A classe dos problemas NP é aquela para as quais podemos verificar,


em tempo polinomial, se uma possível solução é correta.

5.2- Os problemas de classe P estão contidos nos de classe NP. De fato, se


um algoritmo pode ser executado em tempo polinomial e tivermos em
mãos um possível candidato S à solução, é possível executar o programa,
obter uma solução correta C e comparar C com S para certificar que S é de
fato solução, tudo em tempo polinomial.
 
COMPLEXIDADE EM ALGORÍTMOS COMPUTACIONAIS

6- COMO RECONHECER SE UM ALGORITMO É OU NÃO


É EFICIENTE ?

6.1 - Um algoritmo é eficiente precisamente quando sua complexidade for um


polinômio no tamanho de sua entrada.

6.2- De acordo com a definição, um problema seria considerado tratável,


exibindo-se algum algoritmo de complexidade polinomial que o resolvesse.

6.3- Para verificar que é intratável, há necessidade de provar que todo possível
algoritmo que o resolva não possui complexidade polinomial.
COMPLEXIDADE EM ALGORÍTMOS COMPUTACIONAIS

7- CLASSIFICAÇÃO DOS PROBLEMAS

7.1- Problema algorítmico: conjunto de dados +objetivos+instância

7.2- Tipos:
• Problema de Decisão: Existe estrutura S que satisfaça a propriedade P ?
• Problema de Localização: Encontrar uma estrutura S que satisfaça uma
propriedade P.
• Problema de Otimização: Encontrar uma estrutura S que satisfaça critérios de
otimização.
COMPLEXIDADE EM ALGORÍTMOS COMPUTACIONAIS

8- UM OUTRO PROBLEMA DE COMPLEXIDADE (II)

“Suponha que um caixeiro viajante tenha de visitar n


cidades diferentes, iniciando e encerrando sua viagem na
primeira cidade. Suponha, também, que não importa a
ordem com que as cidades são visitadas e que de cada uma
delas pode-se ir diretamente a qualquer outra. O problema
do caixeiro viajante consiste em descobrir a rota que torna
mínima a viagem total”.

O problema do Caixeiro Viajante


COMPLEXIDADE EM ALGORÍTMOS COMPUTACIONAIS

O problema do caixeiro viajante é um problema de otimização combinatória.

(a) Como transforma-lo num problema de enumeração ?


(b) Como determinar todas as rotas do caixeiro ?
(c) Como saber qual delas é a menor ?

SOLUÇÃO: São (n-1)! Rotas


É um trabalho fácil para a máquina ?
 
COMPLEXIDADE EM ALGORÍTMOS COMPUTACIONAIS

A quantidade ( n - 1 )! cresce com uma velocidade alarmante


Rotas por
n (n - 1)! Cálculo total
segundo

5 250 milhões 24 insignificante

10 110 milhões 362 880 0.003 seg

15 71 milhões 87 bilhões 20 min

20 53 milhões 1.2 x 1017 73 anos

 
25 42 milhões 6.2 x 1023 470 milhões de anos
COMPLEXIDADE EM ALGORÍTMOS COMPUTACIONAIS

(1) Se descobrirmos como resolver o problema do caixeiro viajante em


tempo polinomial, ficaremos sendo capazes de resolver, também em
tempo polinomial, uma grande quantidade de outros problemas
matemáticos importantes.
(2) Se um dia alguém provar que é impossível resolver o problema do
caixeiro em tempo polinomial no número de cidades, também se terá
estabelecido que uma grande quantidade de problemas importantes não
tem solução prática.
(3) Costuma-se resumir essas propriedades do problema do caixeiro
dizendo que ele pertence à categoria dos problemas NP - completos.
COMPLEXIDADE EM ALGORÍTMOS COMPUTACIONAIS

UMA OUTRA VISÃO DO PROBLEMA - Grafos


(1) Se tivermos as cidades A, B, C e D, uma rota que o caixeiro poderia
considerar é sair de A para B, dessa vai para C, e daí ba para B e então volte
para A. Existem mais seis rotas possíveis ABCDA, ABDCA, ACBDA,
ACDBA, ADBCA e ADCBA.
( 2) Seja um grafo G completo, tal que cada aresta e possui um peso c(e) maior
ou igual a zero. Um percurso de caixeiro viajante é simplesmente um ciclo
hamiltoniano (um caminho que contenha cada vértice do grafo uma vez) de G.
O peso de um percurso é a soma dos pesos das arestas que o formam. Um
percurso de caixeiro viajante ótimo é aquele cujo peso é mínimo. No grafo
abaixo, para o caminho a, b, c, d, a o peso é 16, enquanto que um peso ótimo é
a, b, d, c, a de peso 11.
COMPLEXIDADE EM ALGORÍTMOS COMPUTACIONAIS

UMA OUTRA VISÃO DO PROBLEMA - Grafos


d

5 2

c
2 4

a 6 b
COMPLEXIDADE EM ALGORÍTMOS COMPUTACIONAIS

UMA OUTRA VISÃO DO PROBLEMA - Grafos

NOVAS FORMULAÇÕES PARA O PROBLEMA


(1) Problema de decisão: Dados: um grafo G e um inteiro k maior do que zero.
Objetivo: Verificar se g possui um percurso de caixeiro viajante de peso menor
ou Ou igual ao valor de k.
(2) Problema de localização: Dado um grafo G e um inteiro k maior do que zero.
Objetivo: Localizar em G, um percurso de caixeiro viajante, de peso menor ou
igual ao valor de k.
(3) Problema de otimização: Dados: Um grafo G.
Objetivo: Localizar em G, um percurso de caixeiro viajante que seja ótimo.
COMPLEXIDADE EM ALGORÍTMOS COMPUTACIONAIS

9-ALGORITMOS PSEUDO-POLINOMIAIS

Seja P um problema de decisão. Um algoritmo A que resolva P é


dito pseudopolinomial quando a complexidade de A for polinomial
no tamanho da entrada de P, supondo que esta seja codificada em
unário.

Aplicações: Particionamento de árvores.


COMPLEXIDADE EM ALGORÍTMOS COMPUTACIONAIS

10- CONCLUSÕES

(a) Busca da eficiência dos algoritmos para diminuir o tempo de execução;


(b) Existem problemas que necessitam da adoção de processos analíticos para a
avaliação da eficiência do algoritmo;
(c) A quantidade de memória de uma máquina influencia no tempo de execução de um
algoritmo;
(d) A complexidade é um indicador para a avaliação da eficiência de tempo do
algoritmo;
(e) A complexidade procura traduzir analiticamente uma expressão da eficiência de
tempo no pior caso;
(f) A maioria dos algoritmos são da classe NP;
(g) Algoritmos que resolvem problemas de decisão são chamados pseudo-polinomiais,
desde que tais problemas sejam codificados em unários.

Você também pode gostar