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 O n e C h e c k e r s M o v e o S u p e r M a r i o B r o s .
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.)3 S A T
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.3 C o l o r
Per trasformare un'istanza di , avrai bisogno di un gadget per ciascun ingresso, per ciascun filo e per ogni gate nel circuito di ingresso.P l a n a r C i r c u i t S a 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.