FUNDAÇÃO DE ASSISTÊNCIA E EDUCAÇÃO - FAESA FACULDADES INTEGRADAS ESPÍRITO-SANTENSES CURSO DE CIÊNCIA DA COMPUTAÇÃO
LOIANE GRONER
NP - COMPLETUDE
VITÓRIA 2006
LOIANE GRONER
NP - COMPLETUDE
Trabalho do Curso de Graduação em Ciência da Computação, apresentado às Faculdades Integradas Espírito-santenses, como requisito parcial para avaliação da disciplina de Teoria da Computação, sob a orientação da prof. Elvira Pádua Lovatte.
VITÓRIA 2006
VITÓRIA, 01 DE DEZEMBRO DE 2006
SUMÁRIO 1 INTRODUÇÃO INTRODUÇÃO ........................................... ..................... ............................................ ........................................... ................................. ............ 3 2 IMPORTÂNCIA DA TEORIA NP - COMPLETUDE ................ ........................ ................ ................. ......... 4 3 CLASSE DE PROBLEMAS PROBLEMAS ALGORÍTMICOS ALGORÍTMICOS ............................................ ...................... ........................... ..... 7 3.1 PROBLEMA DE DECISÃO ................ ......................... .................. ................ ................ ................. ................ ................. ........... 7 3.2 PROBLEMA DE LOCALIZAÇÃO ................ ......................... ................ ................ ................. ................ ................. ......... 8 3.3 PROBLEMA DE OTIMIZAÇÃO ................ ......................... ................ ................ .................. ................ ................ ............. .... 8 4 CLASSE DE PROBLEMAS P ............... ........................ .................. ................ ................ ................. ................ ................. ......... 10 5 CLASSE DE PROBLEMAS PROBLEMAS NP .......................................... .................... ............................................ .............................. ........ 11 6 CARÁTER NP - COMPLETO COMPLET O ................ ......................... ................. ................ ................. ................ ................ ................ ....... 14 6.1 REDUTIBILIDADE...................... REDUTIBILIDADE ............................................ ............................................ ............................................ .......................... 14 6.2 IMPORTÂNCIA DO CARÁTER NP - COMPLETO ................. ........................ ................ ................ ....... 16 7 HIERARQUIA HIERARQUIA DAS COMPLEXIDADES COMPLEXIDADES................ ...................................... ........................................... ..................... 17 7.1 OUTRAS CLASSES DE COMPLEXIDADE COMPLEXIDADE........ ................ ................ ................. ................. ................ ........... ... 18 8 PROBLEMAS PROBLEMAS P E NP............................... NP......... ............................................ ............................................ ................................. ........... 19 8.1 PROBLEMAS FAMOSOS ................. ......................... ................. ................. ................ ................. ................ ................ ............ ... 19 8.1.1 Caminho em um Grafo.................... Grafo ......................................... ........................................... ..................................... ............... 20 8.1.2 Coloração de um Grafo............................... Grafo......... ............................................ ............................................ .......................... 20 8.1.3 Ciclo de Hamilton ........................................... ..................... ............................................ ........................................... ..................... 22 8.1.4 Cobertura de Arestas Arestas e Vértices (Vertex Cover)..................................... Cover)...................... ............... 23 8.1.5 Problema da Satisfabilidade (SAT) ........................................... ..................... ..................................... ............... 24 8.1.6 Clique Clique de um Grafo ................. ........................ ................ .................. ................ ................ ................. ................ ................. ......... 25 8.1.7 Problema da Parada................. Parada ....................................... ............................................ ........................................... ..................... 26 9 PROVAS PROVAS ................ ........................ ................ ................. ................ ................ .................. ................ ................ ................. ................ ................. ......... 28
9.1 TEOREMA DE COOK ................. ........................ ................ .................. ................ ................ ................. ................ ................. ......... 28 9.2 PROVA DE QUE UM PROBLEMA É NP - COMPLETOO ................ ......................... ............. .... 28 9.3 OUTRAS PROVAS .......................................... .................... ............................................ ............................................ .......................... 29 9.3.1 Clique ∈ NP?........ NP? ............... ................ ................. ................ ................. ................. ................ ................. ................. ................ ........... ... 29 9.3.2 Ciclo Hamiltoniano ∈ NP?............. NP?...................... .................. ................ ................ ................. ................ ................. ......... 29 9.3.3 Clique é NP – Completo?............................... Completo?......... ............................................ ........................................... ..................... 30 9.3.4 Problema de Decisão Decisão do Caixeiro Caixeiro Viajante é NP NP – Completo? ............. 31 9.3.5 Problema Problema de Otimização do Caixeiro Caixeiro Viajante é NP – Difícil?............... Difícil?.......... ..... 32 9.3.6 Halting Problem é NP – Difícil? ........................................... ..................... ........................................... ..................... 33 10 PROBLEMAS EXPONENCIAIS ............... ........................ ................. ................ ................. ................. ................ ........... ... 34 10.1 ALGORITMOS APROXIMADOS APROXIMADOS PARA PROBLEMAS PROBLEMAS NP-COMPLETOS
35
11 CONCLUSÃO ........................................... ..................... ............................................ ............................................ .............................. ........ 36 12 REFERÊNCIAS ............................................ ...................... ............................................ ............................................ ........................... ..... 37 ANEXOS .......................................... .................... ............................................ ............................................ ............................................ .......................... 39 ANEXO A – LISTA DE EXERCÍCIOS ................ ......................... ................ ................ ................. ................ ................. ......... 40
3
1 INTRODUÇÃO Alguns problemas computacionais são difíceis. Tenta-se achar algoritmos eficientes para resolvê-los, mas às vezes acaba-se falhando. Seria interessante se pudesse provar que achar um algoritmo eficiente para certos casos é impossível, assim como seria de grande relevância quando não se consegue achar um algoritmo eficiente , e pudesse conforta-se para o fato deste não existir para esse problema em questão. Infelizmente, tais provas são mais difíceis que achar eficientes algoritmos. Este trabalho discute que alguns problemas são realmente difíceis. A prova consiste em um conceito conhecido como NP - Completude. Este conceito permite mostrar rigorosamente que achar um algoritmo eficiente para um certo problema é tão difícil quanto achar algoritmos eficientes para todos os problemas que encontram-se na classe chamada NP. Neste trabalho será definida formalmente a classe NP e a classe relacionada P, assim como provar que um dado problema é NP – Completo. Também serão discutidos alguns exemplos de problemas NP – Completos. Muitos desses problemas são muito importantes, uma vez que estão relacionados a problemas de otimização, que na prática podem gerar economia de dinheiro, tempo e outros recursos. Um dos métodos mais efetivos é construir um algoritmo de aproximação de tempo polinomial para problemas NP – Completos. Embora tais algoritmos não produzam uma solução ótima, geralmente chegam perto da solução ótima. Em fato, em alguns casos casos pode-se garantir a quão perto essa solução solução aproximada será da solução ótima.
4
2 IMPORTÂNCIA DA TEORIA NP – COMPLETUDE A teoria da complexidade computacional estuda a complexidade de problemas (e não a complexidade de algoritmos). A complexidade de um problema é o consumo de tempo de um algoritmo ótimo ideal para o problema. Não se trata necessariamente necessariamente do melhor algoritmo conhecido para o problema, pois um algoritmo ótimo pode não ter sido descoberto ainda. Nos anos 60 e 70 foi desenvolvido um conceito designado classes da hierarquia de complexidade para problemas finitos. E enquanto forem usados computadores digitais com memória finita onde são armazenados objetos discretos para resolver problemas computacionais, computacionais, é relevante para designar qualquer algoritmo não trivial. Obviamente, todos os problemas P estão em NP, mas se o inverso é verdade não se pode afirmar. Este é um dos problemas teóricos mais importantes hoje, e qualquer pessoa que mostrar habilidade para resolvê-lo, estará apta a ganhar $ 1 milhão de dólares como prêmio do Clay Mathematics Institute. A maioria do algoritmos vistos neste curso até agora, são no máximo de tempo polinomial. De acordo com Cormen, Leiserson, e Rivest, algoritmos de tempo polinomial são considerados tratáveis pelas seguintes razões: 1. Embora um problema que seja da ordem O (n 20) ou O (n 100) possa ser chamado intratável, existem muitos poucos problemas práticos com tais ordens de tempo polinomial. 2. Para razões de modelos matemáticos, matemáticos , um problema que pode ser resolvido em tempo polinomial em um modelo também pode ser resolvido por outro modelo, também de tempo polinomial. 3. A classe de problemas de de tempo polinomial é solvível porque porque a adição e a multiplicação de polinômios são operações próximas, o que é conveniente para algoritmos na máquina de Turing.
5
Figura 1: gráfico das funções de complexidade
A classe de problemas NP – Completo é muito importante e uma classe muito importante para a Ciência da Computação. O interessante fato que abrange essa classe de problemas pode ser atribuído pelas seguintes razões:
1. Nenhum algoritmo de tempo polinomial foi descoberto para qualquer problema NP – Completo. Ao mesmo tempo nenhum problema NP – Completo mostrou ter um tempo menor que o super-polinomial (por exemplo, tempo exponencial). 2. Se um algoritmo de tempo polinomial polinomi al for descoberto para qualquer problema NP – Completo, então todos os problemas NP – Completos poderão ser resolvidos em tempo polinomial.
Acredita-se (mas não há provas) que problemas NP – Completos não possuem algoritmos de tempo polinomial e são intratáveis. A base para essa convicção é explicada pela segunda razão citada acima, prevendo que se qualquer problema NP – Completo pode ser resolvido em tempo polinomial, então todos problemas NP – Completos terão um algoritmo de tempo polinomial.
6
Figura 2: tabela de funções de complexidade vs.
Com base nessas observações, pode-se classificar os problemas em dois tipos: •
Tratável: se ele apresenta uma solução polinomial
•
Intratável: se ele for tão difícil que nenhum algoritmo polinomial pode resolvê-lo.
7
3 CLASSES DE PROBLEMAS ALGORÍTMICOS Um problema algorítmico é caracterizado por um conjunto de dados, pelo objetivo do problema e por uma solução. Aborda-se aqui o problema da existência de algoritmos eficientes do ponto de vista mais geral. Deseja-se avaliar a dificuldade à natureza do problema, ou seja, dado determinado problema para o qual se pode construir uma família f amília de algoritmos que o resolvem, existirá dentre eles algum que seja polinomial? Para melhor abordar a questão da complexidade, bem como caracterizar as classes P e NP, é conveniente classificar os problemas algorítmicos nas seguintes categorias: •
Problemas de Decisão
•
Problemas de Localização
•
Problemas de Otimização
3.1
PROBLEMAS DE DECISÃO
Para os problemas de decisão, o objetivo consiste sempre em responder sim ou não à determinada indagação. Por exemplo, em um problema chamado Shortest Path, tem-se um grafo não orientado G e vértices u e v, e deseja-se encontrar o caminho de u até v que utiliza o menor número de arestas. Em outras palavras, Shortest Path é o problema de caminho mais curto de um único par em um grafo não orientado e não ponderado. Um outro exemplo: dados um grafo G e um inteiro k > 0, existe um clique de tamanho k? Caso exista um subgrafo completo maximal maximal em em G com k ou mais vértices, a resposta será sim; caso contrário, não.
8
3.2
PROBLEMAS DE LOCALIZAÇÃO
Para problemas de localização, o objetivo é encontrar, caso exista, determinada estrutura satisfazendo requisitos especificados por uma questão. Por exemplo, dados um grafo G e um inteiro k > 0, encontrar, se existir, um clique em G de tamanho k. No exemplo da figura, para k = 3, a resposta para para este problema de localização é o clique {3, 4, 5, 6}.
3.3
PROBLEMAS DE OTIMIZAÇÃO
Em problemas de otimização, o objetivo será obter determinada estrutura satisfazendo critério de otimização pré-definido pré-definido Neste ponto é fácil observar que os três problemas guardam em geral relação muito próxima, isto é, para obter um clique de tamanho mínimo, três problemas devem ser resolvidos em seqüência: a) Passo 0 Problema de Decisão: Entrada: Grafo G e um inteiro k > 0 Questão: E um clique em G do tamanho k? Se a resposta for sim, resolve-se o segundo problema. b) Passo 1 Resolver o Passo 1 consiste basicamente em obter algum clique em G, ou mostrar que não existe estrutura com esta propriedade. Portanto, foi resolvido o seguinte problema: Problema de Localização: Entrada: Grafo G e um inteiro k > 0 Questão: Encontrar um clique em G de tamanho
k.
9
c) Passo 2 Resolvidos os problemas da existência e localização de cliques em G, deve-se obter dentre todos os cliques deste grafo aquele de tamanho mínimo. Ou seja, o menor k para o qual a resposta ao Problema de Decisão seja sim. Problema de Otimização Entrada: Grafo G Questão: Obter um clique de tamanho mínimo. Conclui-se então que o Problema de Decisão apresenta dificuldade não maior que a do Problema de Localização, e este, por sua vez, apresenta dificuldade não maior que a do Problema de Otimização associado Em diversas situações, porém, os Problemas de Localização e Otimização apresentarão grau de dificuldade não maior que o Problema de Decisão associado. Sendo a obtenção de resposta para o Problema de Decisão em geral mais fácil, utiliza-se este problema para obter alguma indicação quanto à possível intratabilidade. Outra razão significativa para utilizarmos Problemas de Decisão é que o tamanho de sua saída é constante (resposta sim ou não), podendo ser ignorada na análise da complexidade de determinado algoritmo. O relacionamento entre um problema de otimização e sue problema de decisão relacionada atua a favor quanto se tenta mostrar que o problema de otimização é difícil, ou seja, se um problema de otimização é fácil, seu problema de decisão relacionado também é fácil. Declarado de um modo que tem maior relevância para o caráter NP – Completo, se puder fornecer evidências de que um problema de decisão é difícil, também se pode fornecer evidências de que o problema de otimização relacionada é difícil Deste modo, embora restrinja a atenção a problemas de decisão, a teoria de problemas NP – Completos freqüentemente também tem implicações para problemas de otimização.
Figura 3: Ordem de Dificuldade
10
4 CLASSE DE PROBLEMAS P Definição: a classe de complexidade P é o conjunto de todos os problemas de decisão (ou linguagens) que aceitam o tempo polinomial no pior caso. Isto é, existe um algoritmo algoritm o A que, se x L, então ao inputar x, A tem como resultado “sim” em um tempo p(n), onde n é o tamanho de x e p(n) é polinomial. Note que a definição de P não diz nada a respeito sobre o tempo de execução de uma rejeição da entrada de dados, ou seja, quando o algoritmo tem como solução “não”. Alguns casos se referem ao complemento da linguagem L, que consiste de todas as strings binárias que não estão em L. Dado um algoritmo A que aceite a linguagem L em tempo polinomial, p(n), pode-se construir um algoritmo de tempo polinomial que aceite o complemento de L. Em particular, dada uma entrada de dados x, pode-se construir um algoritmo complemento B que simplesmente executa A em p(n) passos, onde n é o tamanho de x, terminando sua execução se A tentar executar mais de p(n) passos. Se A tiver como solução “sim” então B tem como solução “não”; se A tem como solução “não” ou se A executar ao mínimo p(n) passos sem nenhuma solução, então B tem como solução “sim”. Nos dois casos, o algoritmo complemento B é executado em tempo polinomial. Isso significa que, se uma linguagem L, representando um problema de decisão está em P, então o complemento de L também está em P. O algoritmo da eliminação de Gauss, ou método do escalonamento, usado para resolver sistemas lineares, é um procedimento da classe P. De fato, para resolver um sistema linear n×n são necessárias (4n 3 +9n 2 -7n)/6 operações aritméticas, um custo aproximado de n 3 . Por outro lado, o método de Cramer, também utilizado para resolver sistemas lineares, tem custo exponencial. Para um sistema linear n×n esse método executa aproximadamente (n+1)!(e-1) multiplicações. Para se ter uma idéia desse custo, se for usado um computador que realiza 100 milhões de multiplicações por segundo, para resolver um sistema linear 20×20 seriam necessários mais de 32000 anos.
11
5 A CLASSE DE PROBLEMAS NP Os problemas NP não se referem a problemas não polinomiais (na verdade isto é uma conjectura). A leitura correta para procedimentos NP é dizer que se referem a problemas "não-determinísticos "não-determinísticos polinomiais" no tempo. No início dos anos sessenta foram encontrados muitos algoritmos que resistiam a uma simplificação polinomial, isto é, algoritmos que não admitiam procedimentos análogos na classe P. Nesta época Steve Cook observou um fato simples e ao mesmo tempo surpreendente: se um problema pudesse ser resolvido em tempo polinomial, poderia-se também verificar se uma dada possível solução é correta em tempo polinomial (dize-se que o algoritmo pode ser certificado certif icado em tempo polinomial). Um exemplo simples de como esta certificação pode ser feita é o problema de descobrir se um dado número é composto, ou seja, se ele não é primo. Suponha que se queira descobrir se 4294967297 é um número composto. Não existe uma maneira eficiente (rápida) de fazer isto. De fato tal tarefa pode ser realizada pela utilização do crivo de Eratóstenes, testando os possíveis divisores do número, o que pode demandar um tempo excessivo de computação. Entretanto existe uma maneira sucinta de certificar que aquele número é composto: basta verificar que o produto de 6700417 por 641 é exatamente 4294967297. Assim, se puder achar uma certificação, pode-se exibir efetivamente sua validade. Achá-la pode ser extremamente difícil, no entanto. A fatoração de 4294967297 foi encontrada por Leonard Euler em 1732, noventa e dois anos após Pierre de Fermat ter conjeturado erroneamente que tal número era primo. Definição: A classe dos problemas NP é aquela para as quais se pode verificar, em tempo polinomial, se uma possível solução é correta. Evidentemente Evidenteme nte P NP. De fato, se um algoritmo algorit mo pode ser executado em tempo polinomial e tiver 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.
12
A classe NP consiste dos algoritmos não-determinísticos polinomiais, e recebe este nome devido a uma formulação equivalente que não usa o conceito de certificação, mas o de decisão de linguagens. A categoria de linguagens a que refere-se são as reconhecidas por computadores teóricos chamados de Máquinas de Turing. Tais máquinas parecem capturar completamente o sentido do termo computação. Uma máquina de Turing pode ser pensada como uma fita infinita de papel, dividida em pequenas casas, e um lápis/borracha especial que pode seguir instruções. Essas instruções são bastante simples: o lápis pode ler um símbolo na fita e, analisando-o, pode apagá-lo e escrever por cima do símbolo lido e, mudando de estado, pode se mover para a direita ou para a esquerda para analisar um novo símbolo, ou simplesmente parar.
Figura 4: Fita representando uma Máquina de Turing
Existe uma afirmação heurística, conhecida como Tese de Church, que diz que tudo o que pode ser programado algoritmicamente pode também ser realizado por uma máquina de Turing. Existem máquinas de Turing determinísticas e não-determinísticas. As determinísticas são aquelas que quando estão em certo estado, lendo certo dado, podem se movimentar de um único modo rumo à próxima configuração; já as nãodeterminísticas podem se mover para diversas configurações, a partir do dado lido e da configuração interna atual. Evidentemente as máquinas determinísticas formam uma subclasse das não-determinísticas.
13
Que ligação afinal existe entre máquinas de Turing e linguagen l inguagens? s? Em termos breves, se L é uma linguagem sobre um alfabeto S, isto é, se L é um subconjunto finito de seqüências de letras de S, dizemos que uma máquina de Turing M aceita a linguagem L se para toda palavra construída com as letras de S colocada como entrada (input), após o processamento M entra em um estado de aceitação (respondendo de algum modo sim) se a palavra pertencer à linguagem. A palavra é recusada por M se, após o processamento M entra num estado de rejeição (respondendo não de algum modo) ou se ela falhar em completar seu processo computacional. Neste contexto, o problema P versus NP assume a seguinte forma: É verdade que toda linguagem aceita em tempo polinomial por uma máquina de Turing não-determinística é também aceita, em tempo polinomial, por uma máquina determinística? Quais conseqüências a resolução positiva desta conjectura pode trazer? Destacamse três: •
• •
A existência de algoritmos úteis para uma série de problemas computacionais computacionais práticos nas indústrias; A destruição da segurança nas transações financeiras feitas eletronicamente; A quebra no sigilo de trocas de informações diplomáticas, Internet, etc.
A possível destruição dos códigos de segurança se deve ao fato de que a maioria dos algoritmos criptográficos são construídos sobre a hipótese da i mpossibilidade de uma criptoanálise em tempo polinomial.
14
6 CARÁTER NP-COMPLETO Talvez a razão mais forte pela qual os cientistas da computação teoria acreditam que P NP seja a existência da classe de problemas “NP - Completos”. Essa classe tem a surpreendente propriedade de que, se qualquer problema NP Completo pode ser resolvido em tempo polinomial, então todo problema em NP tem uma solução polinomial, isto é, P = NP. Entretanto, apesar de anos de estudo, nenhum algoritmo de tempo polinomial jamais foi descoberto para qualquer problema NP - Completo.
6.1
REDUTIBILIDADE
Considere as seguintes suposições: Suposição 1: Tem-se um problema de decisão A que se deseja resolver em tempo polinomial. Chama-se de instância a entrada para um determinado problema. Suposição 2:Existe um problema de decisão diferente B, que já se sabe como resolver em tempo polinomial. Suposição 3:Tem-se um procedimento que transforma qualquer instância α de A em alguma instância β de B com as seguintes características: •
A transformação demora tempo polinomial.
•
As respostas são as mesmas, isto é, a resposta para α é “sim” se e somente se a resposta para β também é sim.
Chama-se tal procedimento de algoritmo de redução de tempo polinomial e este oferece um meio para resolver o problema A em tempo polinomial (pode ser observado na figura 5): 1 Dada uma instância instânci a α do problema A, use o algoritmo de redução de tempo polinomial para transformá-la em uma instância β do problema B. 2 Execute o algoritmo algorit mo de decisão de tempo polinomial para B sobre a instância β.
15
3 Use a resposta de β como a resposta para α.
Figura 5: redução de problemas
Exemplo: o problema de resolver equações lineares em um x indeterminado se reduz ao problema de resolver equações quadráticas. Dada uma instância ax + b = 0, transforma-se essa instância em 0x 2 + ax + b = 0, cuja solução fornece uma solução para ax + b = 0 Desse modo, se um problema A se reduz a outro problema B, então A não é, em certo sentido, “mais difícil de resolver” que B. O caráter NP - Completo C ompleto consiste em mostrar o quanto um problema é difícil, em vez de mostrar o quanto ele é fácil. Para isso, usam-se reduções de tempo polinomial polinomial da maneira oposta. As reduções de tempo polinomial proporcionam um meio formal de mostrar que um problema é pelo menos tão difícil quanto outro, até dentro de um fator de tempo polinomial isto é, se , então L1 não é mais que um fato polinomial mais difícil que L2, e esse é o motivo pelo qual a notação “menor que ou igual a” para redução é mnemônica. Uma linguagem
é NP – Completa se
Se uma linguagem L satisfaz à propriedade 2, mas não necessariamente à propriedade 1, diz-se que L é NP – Difícil (ou NP - Árduo).
16
6.2
IMPORTÂNICA DO CARÁTER NP – COMPLETO
Teorema: se qualquer problema NP – Completo pode ser resolvido em tempo polinomial, então P = NP. Se qualquer problema em NP não pode ser resolvido em tempo polinomial, então nenhum problema NP – Completo pode ser resolvido em tempo polinomial.
Prova: suponha que L
P e também que L
NPC. Para qualquer
NP, temos
L pela propriedade 2 do caráter NP – Completo citada no tópico anterior. Desse modo, pelo Lema abaixo, também se tem que P, o que prova o primeiro enunciado do teorema. A prova do segundo enunciado é contra positivo do primeiro enunciado.
17
7 HIERARQUIA DAS COMPLEXIDADES Não se sabe se P = NP, mas a maioria dos pesquisadores acredita que P e NP não são a mesma classe. Intuitivamente, a classe P consiste em problemas que podem ser resolvidos com rapidez a classe NP consiste em problemas para os quais uma solução pode ser verificada rapidamente. Logicamente, é mais difícil resolver um problema a partir do início que verificar uma solução apresentada com clareza, em especial quando se trabalha sob restrições de tempo. Muitas outras perguntas fundamentais fundamentai s além da pergunta de P NP permanecem não resolvidas. Apesar de muitas pesquisas, não se sabe ao certo se a classe NP é fechada sob o complemento, ou seja, L
NP implica
NP?
Pode-se definir a classe de complexidade co – NP como o conjunto de linguagens L tais que NP. A questão de saber se NP é fechada sob o complemento pode ser redefinida como se NP = co – NP. Tendo em vista que P é fechada sob o complemento, ou seja, se L P, então P, decorre que P NP co – NP porém, não se sabe se P = NP co – NP ou se existe alguma linguagem em NP co- NP – P. A figura abaixo mostra as possíveis relações:
18
7.1
OUTRAS CLASSES DE COMPLEXIDADE
Assim como a classe co – NP, outras classes surgiram ao redor de P e NP. Por exemplo, as classes Dlog - Espaço e P-Espaço. Todos os problemas que podem ser resolvidos em tempo polinomial utilizam requisitos polinomiais de espaço e memória. A veracidade da recíproca, porém, é ainda uma questão em aberto, ou seja, estabelecer a existência de problemas cuja solução pode ser obtida com requisito de espaço polinomial. A classe Dlog – Espaço é formada pelos problemas que, para sua solução, adicionalmente ao espaço utilizado para os dados da instância, têm requisitos limitados por uma função logarítmica nos dados de entrada, enquanto os problemas da classe P – Espaço, têm requisitos de espaço polinomial. É trivial notar que Dlog – Espaço P NP P – Espaço e conjectura conject ura - se que cada uma destas inclusões é própria.
Figura 9: Hierarquia de Problemas
19
8 PROBLEMAS P E NP Divisão dos problemas: •
Problemas Fáceis são resolvidos por algoritmos polinomiais
• Problemas Difíceis somente possuem algoritmos exponenciais para resolvê-
los.
8.1 •
PROBLEMAS FAMOSOS
Algoritmos Polinomiais: função de complexidade é O(p(n)), onde p(n) é um polinômio.
Exemplos: 1 2 3 4
•
Algoritmos com pesquisa binária (O(log n)); Pesquisa seqüencial (O(n)); Ordenação por inserção (O(n 2)); Multiplicação de matrizes (O(n3)).
Algoritmos exponenciais: exponenciais: função de complexidade é O(c n), c > 1.
Exemplos: 1 Problema do caixeiro viajante (O(n!)); 2 Torres de Hanói (O(2n)).
20
8.1.1 Caminho em um Grafo Considere um grafo com peso nas arestas, dois vértices i, j e um inteiro k > 0, como mostra a figura 9:
Figura 10:
•
Fácil: Existe um caminho de i até j com peso
k?
Existe um algoritmo eficiente com complexidade de tempo tempo O (A log l og V), sendo A o número de arestas e V o número de vértices (algoritmo de Dijkstra) •
Difícil: Existe um caminho de i até j com peso
k?
Não existe algoritmo eficiente. É equivalente ao problema do caixeiro viajante em termos de complexidade.
8.1.2 Coloração de um Grafo Grafo Em um grafo G = (V, A), mapear , sendo S um conjunto finito de cores tal que se então c(v) c(w), ou seja, vértices adjacentes possuem cores distintas. O número cromático X(G) de G é o menor número de cores necessário para colorir G, isto é, o menor k para o qual existe uma coloração C para G e |C(V)| = k. O problema é produzir uma coloração ótima, que é a que usa apenas X(G) cores.
21
Figura 11: exemplo de coloração de um grafo
Formulação do tipo “sim/não”: dados G e um inteiro positivo k, existe uma coloração de G usando k cores? •
Fácil: k = 2
•
Difícil: k > 2
Uma aplicação para este problema na otimização de compiladores: escalonar o uso de um número finito de registradores (idealmente o número mínimo). No trecho de programa a ser otimizado, cada variável tem intervalos de tempo em que seu valor tem de permanecer inalterado, como depois de inicializada e antes do uso final. As variáveis com interseção nos tempos de vida útil não podem ocupar o mesmo registrador. Modelagem por grafo: os vértices representam variáveis e cada aresta liga duas variáveis que possuem interseção nos tempos de vida. A coloração dos vértices atribui cada variável a um agrupamento (ou classe). Duas variáveis com a mesma cor não colidem, podendo assim ser atribuídas ao mesmo registrador. Evidentemente, não existe conflito se cada vértice for colorido com uma cor distinta. Porém, o objetivo é encontrar uma coloração usando o mínimo de cores, pois os computadores têm um número limitado de registradores. Uma outra aplicação do problema da coloração de grafos: suponha que os exames finais de um curso tenham de ser realizados em uma única semana. As disciplinas
22
com alunos de cursos diferentes devem ter seus exames marcados em horários diferentes. Dada uma lista de todos os cursos e outra lista de todas as disciplinas cujos exames não podem ser marcados no mesmo horário, o problema em questão pode ser modelado como um problema de coloração de grafos.
8.1.3 Ciclo de Hamilton O ciclo de Hamilton é um ciclo simples, ou seja, passa por todos os vértices uma única vez. O caminho de Hamilton é um caminho simples, ou seja, passa por todos os vértices uma única vez.
Figura 12: grafo hamiltoniano
Exemplo de ciclo de Hamilton de acordo com a figura acima: 0 1 4 2 3 0. Exemplo de caminho de Hamilton de acordo com a figura acima: 0 1 4 2 3. Problema: Existe um ciclo de Hamilton no grafo G? •
Fácil: grafos com grau máximo = 2, ou seja, vértices com no máximo duas arestas incidentes i ncidentes..
•
Difícil: grafos com grau > 2.
Uma justificativa para a resposta SIM pode ser obtida exibindo-se um ciclo C de G e reconhecendo-se que C é de fato hamiltoniano.
23
Uma justificativa para a resposta NÃO (mais difícil) pode ser apresentada listando-se todos os ciclos simples de G e verificando-se que nenhum deles é hamiltoniano.
Figura 13:
8.1.4 Cobertura de Arestas e Vértices (Vertex - Cover) Cover) Uma cobertura de arestas de um grafo G = (V,A) é um subconjunto arestas tal modo que todo v V é parte de pelo menos uma aresta de A’.
de k
Figura 14:
O conjunto resposta para k = 4 é Uma cobertura de vértices é um subconjunto V’
. V tal que se (u,v)
A então
, isto é, cada aresta do grafo é incidente em um dos vértices de V’. Na figura acima, o conjunto resposta é:
, para k = 3.
24
Figura 15: exemplo de cobertura de
Dados um grafo e um inteiro > 0 •
Fácil: há uma cobertura de arestas
•
Difícil: há uma cobertura de vértices
k? k?
8.1.5 Problema da Satisfabilidade (SAT) Considere um conjunto de variáveis booleanas x 1, x2, ..., xn, que podem assumir valores lógicos verdadeiro ou falso. f also. A negação de x i é representada por x i’. Expressão booleana: variáveis booleanas e operações OU (v) e E(^), também chamadas respectivamente de adição e multiplicação. Uma expressão booleana E contendo um produto de adições de variáveis booleanas é dita estar na forma normal conjuntiva. Problema: Dada E na forma normal conjuntiva, com variáveis xi, 1 i n, existe uma atribuição de valores verdadeiro ou falso ás variáveis que torne E verdadeira, ou seja que satisfaça a expressão? Exemplo: E1 = (x1 v x2) ∧ (x1 v x3’ v x2) ∧ (x3) é satisfatível se x1 = F, x2 = V, x3 = V.
25
E2 = x1 ∧ x1’ não é satisfatível. Uma aplicação para esse problema é na definição de circuitos elétricos combinatórios que produzam valores lógicos como saída e sejam constituídos de portal lógicas E, OU e NÃO.
Figura 16: Circuito
Neste caso, o mapeamento é direto, pois o circuito pode ser descrito por uma expressão lógica na forma f orma normal conjuntiva.
8.1.6 Clique de um Grafo Clique de um grafo G = (V,A) é constituído do subconjunto V’
Todo par de vértices de V’ é adjacente (V’ é um subgrafo completo). Exemplo de cardinalidade 3 para o grafo abaixo é: V’ = {3, 1, 4}.
V, tal que
26
Figura 17: clique
O problema de identificar agrupamentos de objetos relacionados freqüentemente se reduz a encontrar grandes cliques em grafos. Exemplo: uma empresa de fabricação de peças por meio de injeção plástica que fornece para diversas outras empresas montadoras. Para reduzir o custo relativo ao tempo de preparação das máquinas injetoras, pode-se aumentar o tamanho dos lotes produzidos para cada peça encomendada. Para isso, é preciso identificar os clientes que adquirem os mesmos produtos, para negociar prazos de entrega comuns e assim aumentar o tamanho dos lotes produzidos. Solução: construir um grafo com cada vértice representando um cliente e ligar com uma aresta os que adquirem os mesmos produtos. Um clique do grafo representa o conjunto de cliente que adquirem os mesmo produtos.
8.1.7 Problema da Parada É um exemplo de problema Np – difícil que não é Np – Completo. Consiste em determinar, para um algoritmo determinista qualquer A com entrada de dados E, se o algoritmo A termina ou entra em loop infinito (muito útil para compiladores). É um problema indecidível, ou seja, não há algoritmo de qualquer complexidade para resolvê-lo.
27
Figura 18:
28
9 PROVAS
9.1
TEOREMA DE COOK
Existe algum problema em NP tal que se ele for mostrado estar em P, implicaria P = NP? Teorema de Cook: Satisfabilidade (SAT) está em P se e somente se P = NP, ou seja, se existisse um algoritmo polinomial determinista para satisfabilidade, então todos os problemas em NP poderiam ser resolvidos em tempo polinomial. A prova considera dois sentidos: 1. SAT está em NP (basta apresentar um algoritmo não determinista que execute em tempo polinomial). Logo, se P = NP, então SAT está em P. 2. Se SAT está em P, então P = NP. A prova descreve como obter de qualquer algoritmo polinomial não determinista de decisão A, com entrada E, uma fórmula Q(A,E) de modo que Q é satisfatível se e somente se A termina com sucesso para E. O comprimento de tempo para construir Q é O(p 3(n) log(n)), onde n é o tamanho de E e p(n) é a complexidade de A.
9.2
PROVA DE QUE UM PROBLEMA É NP – COMPLETO
Para provar que um problema é NP - Completo são necessários os seguintes passos: 1. Mostre que o problema está em NP. 2. Mostre que um um problema NP – Completo Completo conhecido pode pode ser polinomialmente polinomialmente transformado para ele. Essa prova é possível porque Cook apresentou uma prova direta de que SAT é NP – Completo, além do fato de a redução polinomial ser transitiva.
29
Para ilustrar como um problema A pode ser provado ser NP - Completo, basta considerar um problema já provado ser NP – Completo e apresentar uma redução polinomial desse problema para A.
9.3
OUTRAS PROVAS
Aqui serão demonstradas algumas provas de alguns dos problemas mais famosos.
9.3.1 Clique ∈ NP?
(i) (ii)
A justificativa para a solução SIM é um subconjunto V’ de vértices do grafo G. Para verificar a justificativa SIM basta - verificar verific ar o tamanho do subconjunto subconjunt o apresentado, O(|V’|) – contar os vértices – e verificar se o tamanho é maior ou igual ao valor K de entrada. O(1) – uma comparação simples - verificar verific ar se existem arestas em em G entre todos os pares de vértices de V’, que pode ser feito em no máximo O(|V’| 2) – para cada vértice de V’ verificar se existem arestas para os outros.
Como tudo pode ser feito em tempo polinomial, então Clique ∈ NP. Note que |V’| < |V|, logo é polinomial na entrada do problema, não apenas no tamanho da justificativa.
9.3.2 Ciclo Hamiltoniano Hamiltoniano ∈ NP ? (i) (ii)
A justificativa para a solução SIM é uma seqüência de vértices de G Para verificar a justificativa SIM basta - verificar se cada vértice aparece aparece exatamente exatamente uma uma vez – contar quantos existem, O(n) e verificar se não há repetido, O(n) – basta marcar enquanto verifica e observar se não marcou mais de uma vez - verificar se existem arestas arestas ligando os vértices vértices consecutivos, consecutivos, O(n) – à medida que percorre a seqüência observar o valor em uma matriz de adjacência
Tudo pode ser feito em tempo polinomial, logo Ciclo Hamiltoniano ∈ NP.
30
9.3.3 Clique é NP-Completo? NP-Completo? Os dados de entrada Clique são um grafo e um inteiro positivo k. Seja C um clique do grafo. Pode-se reconhecer se C é um clique e computar seu tamanho em tempo polinomial no tamanho da entrada de Clique, logo Clique ∈ NP. É necessário agora mostrar que algum problema NP - Completo pode ser polinomialmente transformável em Clique. Vamos usar o problema de Satisfabilidade. Seja E uma expressão genérica de entrada para o problema de Satisfabilidade, contendo as cláusulas L1, L2, ..., Lp. A questão de decidir se E pode ou não ser satisfeita será transformada numa questão de decidir se um certo grafo G=(V.A) possui ou não um clique de tamanho ≥ p. O grafo G é construído da seguinte maneira: existe um vértice diferente em G para cada ocorrência de variável em E; existe uma aresta (vi, vj) em G, para cada par de variáveis xi, xj de E, tais que xi ≠ xj’, e xi, xj ocorrem em cláusulas diferentes de E. Desta forma, cada aresta (vi, vj) de G é tal que as variáveis xi e xj, correspondentes em E, estão em cláusulas diferentes e podem assumir o valor verdadeiro simultaneamente. Logo um clique em G com p vértices corresponde em E a p variáveis, uma em cada cláusula (pois não há arestas entre variáveis da mesma cláusula), que podem assumir o valor verdadeiro simultaneamente (pois não há aresta ligando variáveis x1 a x1’, x2 a x2’...). A recíproca é verdadeira. Portanto, decidir se E pode ser satisfeita é equivalente a decidir se G possui um Clique de tamanho ≥ p. A construção de G pode ser feita a partir de E em tempo polinomial com o tamanho de E. Assim, já que: (i)
Clique ∈ NP
(ii)
Satisfabilidade é NP - Completo e Satisfabilidade ∝ Clique
então, Clique é NP - Completo. C ompleto. E = (x1 ∨ x2’) ∧ (x1’ ∨ x2’ ∨ x3) ∧ (x1’ ∨ x2 ∨ x3’)
31
x1’
x1’
x2’
x2
x3
x3’
x1
x2’
Figura 19:
Note que cada clique de tamanho 3 no grafo ao lado corresponde a uma atribuição de Verdadeiro às variáveis correspondentes em E de tal forma que E seja satisfeita. Em particular o clique mostrado diz que se x1 = V, x2’ = V e x3’ = V, então E = V. Ou seja, uma solução é x1 = V, x2 = F e x3 = F.
9.3.4 Problema de decisão do Caixeiro Viajante é NP Completo ? Este problema de decisão consiste em se determinar se há um ciclo que passa por todos os vértices apenas uma vez com peso total no máximo um valor k. Precisamos mostrar que este problema é NP e que algum NP - Completo se reduz a ele. Para isto usaremos o problema NP - Completo Ciclo Hamiltoniano. (i) Decisão do Caixeiro Viajante é NP A exibição da justificativa SIM pode ser dada por uma seqüência de vértices. A verificação da justificativa apresentada consiste em se verificar que cada vértice aparece na seqüê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, descobrir cada peso é O(1) se os dados estão em uma matriz de adjacência. Como o algoritmo é polinomial, então o problema é da classe NP.
32
(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 e arestas de G. Atribuímos peso 1 a todas estas arestas. 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. b
b
2
f
a e
d
1
a 2
c
1 1
2
2
1c 1
2 1 1
d
G
f 2 2
1
e
O ciclo {a,b,c,d,e,f,a} em G’ tem peso total 6, e representa um ciclo hamiltoniano em G, um grafo de 6 vértices.
G’ Figura 20:
Logo, como - Decisão do Caixeiro Viajante é NP; - Decisão do Ciclo Hamiltoniano ∝ Decisão do Caixeiro Viajante; - Decisão do Ciclo C iclo Hamiltoniano é NP-Completo (não foi mostrado neste texto); então Decisão do Caixeiro Viajante é NP-Completo.
9.3.5 Problema de Otimização do Caixeiro Viajante é NPDifícil? Já foi mostrado que o problema de decisão do caixeiro viajante é NP - Completo. Portanto, encontrar um ciclo em um grafo G que passe por todos os vértices, sem repetição, com peso total no máximo k , é NP - Completo. Se resolver o problema de otimização do caixeiro viajante para este grafo G, o peso total p do ciclo encontrado é o menor valor possível. Se p ≤ k, então o problema de decisão tem resposta SIM. Se p > k então o problema de decisão tem reposta NÃO. Logo, é possível
33
transformar polinomialmente Decisão do Caixeiro Viajante em Otimização do Caixeiro Viajante, já que a transformação da entrada – o grafo é o mesmo - e da saída – uma comparação – é O(1). Como a decisão é NP - Completo, então a otimização do caixeiro viajante é NP - Difícil.
9.3.6 Halting problem é NP - Difícil ? Um exemplo de um problema NP - Difícil que não é NP - Completo é o problema de parada (halting problem). O problema consiste em se decidir para qualquer algoritmo e qualquer entrada se o algoritmo vai terminar ou entrar em loop infinito. Para mostrar que halting problem é NP - Difícil, mostraremos que SAT ∝ halting problem. A entrada do algoritmo é a expressão E com n variáveis. O algoritmo testa as 2 n possibilidades de valores para as variáveis. Se algum delas satisfizer a expressão E, o algoritmo pára. Senão, entra em loop infinito. Claramente um algoritmo para halting problem resolve o problema de satisfabilidade, ou seja, se fosse feito um algoritmo para halting problem, ele poderia ser usado para resolver satisfabilidade. Logo, halting problem é NP - Difícil. Mas este problema é indecidível, não há algoritmo de qualquer complexidade que o resolva. Então ele não é NP. Logo não pode ser NP Completo.
34
10 PROBLEMAS EXPONENCIAIS
É desejável resolver instâncias grandes de problemas de otimização em tempo razoável. Os melhores algoritmos para problemas NP – Completo têm comportamento de pior caso exponencial no tamanho da entrada. Para um algoritmo que execute em tempo proporcional a 2 n, não é garantido obter resposta para todos os problemas de tamanho n > 100. Independente da velocidade do computador, ninguém poderia esperar por um algoritmo que leva 2 100 passos para terminar uma tarefa. Um supercomputador poderia resolver um problema de tamanho n = 50 em 1 hora, ou n = 51 em 2 horas, ou n = 59 em 1 ano. Nem um computador paralelo com um milhão de processadores (cada um sendo um milhão de vezes mais rápido que o mais rápido existente) é suficiente para n = 100. O que fazer então para resolver problemas exponenciais? •
•
•
Usar algoritmos exponenciais “eficientes” aplicando técnicas de tentativa e erro; Usar algoritmos aproximados. Acham uma resposta que pode não ser a solução ótima, mas é garantido ser próxima dela; Concentrar no caso médio. Buscar algoritmos melhores que outros neste quesito e que funcionem bem para as entradas de dados que ocorrem usualmente na prática. Porém, existem poucos algoritmo exponenciais que mão muito úteis. Um exemplo é o Simplex (Programação Linear): a complexidade de tempo é exponencial no pior, mas é muito rápido na prática. Esses exemplos são muito raros, pois a grande maioria dos algoritmos exponenciais conhecidos não é muito útil.
35
10.1 ALGORITMOS APROXIMADOS PARA PROBLEMAS PROBLEMAS NP NP – COMPLETOS
Para projetar algoritmos polinomiais para “resolver” um problema de otimização Np – Completo é necessário relaxar o significado de resolver. Para isso, deve-se remover a exigência de que o algoritmo tenha sempre de obter a solução ótima. Procura-se algoritmos eficientes que não garantem obter a solução ótima, mas sempre obtêm uma próxima da ótima. Tal solução, com uma valor próximo da ótima, é chamada de solução aproximada. Um algoritmo aproximado para um problema π é um algoritmo que gera soluções aproximadas para π, para ser útil, é importante obter um limite para a razão entre a solução ótima e a produzida pelo algoritmo aproximado. O comportamento de algoritmo aproximados quanto à qualidade dos resultados (não o tempo para obtê-los) tem de ser monitorado. Seja I uma instância de um problema
π
e seja S*(I) o valor da solução ótima para I.
Um algoritmo aproximado gera uma solução possível para I cujo valor S(I) é maior (pior) do que o valor ótimo S*(I). Dependendo do problema, a solução a ser obtida pode minimizar ou maximizar S(I). No caso do algoritmo aproximado obter a solução ótima, então S(I) = S*(I). Um algoritmo aproximado para um problema uma solução S(I) para uma instância I de π.
π
é um algoritmo polinomial que produz
O comportamento do algoritmo A é descrito pela razão de aproximação:
que representa um problema de minimização. No caso de maximização, a razão é invertida. Em ambos o casos, Ra(I) >= 1.
36
11 CONLUSÃO De uma forma geral, abordou-se as principais definições iniciais sobre os problemas NP - completos. Todos os conceitos relacionados aqui são extremamente importantes para o entendimento da teoria sobre NP -Completude. A necessidade de se compreender as características desses problemas, os relacionamentos entre eles, e as técnicas utilizadas para a definição formal do tipo de problema são muito importantes para que, na prática, não se tente resolver um problema aparentemente parecido com outros problemas que são facilmente solucionáveis, mas que no fundo oferecem uma dificuldade muito superior e acabam por inviabilizar qualquer implementação que tente encontrar a solução exata.
É importante conhecer os rudimentos dessa teoria para que se possa identificar um problema como NP ou NP - completo. Dessa forma, terá uma boa evidência da intratabilidade do mesmo. Seu tempo será melhor se desenvolver um algoritmo de aproximação ou resolvendo um caso especial tratável, ao invés de procurar por um algoritmo rápido que resolva o problema exatamente. Outra forma de se tentar resolver o problema, além da utilização de algoritmos de aproximação e da restrição da entrada do problema, é utilizar o método "força bruta", onde se testa todas as possibilidades, e se sabe que ele vai funcionar para até um certo tamanho, para o qual se consegue esperar. Passou daquele tamanho, não se consegue mais. Podese utilizar este método porque se consegue verificar o resultado em tempo polinomial.
37
12 REFERÊNCIAS REFERÊNCIAS
ALMEIDA, Charles Ornelas; ZIVIANI, Nivio. Problemas NP - Completo e Algoritmos Aproximados. Aproximados. Belo Horizonte, 2004. Disponível em: < http://www.dcc.ufmg.br/algoritmos/cap9/transp/completo1/cap9.pdf> Acesso em: 16 nov. 2006. ALOISE, Dário José. Problemas NP - Completos. Completos. Natal, 2002. Disponível em: < http://muriu.dimap.ufrn.br/~dario/arquivos/Cap4_Grafos-2001.pdf> Acesso em: 16 nov. 2006. CAMPELLO, Ruy Eduardo; MACULAN, Nelson. Algoritmos e Heurísticas: Desenvolvimento Desenvolvimento e Avaliação de Performande. Performande. Niterói - RJ: Eduff, 1994. COOK, Sthepen. The P versus NP Problem. Problem. Disponível em: < http://www.claymath.org/millennium/P_vs_N http://www.claymath.org/millennium/P_vs_NP/pvsnp.pdf> P/pvsnp.pdf> Acesso em: 04 nov. 2006. CORMEN, Thomas H.; LEISERSON, Charles E.; RIVEST, Ronald L. Algoritmos: Teoria e Prática. Rio de Janeiro: Campus, 2002. FARIA, João Pascal. A classe de problemas NP. NP . Porto - Portual, 2006. Disponível em: < http://paginas.fe.up.pt/~jpf/tea http://paginas.fe.up.pt/~jpf/teach/CES0506/NP.pd ch/CES0506/NP.pdf> f> Acesso em: 16 nov. 2006. FERREIRA, Fernando. Fernando. O problema P versus NP. NP . Lisboa - Portual, 2006. Disponível em: < http:// www.ciul.ul.pt/~ferferr/PversusNP.pdf www.ciul.ul.pt/~ferferr/PversusNP.pdf > Acesso em: 16 nov. 2006. FIGUEIREDO, José César Abrantes de. NP - Completude. Completude. Lisboa - Portual, 2006. Disponível em: < http://paginas.fe.up.pt/~jpf/teach http://paginas.fe.up.pt/~jpf/teach/CES0506/NP.pd /CES0506/NP.pdff > Acesso em: 04 nov. 2006. GOODROCH, Michael; TAMASSIA, Roberto. Algorithm Design: Foundation, Analysis and Internet Examples. John Wiley & Sons Inc. GUIMARÃES, Daniele Constant. Problemas NP-Completos II. II . Campinas, 2003. Disponível em: <
38
http://www.ic.unicamp.br/~meidanis/course http://www.ic.unicamp.br/~meidanis/courses/mo417/2003 s/mo417/2003s1/aulas/2003 s1/aulas/2003-06-18.html -06-18.html > Acesso em: 04 nov. 2006. MALAGUTTI, Pedro Luiz Aparecido. P versus NP. NP. São Carlos, 2002. Disponível Dis ponível em: < http://www.dm.ufscar.br/hp/hp501/hp501001/hp501001.html> Acesso em: 04 nov. 2006. MANBER, Udi. Introduction to Algorithms: Algorithms: A Creative Approach. São Paulo: Addison Wesley, 1989. TOSCANI, Laria V.; VELOSO, Paulo S. Complexidade de Algorimos. Algorimos. SagraLuzzato, 2005.
39
ANEXOS
40
ANEXO A – LISTA DE EXERCÍCIOS Exercício 01: Marque V ou F: ( ) Se existir um algoritmo polinomial que determine o tamanho de um “clique” máximo de um dado grafo, então P=NP. ( ) Se A pertence a P então também pertence a NP. ( ) Existem problemas de decisão que não pertencem nem a NP nem a co-NP. ( ) Se descobrisse um algoritmo polinomial para o problema do ciclo hamiltoniano, então todos os problemas da classe co-NP passariam também a ter um algoritmo polinomial. Exercício 02: Defina as classes de complexidade P e NP. Exercício 03 Liste 3 exemplos de problemas P. Exercício 04 Liste 3 exemplos de problemas NP. Exercício 05 Dependendo do tamanho da entrada, os problemas exponenciais podem demorar muito para apresentar uma solução. O que fazer para resolver esses problemas? Exercício 06 Qual a importância de estudar a teoria NP – Completude?