Perché la classe NP-Complete è importante rispetto a NP-hard?


19

Sto studiando la complessità computazionale e mi chiedevo perché i problemi NP-Complete (NPC) siano una classe importante. Trovo ovvio perché siamo interessati a mostrare che un dato problema NP è NP-difficile.

Comprendo anche la definizione di NPC e che mostrare un determinato problema decisionale è NP-difficile, sapendo che è in NP, è esattamente ciò che significa NPC.

Tuttavia, ciò che non capisco è: perché questo concetto è così importante? Sicuramente, se troviamo qualsiasi algoritmo NP-hard che viene eseguito in tempo P (o meno che è in NP), abbiamo dimostrato che .NP=P

Perché questo concetto è così importante?


3
Ho rimosso la tua seconda domanda perché è completamente separata dalla prima. Tuttavia, è un'ottima domanda e ti incoraggio a porla come una nuova domanda. Per recuperare il testo, fai clic sul link "modificato [in qualsiasi momento]", che ti mostrerà la cronologia delle modifiche e ti consentirà di copiare e incollare il testo.
David Richerby,

Risposte:


16

Ci sono almeno alcuni motivi per cui NPC è interessante:

  • La classe NP contiene molti problemi che sono interessanti (sia dal punto di vista pratico che teorico), inoltre molti di questi problemi risultano NP-difficili (e quindi NP-completi), ma molti problemi al di fuori di NP sono quasi certamente troppo difficili per essere di più che un interesse teorico , quindi NPC fornisce un (approssimativo) gruppo di problemi apparentemente difficili, ma non così difficili da non poter provare a farci qualcosa.
    In altre parole, l'NPC è probabilmente il limite di ciò che possiamo sperare possa essere risolvibile in termini di tempo polinomiale, sembrerebbe un tratto da provare per PSPACE = P (per esempio).
  • La classe è NP è strutturalmente interessante. È l'esempio di base di "otteniamo più" velocità "computazionale dal non determinismo". Quindi siamo interessati se P = NP o no, e NPC è (probabilmente) un componente importante per risolverlo.
  • NP-hard (come una classe) è davvero troppo grande e vario per essere trattato come una singola cosa, è tutto ciò che può essere ridotto da un problema NP-completo , incluso un gran numero di cose al di fuori di NP, quindi dal punto di vista di provare a sviluppare risultati e tecniche generali, non c'è nulla da afferrare.

Poiché la mia domanda originale è stata modificata per riflettere il titolo, forse dovresti nascondere anche la risposta della seconda domanda.
Amnestic,

1
NP-hard non è "tutto al di fuori di NP", poiché include (almeno) i problemi NP-completi in NP. Capisco cosa intendi, ma non so come affermarlo con successo.
vonbrand,

@Vonbrand, sì, l'ho esagerato selvaggiamente (forse per follia?). La nuova versione è accurata, ma sfortunatamente non ha la sensazione.
Luke Mathieson,

9

Dal punto di vista di qualcuno che scrive codice per vivere, avere una buona familiarità con la completezza NP è importante per:

1. Riconoscere quando abbai all'albero sbagliato

I problemi NP-completi sono i più facili dei problemi NP-difficili e tuttavia, per quanto ne sappiamo, ci vuole tempo esponenziale alla dimensione dell'input per risolvere un simile problema decisionale. Quindi, in pratica, se riesci a dimostrare che il problema che stai cercando di risolvere è NP-difficile (in genere mostrando che una soluzione efficiente fornirebbe anche una soluzione efficiente ad alcuni problemi NP-completi), sai che puoi smettere di cercare un algoritmo efficiente per risolverlo esattamente in generale. Invece, puoi scegliere tra algoritmi noti che promettono buone approssimazioni per problemi di ottimizzazione NP-hard e andare avanti con il resto del tuo progetto.

2. Trovare l'albero giusto

Poiché i computer vengono spesso utilizzati per attaccare i problemi NP-hard, sono stati sviluppati solutori specializzati in grado di risolvere in modo efficiente alcune istanze problematiche NP-hard. Riconoscere che il tuo problema è NP-complete è il primo passo verso la ricerca di uno strumento esistente (SAT, ILP, SMT, CSP per citarne alcuni) che potrebbe aiutarti a trovare soluzioni esatte in alcuni casi in cui altrimenti avresti dovuto accontentarti di un approssimazione.


-4

"Sicuramente, se troviamo un algoritmo NP-hard che funziona nel tempo P (indipendentemente dal fatto che sia in NP), abbiamo dimostrato che NP = P. Perché questo concetto è così importante?"

Ogni problema NP si riduce a qualsiasi problema NPC, ma non è vero che ogni problema NP si riduce a qualsiasi problema NP-difficile, quindi provare che un algoritmo NP-difficile è in P non dimostra affatto P = NP. Sarebbe il caso, tuttavia, per un problema NPC, questo è esattamente ciò che significa "ridurre". Quindi, se troviamo un algoritmo P per un problema NPC, allora avremo dimostrato che P = NP.


3
Siamo spiacenti ma questo non è corretto. La definizione di un problema essendo NP -duro è che ogni problema in NP si riduce a . XXX
David Richerby,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.