Come faccio a costruire riduzioni tra i problemi per dimostrare che un problema è NP-completo?


27

Sto seguendo un corso di complessità e non riesco a trovare riduzioni tra i problemi degli NPC. Come posso trovare riduzioni tra i problemi? C'è un trucco generale che posso usare? Come dovrei affrontare un problema che mi chiede di dimostrare che un problema è NPC?


4
Mi dispiace deludere, non credo che esista un metodo che risolva tutto. Come molti problemi nella vita, ognuno è unico .. Speriamo che, col tempo, avrai la giusta idea di come risolverli.
Ran G.

1
Ci sono alcune linee guida utili su come affrontare tali problemi? Sono completamente perso quando vedo una domanda che mi chiede di dimostrare che è NPC. Come dovrei avvicinarmi a loro?
Anonimo

Risposte:


45

Non esiste un proiettile magico; Le prove di durezza NP sono dure. Tuttavia, esiste un quadro generale per tutte queste prove. Molti studenti che lottano con le prove di durezza NP sono confusi su ciò che dovrebbero fare, il che ovviamente rende impossibile capire come farlo. Quindi ecco cosa fare per dimostrare un problema NP-difficile.

Innanzitutto, a meno che tu non stia solo facendo i compiti, devi decidere quale problema NP-difficile ridurre al tuo problema . Questa è in gran parte una questione di "odore". Se il numero 3 appare in qualsiasi punto del problema, prova a ridurre da o o . (Sì, sono serio.) Se il tuo problema riguarda la ricerca di una , permutazione o percorso ottimali, prova a ridurre da o . Se il tuo problema richiede il sottoinsieme più piccolo con una determinata proprietà, prova ; se richiede il sottoinsieme più grande con una determinata proprietà, prova3SAT3Color3PartitionHamiltonianCycleHamiltonianPathCliqueIndependentSet. Se il problema si tratta di fare qualcosa nel piano, provare o P l a n un R T S P . E così via. Se il tuo problema non "odora" come niente, 3 S A T o C i r c u i t S A T è probabilmente la soluzione migliore.PlanarCircuitSATPlanarTSP3SATCircuitSAT

Ovviamente, devi già sapere esattamente come sono definiti tutti questi problemi e più semplice è il problema da cui riduci, meglio è. Così come fresco come il risultato potrebbe apparire, alla fine, non mi consiglia la riduzione dal Minesweeper o Tetris o OneChecKerSMove o SuperMun'riooBroS .

In secondo luogo, la riduzione effettiva. Per ridurre il problema X (quello che conosci è NP-difficile) al problema Y (quello che stai provando a dimostrare è NP-difficile, devi descrivere un algoritmo che trasforma un'istanza arbitraria di X in un'istanza legale di Y L'algoritmo di riduzione deve fare qualcosa di specifico con ciascuna "caratteristica" dell'istanza X, la parte dell'output per ciascuna "caratteristica" è generalmente chiamata gadget .

Ma cos'è una caratteristica? Dipende dal problema X. Ad esempio:

  • Per trasformare un'istanza di , avrai bisogno di un gadget per ogni variabile e per ogni clausola nella formula di input. Ogni gadget variabile dovrebbe avere due "stati" che corrispondono a "vero" e "falso". Ogni gadget della clausola dovrebbe anche avere più "stati", ognuno dei quali forza in qualche modo almeno uno dei letterali in quella clausola per essere vero. (Gli stati non fanno parte dell'output dell'algoritmo di riduzione.)3SUNT

  • Per trasformare un'istanza di , avrai bisogno di un gadget per ciascun vertice e ciascun bordo del grafico di input e un altro gadget per definire i tre colori.3Color

  • Per trasformare un'istanza di , avrai bisogno di un gadget per ciascun ingresso, per ciascun filo e per ogni gate nel circuito di ingresso.Plun'nun'rCiorcuiotSun't

La forma attuale del gadget dipende dal problema Y, quello che si sta riducendo a . Ad esempio, se stai riducendo a un problema relativo ai grafici, i tuoi gadget saranno piccoli sottografi; vedi l'articolo di Wikipedia. Se stai riducendo a un problema di pianificazione, ogni gadget sarà un insieme di lavori da pianificare. Se stai riducendo a un problema su Mario , ogni gadget sarà un insieme di blocchi e mattoni e Koopas.

Ciò può creare confusione se entrambi i problemi riguardano lo stesso tipo di oggetto. Ad esempio, se sia X che Y sono problemi relativi ai grafici, l'algoritmo trasformerà un grafico (un'istanza di X) in un altro grafico (un'istanza di Y). Scegli la tua notazione con saggezza, in modo da non confondere questi due grafici. Consiglio vivamente di utilizzare più colori di inchiostro.

Infine, l'algoritmo di riduzione deve soddisfare tre proprietà:

  • Funziona in tempo polinomiale. (Di solito è facile.)

  • Se al tuo algoritmo di riduzione viene fornita un'istanza positiva di X come input, produce un'istanza positiva di Y come output.

  • Se l'algoritmo di riduzione produce un'istanza positiva di Y come output, deve essere stata fornita un'istanza positiva di X come input.

C'è un'importante sottigliezza qui. L'algoritmo di riduzione funziona solo in una direzione, dalle istanze di X alle istanze di Y, ma per dimostrare l'algoritmo corretto è necessario un ragionamento sulla trasformazione in entrambe le direzioni. Devi anche ricordare che il tuo algoritmo di riduzione non può dire se una determinata istanza di X è positiva o negativa, ciò richiederebbe la risoluzione di un problema NP-difficile in tempo polinomiale!

Questo è il cosa . Il come viene solo con la pratica.


5
3SUNT3SUNTptruefun'lSe

1
Riguardo a "Se il tuo algoritmo di riduzione produce un'istanza positiva di Y come output, deve essere stata data un'istanza positiva di X come input": Sebbene sembrerebbe più intuitivo scrivere questa condizione come "Se il tuo algoritmo di riduzione riceve un'istanza negativa di X come input, produce un'istanza negativa di Y come output ", nota che queste due condizioni sono equivalenti e come JeffE l'ha scritto di solito rende la costruzione della prova molto più semplice, poiché in ogni caso" hai qualcosa "(o il istanza positiva di X, o istanza positiva di Y) con cui lavorare.
j_random_hacker

11

JeffE delinea la strategia più comune: conoscere molti problemi NP-completi, trovarne uno che si adatta molto bene e fare una facile riduzione.

Un'altra strategia valida è quella di utilizzare sempre 3SAT (o qualsiasi altro problema). Ciò potrebbe rendere alcune riduzioni più intricate, ma il lato positivo è che hai molta esperienza nell'esprimere la sazietà in altri tipi di problemi. Quindi risparmi il tempo di trovare un buon partner di riduzione (compresi i vicoli ciechi) e speri che la tua esperienza ti permetta di fare la riduzione rapidamente anche se è più difficile.

Anche questo approccio ha qualche meta bellezza: (3) SAT è uno dei pochi problemi per i quali è stata dimostrata (quasi) direttamente la completezza NP. Pertanto, basarsi solo su quella prova mantiene piatto il tuo "albero delle prove", evitando lunghe catene di riduzioni.


3
Direttamente dimostrando che il problema Limitata Halting è NP-completo quando il limite è dato in unario non è troppo duro, ed è un modo semplice di dimostrare che qualche problema NP-completo esiste, anche se il problema è di per sé piuttosto inutile ridurre da.
Alex ten Brink,

3
Non sono sicuro dell'affermazione secondo cui è l'unico problema che è stato dimostrato essere NP-completo direttamente. Infatti se lo interpretate in senso stretto, allora è decisamente falso. L'articolo di Cook del 1971 parla di TAUT non di SAT (usa riduzioni di Cook, non di riduzioni di Karp) (è una facile osservazione che la prova dimostra anche che SAT è NP-completo con le riduzioni di Karp).
Kaveh,

@Kaveh Huh? La tautologia è completa in Co-Np e pertanto non è nota per essere in NP (-completa). Non ho letto il giornale di Cook però.
Albert Hendriks,

1
@Albert, allora dovresti leggerlo. Con le riduzioni Cook non è possibile distinguere tra NP e coNP.
Kaveh,
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.