Come dimostrare che un problema è NP completo?


108

Ho problemi con la programmazione. Devo dimostrare che il problema è NP completo. Quali possono essere i metodi per dimostrare che NP è completo?


Leggi "Riducibilità tra problemi combinatori" di Karp.
Paul Hankin

Risposte:


146

Per mostrare che un problema è NP completo, è necessario:

Mostra che è in NP

In altre parole, date alcune informazioni C, puoi creare un algoritmo temporale polinomiale Vche verificherà per ogni possibile input Xse Xè nel tuo dominio o meno.

Esempio

Dimostrare che il problema delle coperture dei vertici (cioè, per qualche grafo G, ha un insieme di coperture dei vertici di dimensioni ktali che ogni spigolo Gabbia almeno un vertice nell'insieme delle coperture ?) È in NP:

  • il nostro input Xè un grafico Ge un numero k(questo è dalla definizione del problema)

  • Considera le nostre informazioni Ccome "qualsiasi possibile sottoinsieme di vertici nel grafico Gdi dimensione k"

  • Quindi possiamo scrivere un algoritmo Vche, dato G, ke C, restituirà se quell'insieme di vertici è una copertura di vertici Go meno, in tempo polinomiale .

Quindi per ogni grafo G, se esiste qualche "possibile sottoinsieme di vertici Gdi dimensione k" che è una copertura di vertici, allora Gè in NP.

Nota che non abbiamo bisogno di trovare Cin tempo polinomiale. Se potessimo, il problema sarebbe in `P.

Nota che l'algoritmo Vdovrebbe funzionare per ogni G , per alcuni C. Per ogni input dovrebbero esistere informazioni che potrebbero aiutarci a verificare se l'input è nel dominio del problema o meno. Cioè, non dovrebbe esserci un input in cui l'informazione non esiste.

Dimostrare che è NP Hard

Ciò comporta l'acquisizione di un problema NP completo noto come SAT , l'insieme di espressioni booleane nella forma:

(A o B o C) e (D o E o F) e ...

dove l'espressione è soddisfacente , cioè esiste un'impostazione per questi booleani, che rende l'espressione vera .

Quindi riduci il problema NP-completo al tuo problema in tempo polinomiale .

Cioè, dato un input Xper SAT(o qualsiasi problema NP-completo che stai usando), crea un input Yper il tuo problema, ad esempio Xin SAT se e solo se Yè nel tuo problema. La funzione f : X -> Ydeve essere eseguita in tempo polinomiale .

Nell'esempio sopra, l'input Ysarebbe il grafico Ge la dimensione della copertura del vertice k.

Per una prova completa , dovresti provare entrambi:

  • che Xè in SAT=> Ynel tuo problema

  • e Ynel tuo problema => Xin SAT.

La risposta di marcog ha un collegamento con molti altri problemi NP-complete che potresti ridurre al tuo problema.

Nota a piè di pagina: Nella fase 2 ( Dimostrare che è NP-difficile ), ridurre un altro problema NP-difficile (non necessariamente NP-completo) al problema corrente andrà bene, poiché i problemi NP-completi sono un sottoinsieme di problemi NP-hard (che sono anche in NP).


7
Mi chiedo se ci siano dati mancanti o un ragionamento circolare dietro questo. Intendo dire come "provare" che un problema è in NP senza riferirlo ad un altro problema che "è già in NP"? È come dire "è fatto di ferro perché le sue parti sono note per essere ferro", non è una prova di ferro.
Hernán Eche

6
Per quanto ricordo, esiste un teorema chiamato teorema di Cook-Levin che afferma che SAT è NP-completo. Questa dimostrazione è un po 'più complicata di quanto ho descritto sopra e non credo di poterlo spiegare con parole mie.
Laila Agaev

4
Per essere più precisi, il teorema di Cook-Levin afferma che SAT è NP-completo: qualsiasi problema in NP può essere ridotto in tempo polinomiale da una macchina di Turing deterministica al problema di determinare se una formula booleana è soddisfacente (SAT). Quindi questo è il pezzo mancante di cui stavi chiedendo. Se cerchi il teorema su Wikipedia c'è una dimostrazione e puoi fare riferimento al teorema nella tua dimostrazione. Detto questo, ridurre la SAT a un dato problema è il modo in cui mi è stato insegnato a dimostrare la completezza NP.
Laila Agaev

Quindi la mia domanda finisce per essere se SAT potrebbe essere risolto in polinomio cioè il problema P = NP .. Grazie per la tua risposta.
Hernán Eche

Potresti spiegare perché non possiamo ridurre un problema NP-difficile al problema che vogliamo, nella seconda fase? Deve essere un problema NP-completo?
MLT

23

Devi ridurre un problema NP-Complete al problema che hai. Se la riduzione può essere eseguita in tempo polinomiale, allora hai dimostrato che il tuo problema è NP-completo, se il problema è già in NP, perché:

Non è più semplice del problema NP-completo, poiché può essere ridotto ad esso in un tempo polinomiale che rende il problema NP-Hard.

Vedere la fine di http://www.ics.uci.edu/~eppstein/161/960312.html per ulteriori informazioni.


2
+1 qualcuno che spiega in modo comprensibile. invece di dire un mucchio di riferimenti a parole chiave che difficilmente capisco.
ColacX

22
La prima frase è dall'inizio alla fine: è necessario ridurre il problema noto NP-completo al proprio problema. Questo mostra che il tuo problema è difficile almeno quanto il noto problema NP-completo. Anche la parte (b) non è corretta: se hai trovato la riduzione, allora sai già che il tuo problema è NP-difficile; l'unica domanda è se è in NP (alcuni problemi, come l'Halting Problem, non lo sono). Se è NP-difficile e in NP, allora è NP-completo (cioè "NP-completo" è più specifico di "NP-hard").
j_random_hacker

1
Non direi che a) porta a una contraddizione, poiché non sappiamo che P! = NP.
Chiel ten Brinke

8

Per dimostrare che un problema L è NP-completo, è necessario eseguire i seguenti passaggi:

  1. Dimostra che il tuo problema L appartiene a NP (ovvero che data una soluzione puoi verificarlo in tempo polinomiale)
  2. Seleziona un problema NP completo noto L '
  3. Descrivi un algoritmo f che trasforma L 'in L
  4. Dimostra che il tuo algoritmo è corretto (formalmente: x ∈ L 'se e solo se f (x) ∈ L)
  5. Dimostrare che l'algoritmo f funziona in tempo polinomiale

7

Primo, dimostri che si trova in NP.

Quindi trovi un altro problema che già sai essere NP completo e mostri come riduci polinomialmente il problema NP Hard al tuo problema.


No. Devi dimostrare che puoi ridurre da un problema NP completo al tuo problema NP per dimostrare la completezza NP E dimostrare che è in NP. NP hard non entra in questo, a meno che tu non possa provare che è in NP.
mrmemio29

6
  1. Acquisisci familiarità con un sottoinsieme di problemi NP Complete
  2. Dimostrare la durezza NP: ridurre un'istanza arbitraria di un problema completo NP a un'istanza del problema. Questo è il più grande pezzo di torta e dove la familiarità con i problemi di NP Complete paga. La riduzione sarà più o meno difficile a seconda del problema NP Complete scelto.
  3. Dimostra che il tuo problema è in NP: progetta un algoritmo che possa verificare in tempo polinomiale se un'istanza è una soluzione.
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.