Por que a classe NP-Complete é importante em comparação com a NP-hard?

19

Estou estudando a complexidade computacional e fiquei pensando por que os problemas do NP-Complete (NPC) são uma classe importante. Acho óbvio por que estamos interessados ​​em mostrar que um determinado problema de NP é difícil de NP.

Eu também entendo a definição de NPC, e que mostrar um determinado problema de decisão é difícil para o NP, sabendo que ele está no NP, é exatamente o que significa o NPC.

No entanto, o que não entendo é: por que esse conceito é tão importante? Certamente, se encontrarmos qualquer algoritmo NP-hard que corre no tempo P (ou não que está em NP), temos mostrado que .NP=P

Por que esse conceito é tão importante?

Amnestic
fonte
3
Removi sua segunda pergunta porque ela é completamente separada da primeira. No entanto, é uma pergunta muito boa e encorajo você a fazer uma nova pergunta. Para recuperar o texto, clique no link "editado [a qualquer momento]", que mostrará o histórico de edição e permitirá copiar e colar o texto.
David Richerby

Respostas:

16

Há pelo menos alguns motivos pelos quais o NPC é interessante:

  • A classe NP contém muitos problemas que são interessantes (tanto na prática quanto na teoria); além disso, muitos desses problemas acabam sendo NP-difíceis (e, portanto, NP-completos), mas muitos problemas fora do NP são quase certamente muito difíceis de resolver. mais do que interesse teórico , o NPC fornece um grupo (aproximado) de problemas aparentemente difíceis, mas não tão difíceis que não podemos tentar fazer algo com eles.
    Em outras palavras, o NPC é provavelmente o limite do que podemos esperar que possa ser solucionado em tempo polinomial; parece um esforço demais tentar PSPACE = P (por exemplo).
  • A classe é NP é estruturalmente interessante. É o exemplo básico de "obtemos mais velocidade computacional do não-determinismo". Então, estamos interessados ​​em P = NP ou não, e o NPC é (provavelmente) um componente importante para resolver isso.
  • NP-hard (como uma classe) é realmente muito grande e variado para lidar como uma única coisa, é tudo o que pode ser reduzido a um problema NP-completo , incluindo uma enorme quantidade de coisas fora do NP, portanto, do ponto de vista Em vista de tentar desenvolver resultados e técnicas gerais, não há nada para se agarrar.
Luke Mathieson
fonte
Como minha pergunta original foi editada para refletir o título, talvez você devesse ocultar a resposta da segunda pergunta também.
Amnestic
1
NP-hard não é "tudo fora do NP", pois inclui (pelo menos) os problemas de NP-complete no NP. Entendo o que você quer dizer, mas não sei como declarar sucintamente.
vonbrand
@ vonbrand, sim, eu exagerou bastante isso (talvez por insanidade?). A nova versão é precisa, mas infelizmente não parece.
Luke Mathieson
9

Do ponto de vista de alguém que escreve código para ganhar a vida, é importante ter uma boa familiaridade com a NP-completude:

1. Reconhecer quando você está latindo na árvore errada

Os problemas NP-completos são os mais fáceis dos problemas NP-difíceis e, no entanto, até onde sabemos, leva um tempo exponencial ao tamanho da entrada para resolver esse problema de decisão. Portanto, como uma questão prática, se você puder mostrar que o problema que está tentando resolver é difícil para o NP (normalmente, mostrando que uma solução eficiente para ele também daria uma solução eficiente para algum problema completo do NP), você sabe que você pode parar de procurar um algoritmo eficiente para resolvê-lo exatamente em geral. Em vez disso, você pode selecionar entre algoritmos conhecidos que prometem boas aproximações para problemas de otimização difíceis de NP e continuar com o restante do seu projeto.

2. Encontrando a árvore certa

Como os computadores costumam ser usados ​​para atacar problemas difíceis de NP, foram desenvolvidos solucionadores especializados que podem resolver com eficiência algumas instâncias de problemas difíceis de NP. Reconhecer que seu problema é NP-completo é o primeiro passo para encontrar uma ferramenta existente (SAT, ILP, SMT, CSP, para citar algumas) que pode ajudá-lo a encontrar soluções exatas em alguns casos em que você teria que se contentar com um problema. aproximação.

Kyle Jones
fonte
-4

"Certamente, se encontrarmos algum algoritmo NP-hard que funcione no tempo P (esteja ou não em NP), mostramos que NP = P. Por que esse conceito é tão importante?"

Todo problema de NP se reduz a qualquer problema de NPC, mas não é verdade que todo problema de NP se reduz a qualquer problema NP-hard, portanto, provar que um algoritmo NP-hard está em P não prova P = NP. Seria o caso, no entanto, para um problema de NPC, é exatamente isso que "reduz" significa. Portanto, se encontrarmos um algoritmo P para um problema de NPC, teremos provado que P = NP.

anônimo
fonte
3
XX