Quais são as diferenças entre NP , NP-Complete e NP-Hard ?
Estou ciente de muitos recursos em toda a web. Gostaria de ler suas explicações, e o motivo é que elas podem ser diferentes do que está lá fora, ou há algo que eu não conheço.
Quais são as diferenças entre NP , NP-Complete e NP-Hard ?
Estou ciente de muitos recursos em toda a web. Gostaria de ler suas explicações, e o motivo é que elas podem ser diferentes do que está lá fora, ou há algo que eu não conheço.
Respostas:
Suponho que você esteja procurando definições intuitivas, já que as definições técnicas requerem algum tempo para serem entendidas. Antes de tudo, vamos lembrar de um conceito preliminar necessário para entender essas definições.
Agora, vamos definir essas classes de complexidade .
P é uma classe de complexidade que representa o conjunto de todos os problemas de decisão que podem ser resolvidos em tempo polinomial .
Ou seja, dada uma instância do problema, a resposta sim ou não pode ser decidida em tempo polinomial.
Exemplo
Dado um gráfico conectado G
, seus vértices podem ser coloridos usando duas cores para que nenhuma aresta seja monocromática?
Algoritmo: comece com um vértice arbitrário, pinte de vermelho e todos os seus vizinhos de azul e continue. Pare quando você ficar sem vértices ou forçado a criar uma aresta com os dois pontos de extremidade da mesma cor.
NP é uma classe de complexidade que representa o conjunto de todos os problemas de decisão para os quais as instâncias em que a resposta é "sim" têm provas que podem ser verificadas em tempo polinomial.
Isso significa que, se alguém nos fornecer uma instância do problema e um certificado (às vezes chamado de testemunha), com a resposta afirmativa, podemos verificar se está correto em tempo polinomial.
Exemplo
A fatoração de número inteiro está em NP. Esse é o problema que forneceu números inteiros n
e m
, existe um número inteiro f
com 1 < f < m
tal que f
divide n
( f
é um fator pequeno de n
)?
Este é um problema de decisão porque as respostas são sim ou não. Se alguém nos fornecer uma instância do problema (para entregar números inteiros n
e m
) e um número inteiro f
com 1 < f < m
, e alegar que esse f
é um fator de n
(o certificado), podemos verificar a resposta em tempo polinomial executando a divisão n / f
.
NP-Complete é uma classe de complexidade que representa o conjunto de todos os problemas X
em NP para o qual é possível reduzir qualquer outro problema NP Y
para X
em tempo polinomial.
Intuitivamente, isso significa que podemos resolver Y
rapidamente se soubermos resolver X
rapidamente. Precisamente, Y
é redutível a X
, se houver um algoritmo de tempo polinomial f
para transformar instâncias y
de Y
em instâncias x = f(y)
de X
em tempo polinomial, com a propriedade que a resposta y
é sim, se e somente se a resposta f(y)
for sim.
Exemplo
3-SAT
. Este é o problema em que nos é dada uma conjunção (ANDs) de disjunções de 3 cláusulas (ORs), declarações do formulário
(x_v11 OR x_v21 OR x_v31) AND
(x_v12 OR x_v22 OR x_v32) AND
... AND
(x_v1n OR x_v2n OR x_v3n)
onde cada x_vij
uma é uma variável booleana ou a negação de uma variável de uma lista predefinida finita (x_1, x_2, ... x_n)
.
Pode ser demonstrado que todo problema de NP pode ser reduzido para 3-SAT . A prova disso é técnica e requer o uso da definição técnica de NP ( baseada em máquinas de Turing não determinísticas ). Isso é conhecido como teorema de Cook .
O que torna os problemas de NP completos importantes é que, se um algoritmo de tempo polinomial determinístico pode ser encontrado para resolver um deles, todo problema de NP é solucionável em tempo polinomial (um problema para governar todos eles).
Intuitivamente, esses são os problemas que são pelo menos tão difíceis quanto os problemas completos do NP . Observe que problemas difíceis de NP não precisam estar no NP e não precisam ter problemas de decisão .
A definição precisa aqui é que um problema X
é NP-difícil, se houver um problema NP-completo Y
, tal queY
seja redutível X
em tempo polinomial .
Porém, como qualquer problema completo de NP pode ser reduzido a qualquer outro problema completo de NP em tempo polinomial, todos os problemas completos de NP podem ser reduzidos a qualquer problema difícil de NP em tempo polinomial. Então, se houver uma solução para um problema difícil de NP em tempo polinomial, haverá uma solução para todos os problemas de NP em tempo polinomial.
Exemplo
O problema de parada é um problema difícil de NP. Esse é o problema que, dado um programa P
e informações I
, ele será interrompido? Este é um problema de decisão, mas não está no NP. É claro que qualquer problema de NP-completo pode ser reduzido a esse. Como outro exemplo, qualquer problema de NP-completo é NP-difícil.
Meu problema NP-completo favorito é o problema do Campo Minado .
Esse é o problema mais famoso da ciência da computação e uma das questões mais importantes em destaque nas ciências matemáticas. De fato, o Clay Institute está oferecendo um milhão de dólares para uma solução para o problema (a redação de Stephen Cook no site da Clay é bastante boa).
É claro que P é um subconjunto de NP. A questão em aberto é se os problemas de NP têm ou não soluções de tempo polinomial determinísticas. Acredita-se amplamente que não. Aqui está um excelente artigo recente sobre o mais recente (e a importância) do problema P = NP: O status do problema P versus NP .
O melhor livro sobre o assunto é Computers and Intratability de Garey e Johnson.
Eu estive olhando ao redor e vendo muitas explicações longas. Aqui está um pequeno gráfico que pode ser útil para resumir:
Observe como a dificuldade aumenta de cima para baixo: qualquer NP pode ser reduzido a NP-Complete e qualquer NP-Complete pode ser reduzido a NP-Hard , tudo em tempo P (polinomial).
Se você puder resolver uma classe de problema mais difícil no tempo P, isso significa que você descobriu como resolver todos os problemas mais fáceis no tempo P (por exemplo, provar P = NP, se você descobrir como resolver qualquer problema NP-Completo em P time).
____________________________________________________________ | Tipo de problema | Verificável em tempo P | Solúvel em tempo P | Dificuldade crescente ___________________________________________________________ | | | P Sim Sim | | NP Sim Sim ou não * | | | NP-Completo | Sim Desconhecido | | NP-Hard | Sim ou não ** | Desconhecido *** | | ____________________________________________________________ V
Notas Yes
ou No
entradas:
Também achei esse diagrama bastante útil para ver como todos esses tipos se correspondem (preste mais atenção à metade esquerda do diagrama).
Esta é uma resposta muito informal à pergunta feita.
3233 pode ser escrito como o produto de dois outros números maiores que 1? Existe alguma maneira de percorrer um caminho em torno de todas as Sete Pontes de Königsberg sem tomar nenhuma ponte duas vezes? Estes são exemplos de perguntas que compartilham uma característica comum. Pode não ser óbvio como determinar com eficiência a resposta, mas se a resposta for sim, haverá uma prova curta e rápida de verificação. No primeiro caso, uma fatoração não trivial de 51; no segundo, uma rota para caminhar pelas pontes (ajustando as restrições).
Um problema de decisão é uma coleção de perguntas com respostas sim ou não que variam apenas em um parâmetro. Diga o problema COMPOSITE = {"É n
composto": n
é um número inteiro} ou EULERPATH = {"O gráfico G
possui um caminho de Euler?": G
É um gráfico finito}.
Agora, alguns problemas de decisão se prestam a algoritmos eficientes, se não óbvios. Euler descobriu um algoritmo eficiente para problemas como as "Sete Pontes de Königsberg", mais de 250 anos atrás.
Por outro lado, para muitos problemas de decisão, não é óbvio como obter a resposta - mas se você souber alguma informação adicional, é óbvio como provar que tem a resposta certa. COMPOSITE é assim: a divisão de teste é o algoritmo óbvio e é lento: para fatorar um número de 10 dígitos, você deve tentar algo como 100.000 divisores possíveis. Mas se, por exemplo, alguém lhe disser que 61 é um divisor de 3233, a divisão longa simples é uma maneira eficiente de verificar se estão corretas.
A classe de complexidade NP é a classe de problemas de decisão em que as respostas "sim" têm um estado curto, rápido para verificar as provas. Como COMPOSTO. Um ponto importante é que essa definição não diz nada sobre a dificuldade do problema. Se você tiver uma maneira correta e eficiente de resolver um problema de decisão, basta escrever as etapas da solução.
A pesquisa de algoritmos continua e novos algoritmos inteligentes são criados o tempo todo. Um problema que talvez você não saiba como resolver com eficiência hoje pode ter uma solução eficiente (se não óbvia) amanhã. De fato, foram necessários pesquisadores até 2002 para encontrar uma solução eficiente para o COMPOSITE! Com todos esses avanços, é preciso se perguntar: será que ter provas curtas é apenas uma ilusão? Talvez todo problema de decisão que se presta a provas eficientes tenha uma solução eficiente? Ninguém sabe .
Talvez a maior contribuição para esse campo tenha sido a descoberta de uma classe peculiar de problemas de PN. Ao brincar com os modelos de circuito para computação, Stephen Cook encontrou um problema de decisão da variedade NP que era provavelmente tão difícil ou mais difícil do que qualquer outro problema NP. Uma solução eficiente para o problema de satisfação booleana pode ser usada para criar uma solução eficiente para qualquer outro problema no NP. Logo depois, Richard Karp mostrou que vários outros problemas de decisão poderiam servir ao mesmo propósito. Esses problemas, em certo sentido os problemas "mais difíceis" do NP, ficaram conhecidos como problemas completos do NP .
Obviamente, NP é apenas uma classe de problemas de decisão. Muitos problemas não são declarados naturalmente desta maneira: "encontre os fatores de N", "encontre o caminho mais curto no gráfico G que visita todos os vértices", "forneça um conjunto de atribuições de variáveis que tornam verdadeira a seguinte expressão booleana". Embora se possa falar informalmente sobre alguns desses problemas estarem "em NP", tecnicamente isso não faz muito sentido - eles não são problemas de decisão. Alguns desses problemas podem até ter o mesmo tipo de poder que um problema completo de NP: uma solução eficiente para esses problemas (sem decisão) levaria diretamente a uma solução eficiente para qualquer problema de NP. Um problema como esse é chamado de NP-hard .
P (Tempo Polinomial): Como o próprio nome sugere, estes são os problemas que podem ser resolvidos no tempo polinomial.
NP (Tempo não determinístico-polinomial): Estes são os problemas de decisão que podem ser verificados no tempo polinomial. Isso significa que, se eu afirmar que existe uma solução de tempo polinomial para um problema específico, você me pede para provar isso. Então, darei a você uma prova que você pode verificar facilmente em tempo polinomial. Esses tipos de problemas são chamados de problemas de NP. Observe que, aqui não estamos falando sobre se existe ou não uma solução de tempo polinomial para esse problema. Mas estamos falando em verificar a solução para um determinado problema em tempo polinomial.
NP-Hard: Estes são pelo menos tão difíceis quanto os problemas mais difíceis no NP. Se pudermos resolver esses problemas em tempo polinomial, podemos resolver qualquer problema de NP que possa existir. Observe que esses problemas não são necessariamente problemas NP. Isso significa que podemos ou não verificar a solução para esses problemas em tempo polinomial.
NP-Complete: Estes são os problemas NP e NP-Hard. Isso significa que, se pudermos resolver esses problemas, podemos resolver qualquer outro problema de PN e as soluções para esses problemas poderão ser verificadas em tempo polinomial.
Além das outras ótimas respostas, aqui está o esquema típico que as pessoas usam para mostrar a diferença entre NP, NP-Complete e NP-Hard:
A maneira mais fácil de explicar P v. NP e outras coisas sem entrar em detalhes técnicos é comparar "problemas de palavras" com "problemas de múltipla escolha".
Quando você está tentando resolver um "problema de palavras", precisa encontrar a solução do zero. Quando você está tentando resolver um "problema de múltipla escolha", tem uma opção: resolva-o como faria com um "problema de palavras" ou tente inserir cada uma das respostas que lhe foram dadas e escolha a resposta que melhor se encaixa.
Muitas vezes acontece que um "problema de múltipla escolha" é muito mais fácil do que o correspondente "problema de palavras": substituir as respostas do candidato e verificar se elas se encaixam podem exigir um esforço significativamente menor do que encontrar a resposta certa do zero.
Agora, se concordarmos com o esforço que leva tempo polinomial "fácil", a classe P consistiria em "problemas fáceis de palavras" e a classe NP consistiria em "problemas fáceis de múltipla escolha".
A essência de P v. NP é a pergunta: "Existem problemas fáceis de múltipla escolha que não são fáceis como problemas de palavras"? Ou seja, existem problemas para os quais é fácil verificar a validade de uma resposta dada, mas é difícil encontrá-la do zero?
Agora que entendemos intuitivamente o que é NP, precisamos desafiar nossa intuição. Acontece que existem "problemas de múltipla escolha" que, em certo sentido, são os mais difíceis de todos: se alguém encontrasse uma solução para um desses problemas "mais difíceis de todos", seria capaz de encontrar uma solução para TODOS. Problemas de NP! Quando Cook descobriu isso há 40 anos, foi uma surpresa completa. Esses problemas "mais difíceis de todos" são conhecidos como NP-hard. Se você encontrar uma "solução de problemas de palavras" para um deles, automaticamente encontrará uma "solução de problemas de palavras" para cada um dos "problemas fáceis de múltipla escolha"!
Finalmente, problemas NP-completos são aqueles que são simultaneamente NP e NP-difíceis. Seguindo nossa analogia, eles são simultaneamente "fáceis como problemas de múltipla escolha" e "os mais difíceis de todos como problemas de palavras".
Problemas NP-completos são aqueles NP-Hard e na classe de complexidade NP. Portanto, para mostrar que qualquer problema específico é NP-completo, você precisa mostrar que o problema está no NP e é difícil no NP.
Os problemas que estão na classe de complexidade do NP podem ser resolvidos de maneira não determinística no tempo polinomial e uma possível solução (isto é, um certificado) para um problema no NP pode ser verificada quanto à correção no tempo polinomial.
Um exemplo de solução não determinística para o problema do k-clique seria algo como:
1) selecione aleatoriamente k nós em um gráfico
2) verifique se esses nós k formam um clique.
A estratégia acima é polinomial no tamanho do gráfico de entrada e, portanto, o problema do k-clique está no NP.
Observe que todos os problemas deterministicamente solucionáveis no tempo polinomial também estão no NP.
Mostrar que um problema é difícil de NP geralmente envolve uma redução de algum outro problema difícil de NP para o seu problema usando um mapeamento de tempo polinomial: http://en.wikipedia.org/wiki/Reduction_(complexity)
Acho que podemos responder de forma muito mais sucinta. Respondi a uma pergunta relacionada e copiei minha resposta de lá
Mas primeiro, um problema difícil de NP é um problema para o qual não podemos provar que existe uma solução de tempo polinomial. A dureza NP de algum "problema-P" geralmente é comprovada pela conversão de um problema já difícil de NP já comprovado em "problema-P" em tempo polinomial.
Para responder ao restante da pergunta, primeiro você precisa entender quais problemas difíceis de NP também estão completos. Se um problema difícil de NP pertencer ao conjunto de NP, ele estará completo. Para pertencer ao conjunto NP, é necessário um problema
(i) um problema de decisão,
(ii) o número de soluções para o problema deve ser finito e cada solução deve ter comprimento polinomial; e
(iii) dada uma solução de comprimento polinomial, poderemos dizer se a resposta para a problema é sim / nãoAgora, é fácil ver que pode haver muitos problemas difíceis de NP que não pertencem ao conjunto de NP e são mais difíceis de resolver. Como exemplo intuitivo, a versão de otimização do vendedor ambulante, na qual precisamos encontrar um cronograma real, é mais difícil do que a versão de decisão do vendedor ambulante, onde precisamos apenas determinar se existe ou não um cronograma com comprimento <= k.
Existem respostas muito boas para essa pergunta em particular, então não há sentido em escrever minha própria explicação. Então, tentarei contribuir com um excelente recurso sobre diferentes classes de complexidade computacional.
Para alguém que pensa que a complexidade computacional é apenas sobre P e NP, aqui está o recurso mais exaustivo sobre diferentes problemas de complexidade computacional. Além dos problemas solicitados pelo OP, listou aproximadamente 500 classes diferentes de problemas computacionais com boas descrições e também a lista de trabalhos de pesquisa fundamentais que descrevem a classe.
Pelo que entendi, um problema np-hard não é "mais difícil" do que um problema np-complete . De fato, por definição, todo problema np-complete é:
- Introdução. aos algoritmos (3ed) de Cormen, Leiserson, Rivest e Stein, pág. 1069
I
sobren
variáveis, tente todas2^n
as atribuições possíveis para as variáveis e pare se alguém satisfizer a proposição e, caso contrário, insira um loop infinito. Vemos que esse algoritmo interrompe se e somente seI
é satisfatório. Assim, se tivéssemos um algoritmo de tempo polinomial para resolver o problema de parada, poderíamos resolver o SAT em tempo polinomial. Portanto, o problema de parada é difícil de NP.