Che cos'è un NP completo in informatica?


429

Che cos'è un problema NP-completo? Perché è un argomento così importante nell'informatica?


5
Potresti essere interessato alle risposte a questa domanda: stackoverflow.com/questions/111307/…
Dan Dyer,

1
Bene, ho deciso di scrivere la mia risposta perché non mi piaceva il modo in cui viene presentata la risposta accettata e ho incluso un link alla domanda P = NP.
grom

1
Esiste un'ottima lezione di arsdigita sulla matematica discreta che spiega cos'è un problema NP-completo. I primi 50 minuti sono principalmente sull'algebra booleana. Quindi salta subito all'inizio del minuto 53 se sei interessato solo ai concetti di completezza P, NP, NP, al problema booleano della soddisfacibilità e alla riduzione.
davitenio,

1
Non lo sapremo mai perché con una grande n non si completerà mai;)
Pete Alvin,

1
Mi piace molto e consiglio vivamente di controllare questa spiegazione video: youtube.com/watch?v=YX40hbAHx3s
Maksym Ovsianikov

Risposte:


209

NP sta per tempo polinomiale non deterministico .

Ciò significa che il problema può essere risolto in tempo polinomiale usando una macchina di Turing non deterministica (come una normale macchina di Turing ma includendo anche una funzione di "scelta" non deterministica). Fondamentalmente, una soluzione deve essere testabile in poly time. In tal caso, e un problema NP noto può essere risolto utilizzando il problema dato con input modificato (un problema NP può essere ridotto al problema dato), allora il problema è NP completo.

La cosa principale da eliminare da un problema NP-completo è che non può essere risolto in tempo polinomiale in alcun modo noto. NP-Hard / NP-Complete è un modo per dimostrare che determinate classi di problemi non sono risolvibili in tempi realistici.

Modifica: come altri hanno notato, ci sono spesso soluzioni approssimative per problemi NP-Complete. In questo caso, la soluzione approssimativa di solito fornisce un limite di approssimazione usando una notazione speciale che ci dice quanto è vicina l'approssimazione.


2
"... un problema NP può essere ridotto al problema dato ..." - un vincolo importante alla riduzione è che dovrebbe essere deterministicamente polinomiale.
Rafał Dowgird,

2
La notazione O () è una notazione matematica generale usata dappertutto: gli algoritmi di approssimazione sono effettivamente dati con accuratezza O () - cerca qualsiasi documento dell'algoritmo di approssimazione su arxiv.org
Ying Xiao

1
Per chiarire un po ', i problemi NP sono riferiti a macchine di Turing non deterministiche. Non è ancora noto se un problema NP completo può essere risolto in tempo polinomiale su una macchina di Turing deterministica.
rjzii,

1
@Yuval: Giusto per chiarire. Quello che avevi prima era completamente sbagliato (a meno che P = NP). Dal tuo commento ho la sensazione che pensi che entrambe le versioni fossero giuste. In caso contrario, mi scuso.

33
Questa risposta è tutt'altro che completa e comprensibile e non riesco a capire perché abbia così tanti voti positivi.
nbro,

428

Che cos'è NP ?

NP è l'insieme di tutti i problemi di decisione (domande con una risposta sì o no) per cui le risposte "sì" possono essere verificate in tempo polinomiale (O (n k ) dove n è la dimensione del problema e k è un costante) da una macchina di Turing deterministica . Il tempo polinomiale viene talvolta utilizzato come definizione di veloce o rapido .

Che cos'è P ?

P è l'insieme di tutti i problemi di decisione che possono essere risolti in un tempo polinomiale da una macchina di Turing deterministica . Poiché possono essere risolti in tempo polinomiale, possono anche essere verificati in tempo polinomiale. Pertanto P è un sottoinsieme di NP.

Che cos'è NP-Complete ?

Un problema x che è in NP è anche in NP-Complete se e solo se ogni altro problema in NP può essere rapidamente (cioè nel tempo polinomiale) trasformato in x.

In altre parole:

  1. x è in NP e
  2. Ogni problema in NP è riducibile a x

Quindi, ciò che rende NP-Complete così interessante è che se uno qualsiasi dei problemi NP-Complete dovesse essere risolto rapidamente, allora tutti i problemi NP potrebbero essere risolti rapidamente.

Vedi anche il post Cos'è "P = NP?", E perché è una domanda così famosa?

Che cos'è NP-Hard ?

NP-Hard sono problemi che sono almeno tanto difficili quanto i problemi più difficili in NP. Si noti che anche i problemi NP-Complete sono NP-difficili. Tuttavia, non tutti i problemi NP-difficili sono NP (o addirittura un problema decisionale), nonostante abbiano NPcome prefisso. Questo è NP in NP-hard non significa tempo polinomiale non deterministico . Sì, questo è confuso, ma il suo utilizzo è radicato e probabilmente non cambierà.


4
"Cioè la NP in NP-hard non significa non polinomiale" <- La NP in NP-complete (o altrove) non significa neanche non polinomiale.
sepp2k,

1
Grazie sepp2k per la correzione. Volevo dire che non significa NP (cioè tempo polinomiale non deterministico).
grom

1
Penso che la tua risposta semplifichi tanto quanto più gli altri in questo thread. Ma questo è ancora un problema molto difficile per me da capire ... Suppongo che sia per questo che pagano l'algoritmo, ragazzi.
SoftwareSavant,

3
Informazioni su NP: Penso che dovrebbe essere: Il problema può essere risolto con la macchina di Turing non deterministica. (nonderterministic piuttosto che derministic)
hqt

2
@hqt Quello che ho scritto è corretto .. Nota la parola "verificato". Hai anche ragione, NP può essere risolto in tempo polinomiale dalla macchina di Turing non deterministica
grom

32

NP-Complete significa qualcosa di molto specifico e devi stare attento o sbaglierai la definizione. Innanzitutto, un problema NP è un problema sì / no tale che

  1. Esiste una prova a tempo polinomiale per ogni istanza del problema con una risposta "sì" che la risposta è "sì" o (equivalentemente)
  2. Esiste un algoritmo a tempo polinomiale (possibilmente usando variabili casuali) che ha una probabilità diversa da zero di rispondere "sì" se la risposta a un'istanza del problema è "sì" e dirà "no" il 100% delle volte se la risposta è no." In altre parole, l'algoritmo deve avere un tasso di falsi negativi inferiore al 100% e nessun falso positivo.

Un problema X è NP-Complete se

  1. X è in NP e
  2. Per qualsiasi problema Y in NP, esiste una "riduzione" da Y a X: un algoritmo del tempo polinomiale che trasforma qualsiasi istanza di Y in un'istanza di X in modo tale che la risposta all'istanza Y sia "sì" se e solo se la risposta X-istanza è "sì".

Se X è NP-completo ed esiste un algoritmo deterministico a tempo polinomiale in grado di risolvere correttamente tutte le istanze di X (0% di falsi positivi, 0% di falsi negativi), qualsiasi problema in NP può essere risolto in deterministico-polinomiale- tempo (mediante riduzione a X).

Finora, nessuno ha escogitato un algoritmo così deterministico nel tempo polinomiale, ma nessuno ha dimostrato che non ne esiste uno (c'è un milione di dollari per chiunque possa fare uno dei due: è il problema P = NP ). Ciò non significa che non è possibile risolvere una particolare istanza di un problema NP-Complete (o NP-Hard). Significa solo che non puoi avere qualcosa che funzioni in modo affidabile su tutte le istanze di un problema nello stesso modo in cui puoi ordinare in modo affidabile un elenco di numeri interi. Potresti benissimo essere in grado di elaborare un algoritmo che funzionerà molto bene su tutte le istanze pratiche di un problema NP-Hard.


1
Non mi piace vantarmi, ma sono piuttosto orgoglioso del mio algoritmo deterministico in tempo polinomiale che ho dimostrato di non esistere. ;)
Kyle Cronin,

20
Ho scoperto una prova davvero meravigliosa di questo, che questo commento è troppo stretto per contenere;)
quick_dry

La condizione # 2 è un'affermazione di P =? NP, non la definizione standard di completezza NP. Dovrebbe essere: esiste un algoritmo deterministico poli-tempo che può trasformare qualsiasi altra istanza NP X in un'istanza Y di questo problema st la risposta a Y è "sì" se e solo se la risposta a X è "sì".
Chris Conway,

"devi stare attento o sbaglierai la definizione" - come dimostrato proprio da questa risposta. Questa risposta è in parte corretta ma sicuramente non avrebbe dovuto essere accettata.
Programmatore di Windows,

29

Fondamentalmente i problemi di questo mondo possono essere classificati come

         1) Problema irrisolvibile 2) Problema irrisolvibile 3) Problema NP 4) Problema P


         1) Il primo non è una soluzione al problema. 2) Il secondo è il tempo esponenziale necessario (ovvero O (2 ^ n) sopra). 3) Il terzo si chiama NP. 4) Il quarto è un problema facile.


P: si riferisce a una soluzione del problema del tempo polinomiale.

NP: indica ancora il tempo polinomiale per trovare una soluzione. Non siamo sicuri che non esiste una soluzione Polynomial Time, ma una volta fornita una soluzione, questa soluzione può essere verificata in Polynomial Time.

NP completo: fa riferimento al tempo polinomiale che dobbiamo ancora trovare una soluzione, ma può essere verificato in tempo polinomiale. Il problema NPC in NP è il problema più difficile, quindi se possiamo dimostrare di avere una soluzione P al problema NPC, allora i problemi NP che si possono trovare nella soluzione P.

NP Hard: indica che il tempo polinomiale deve ancora trovare una soluzione, ma sicuramente non può essere verificato in tempo polinomiale. Il problema NP difficile supera la difficoltà NPC.


Felice di vedere questa risposta, la parte di categorizzazione è piuttosto espressiva per l'intero concetto. Pensavo che i problemi intercettabili fossero problemi NP.
PeerNet,

22

NP-Complete è una classe di problemi.

La classe è Pcostituita da quei problemi che sono risolvibili in tempi polinomiali . Ad esempio, potrebbero essere risolti in O (n k ) per una costante k, dove n è la dimensione dell'input. In poche parole, è possibile scrivere un programma che verrà eseguito in tempi ragionevoli .

La classe è NPcostituita da quei problemi che sono verificabili in tempo polinomiale. Cioè, se ci viene data una potenziale soluzione, allora potremmo verificare se la soluzione data è corretta in tempo polinomiale.

Alcuni esempi sono il problema Boolean Satisfiability (o SAT ) o il problema del ciclo hamiltoniano. Esistono molti problemi noti nella classe NP.

NP-Completesignifica che il problema è almeno altrettanto grave di qualsiasi altro problema in NP.

È importante per l'informatica perché è stato dimostrato che qualsiasi problema in NP può essere trasformato in un altro problema in NP-complete. Ciò significa che una soluzione a qualsiasi problema NP completo è una soluzione a tutti i problemi NP.

Molti algoritmi di sicurezza dipendono dal fatto che non esistono soluzioni note per i problemi di NP. Avrebbe sicuramente un impatto significativo sull'informatica se venisse trovata una soluzione.


questo è sbagliato. Un problema in NP può essere trasformato in qualsiasi problema in NP-complete, non in nessun problema in NP. Questa è una grande differenza.
David Nehme,

Inoltre, "il problema è difficile come qualsiasi altro problema in NP" - vero, ma una formulazione migliore sarebbe "almeno altrettanto difficile". Nel complesso, questa risposta è più vicina di qualsiasi altra risposta che ho visto e più vicina della risposta purtroppo accettata.
Programmatore di Windows,

Grazie per le tue osservazioni. Ho aggiornato la risposta per includere le tue correzioni.
Vincent Ramdhanie,

1
La tua definizione di NP-Complete non è completa, devi anche specificare che i problemi NP-Complete sono anche problemi NP (e NP-hard) e non altrettanto difficili di qualsiasi altro problema NP. Farò downvote, se decidi di cambiare, fammelo sapere e rimuovo il downvote.
nbro,

20

È una classe di problemi in cui dobbiamo simulare ogni possibilità per essere sicuri di avere la soluzione ottimale.

Ci sono molte buone euristiche per alcuni problemi NP-Complete, ma sono solo un'ipotesi colta al massimo.


Quasi giusto. Un problema può avere una soluzione non esaustiva che non è ancora di natura polinomiale.
Mark Bessey,

1
Sebbene non sia esattamente giusto, questo è abbastanza vicino per un uso pratico. La definizione pedante non è necessaria sebbene l'OP probabilmente desideri la definizione pedante. È una buona approssimazione!
Doug65536,

18

Se stai cercando un esempio di un problema NP-completo, ti suggerisco di dare un'occhiata a 3-SAT .

La premessa di base è che hai un'espressione in forma congiuntiva normale , che è un modo per dire che hai una serie di espressioni unite da OR che tutto deve essere vero:

(a or b) and (b or !c) and (d or !e or f) ...

Il problema 3-SAT è trovare una soluzione che soddisfi l'espressione in cui ciascuna delle espressioni OR ha esattamente 3 booleani da abbinare:

(a or !b or !c) and (!a or b or !d) and (b or !c or d) ...

Una soluzione a questa potrebbe essere (a = T, b = T, c = F, d = F). Tuttavia, non è stato scoperto alcun algoritmo che risolva questo problema nel caso generale in tempi polinomiali. Ciò significa che il modo migliore per risolvere questo problema è essenzialmente di indovinare e controllare la forza bruta e provare combinazioni diverse fino a quando non ne trovi una che funzioni.

La particolarità del problema 3-SAT è che QUALSIASI problema NP completo può essere ridotto a 3-SAT. Ciò significa che se riesci a trovare un algoritmo del tempo polinomiale per risolvere questo problema, otterrai $ 1.000.000 , per non parlare del rispetto e dell'ammirazione degli informatici e dei matematici di tutto il mondo.


Forse sono confuso dalle altre spiegazioni qui, ma non dovrei leggere questo "QUALSIASI problema NP può essere ridotto a un problema 3-SAT in tempo polinomiale". Perché non è questo ciò che rende NP 3-SAT completo?
DubiousPusher,

@DubiousPusher No. La risposta lo afferma correttamente. Questa immagine chiarisce che stackoverflow.com/a/7367561/2686502~~V~~plural~~3rd
jayeshsolanki93

14

Onestamente, Wikipedia potrebbe essere il posto migliore per cercare una risposta a questo.

Se NP = P, allora possiamo risolvere problemi molto difficili molto più velocemente di quanto pensassimo di poter fare prima. Se risolviamo un solo problema NP-Complete in tempo P (polinomiale), allora può essere applicato a tutti gli altri problemi nella categoria NP-Complete.


6
"Se NP = P, allora possiamo risolvere problemi molto difficili molto più velocemente di quanto pensassimo di poter fare prima." -- No. Se NP = P allora esistono soluzioni (esistono algoritmi deterministici per risolverle) ma non c'è garanzia che sapremo mai quali sono.
Programmatore di Windows,

Un punto giusto. La mia ipotesi è una prova del fatto che P = NP sia probabilmente costruttivo (ad esempio, la pubblicazione di un algoritmo polinomiale per 3-SAT).
Chris Conway,

10

Dobbiamo separare algoritmi e problemi. Scriviamo algoritmi per risolvere i problemi e si adattano in un certo modo. Sebbene questa sia una semplificazione, etichettiamo un algoritmo con una 'P' se il ridimensionamento è abbastanza buono, e 'NP' se non lo è.

È utile sapere cose sui problemi che stiamo cercando di risolvere, piuttosto che sugli algoritmi che usiamo per risolverli. Quindi diremo che tutti i problemi che hanno un algoritmo di ridimensionamento sono "in P". E quelli che hanno un algoritmo di ridimensionamento sono "in NP".

Ciò significa che anche molti problemi semplici sono "in NP", perché possiamo scrivere algoritmi sbagliati per risolvere problemi facili. Sarebbe bello sapere quali problemi in NP sono davvero difficili, ma non vogliamo solo dire "sono quelli per cui non abbiamo trovato un buon algoritmo". Dopotutto, potrei trovare un problema (chiamalo X) che penso abbia bisogno di un algoritmo super-sorprendente. Dico al mondo che il miglior algoritmo che ho potuto inventare per risolvere male le scale X, e quindi penso che X sia un problema davvero difficile. Ma domani, forse qualcuno più intelligente di me inventa un algoritmo che risolve X ed è in P. Quindi questa non è un'ottima definizione di problemi difficili.

Tuttavia, ci sono molti problemi in NP per i quali nessuno conosce un buon algoritmo. Quindi, se potessi dimostrare che X è un certo tipo di problema: uno in cui un buon algoritmo per risolvere X potrebbe anche essere usato, in qualche modo indiretto, per fornire un buon algoritmo per ogni altro problema in NP. Bene, ora le persone potrebbero essere un po 'più convinte che X sia un problema davvero complicato. E in questo caso chiamiamo X NP-Complete.


5

Le definizioni per i problemi completi di NP di cui sopra sono corrette, ma ho pensato che potrei essere lirico sulla loro importanza filosofica poiché nessuno ha ancora affrontato questo problema.

Quasi tutti i problemi complessi che incontrerai saranno NP Complete. C'è qualcosa di molto fondamentale in questa classe, e che sembra essere computazionalmente diverso dai problemi facilmente risolvibili. In un certo senso hanno il loro sapore, e non è così difficile riconoscerli. Ciò significa sostanzialmente che qualsiasi algoritmo moderatamente complesso è impossibile da risolvere esattamente: pianificazione, ottimizzazione, imballaggio, copertura, ecc.

Ma non tutto è perduto se un problema che incontrerai è NP Complete. Esiste un campo vasto e molto tecnico in cui le persone studiano algoritmi di approssimazione, che ti daranno garanzie di essere vicini alla soluzione di un problema completo NP. Alcune di queste sono garanzie incredibilmente forti - per esempio, per 3sat, puoi ottenere una garanzia 7/8 attraverso un algoritmo davvero ovvio. Ancora meglio, in realtà, ci sono alcune euristiche molto forti, che eccellono nel dare grandi risposte (ma nessuna garanzia!) Per questi problemi.

Si noti che due problemi molto famosi - isomorfismo grafico e factoring - non sono noti per essere P o NP.


5

Ho sentito una spiegazione, cioè: "NP-Completezza è probabilmente una delle idee più enigmatiche nello studio degli algoritmi." NP "sta per" tempo polinomiale non deterministico ", ed è il nome di quella che viene chiamata una classe di complessità a quali problemi possono appartenere. L'importante della classe di complessità NP è che i problemi all'interno di quella classe possano essere verificatida un algoritmo temporale polinomiale. Ad esempio, considera il problema del conteggio delle cose. Supponiamo che ci siano un mucchio di mele su un tavolo. Il problema è "Quante mele ci sono?" Viene fornita una possibile risposta, 8. È possibile verificare questa risposta in tempi polinomiali utilizzando l'algoritmo di, duh, contando le mele. Il conteggio delle mele avviene nel tempo O (n) (che è notazione Big-oh), perché ci vuole un passo per contare ogni mela. Per n mele, hai bisogno di n passaggi. Questo problema è nella classe di complessità NP.

Un problema è classificato come NP-completo se si può dimostrare che è NP-Hard e verificabile in tempo polinomiale. Senza approfondire troppo la discussione su NP-Hard, basti dire che ci sono alcuni problemi ai quali non sono state trovate soluzioni temporali polinomiali. Cioè, ci vuole qualcosa come n! (n fattoriale) passaggi per risolverli. Tuttavia, se ti viene data una soluzione a un problema NP-Complete, puoi verificarlo in tempo polinomiale.

Un classico esempio di problema NP-Complete è The Traveller Salesman Problem. "

L'autore: ApoxyButt Da: http://www.everything2.com/title/NP-complete


2

Problema NP: -

  1. I problemi NP sono tali problemi che possono essere risolti in tempi polinomiali non deterministici.
  2. L'algoritmo non deterministico opera in due fasi.
  3. Fase di indagine non deterministica && Fase di verifica non deterministica.

Tipo di problema Np

  1. NP completo
  2. NP Hard

NP Problema completo: -

1 Decisione Il problema A si chiama NP completo se ha le seguenti due proprietà: -

  1. Appartiene alla classe NP.
  2. Ogni altro problema in NP può essere trasformato in P in tempo polinomiale.

Alcuni Ex: -

  • Problema allo zaino
  • problema di somma del sottoinsieme
  • Problema di copertura del vertice

Domanda rapida sulle tue fasi ... la fase di verifica non può essere deterministica? I problemi NP non sono stati verificati in P-time
Branden Keck,

1

I problemi NP-completi sono una serie di problemi a ciascuno dei quali qualsiasi altro problema NP può essere ridotto in tempo polinomiale e la cui soluzione può ancora essere verificata in tempo polinomiale. Cioè, qualsiasi problema NP può essere trasformato in uno qualsiasi dei problemi NP-completi. - Informalmente, un problema NP completo è un problema NP che è almeno "duro" come qualsiasi altro problema in NP.


1

Per quanto ho capito

P è l'insieme di problemi che potrebbero essere risolti in tempo polinomiale con una TM deterministica.

NP è l'insieme di problemi che richiede una TM non deterministica per essere risolta in tempo polinomiale. Ciò significa verificare in parallelo tutte le possibili variabili, ciascuna delle quali richiede tempo polinomiale. Se il problema è risolvibile, almeno uno di quegli stati paralleli deve avere la soluzione al problema. Ciò significa anche che se hai fatto un'ipotesi sulle variabili della soluzione, l'unica cosa necessaria è verificare la validità della soluzione in tempo polinomiale.

NP-Hard è il set in cui i problemi sono difficili almeno quanto NP. Qualsiasi problema in NP potrebbe essere trasformato in NP-Hard in tempo polinomiale. Questi problemi non possono essere risolti in tempo polinomiale se P non è uguale a NP. Questo è quando il problema più difficile in NP è risolvibile a tempo polinomiale, quindi solo i problemi NP-Hard sono risolvibili a tempo polinomiale.

NP-Complete è il set di intersezioni di NP e NP-Hard. Qualsiasi problema NP potrebbe essere trasformato in un problema NP-Completo in tempo polinomiale. Ciò significa che se uno dei NP-Complete potesse avere una soluzione efficiente, qualsiasi problema NP potrebbe essere risolto con la stessa efficienza.

Per favore fatemi sapere se ho fatto qualche errore.


-17

un problema NP è quello in cui un algoritmo informatico che verifica una soluzione può essere creato in tempo polinomiale.

un problema NP-completo è NP, ma anche se è possibile risolverlo in tempo polinomiale (chiamato P), tutti i problemi NP sono P.

Quindi fatti scoppiare.

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.