Il n'y a pas de solution miracle; Les épreuves de dureté NP sont dures. Cependant, il existe un cadre général pour toutes ces preuves. De nombreux étudiants qui éprouvent des difficultés avec les preuves de dureté NP sont confus quant à ce qu'ils sont censés faire, ce qui rend évidemment impossible de comprendre comment le faire. Voici donc quoi faire pour prouver un problème NP-difficile.
Tout d'abord, à moins que vous ne fassiez vos devoirs, vous devez décider quel problème NP-difficile réduire à votre problème . C'est en grande partie une question d'odorat. Si le nombre 3 apparaît n'importe où dans l'énoncé du problème, essayez de réduire de ou ou . (Oui, je suis sérieux.) Si votre problème implique de trouver une sous-séquence, une permutation ou un chemin optimal, essayez de réduire à partir de ou . Si votre problème demande le plus petit sous-ensemble avec une certaine propriété, essayez ; s'il demande le plus grand sous-ensemble avec une certaine propriété, essayez3 C o l o r 3 P a r t i t i o n H a m i l t o n i a n C y c l e H a m i l t o n i a n P a t h C l i q u e I n d e3 S A T3 C o l o r3 P a r t i t i o nH a m i l t o n i a n C y c l eH a m i l t o n i a n P a t hC l i q u eI n d e p e n d e n t S e t. Si votre problème implique de faire quelque chose dans l'avion, essayez ou . Etc. Si votre problème ne "sent" rien, ou est probablement votre meilleur choix.P l a n a r T S P 3 S A T C i r c u i t S A TP l a n a r C i r c u i t S A TP l a n a r T S P3 S ATC i r c u i t S A T
De toute évidence, vous devez déjà savoir précisément comment tous ces problèmes sont définis , et plus le problème est simple, mieux c'est. Donc, aussi cool que le résultat puisse paraître à la fin, je ne recommande pas de réduire de ou ou ou .M i n e s w e e p e rT e t r i sO n e C h e c k e r s M o v eS u p e r M a r i o B r o s
Deuxièmement, la réduction réelle. Pour réduire le problème X (celui que vous connaissez est NP-difficile) au problème Y (celui que vous essayez de prouver est NP-difficile, vous devez décrire un algorithme qui transforme une instance arbitraire de X en une instance légale de Y L'algorithme de réduction doit faire quelque chose de spécifique avec chaque "fonctionnalité" de l'instance X, la partie de la sortie pour chaque "fonctionnalité" est généralement appelée gadget .
Mais qu'est-ce qu'une fonctionnalité? Cela dépend du problème X. Par exemple:
Pour transformer une instance de , vous aurez besoin d'un gadget pour chaque variable et pour chaque clause dans la formule d'entrée. Chaque gadget variable doit avoir deux "états" qui correspondent à "vrai" et "faux". Chaque gadget de clause doit également avoir plusieurs "états", chacun obligeant d'une manière ou d'une autre au moins l'un des littéraux de cette clause à être vrai. (Les états ne font pas partie de la sortie de l'algorithme de réduction.)3 S AT
Pour transformer une instance de , vous aurez besoin d'un gadget pour chaque sommet et chaque bord du graphique d'entrée, et d'un autre gadget pour définir les trois couleurs.3 C o l or
Pour transformer une instance de , vous aurez besoin d'un gadget pour chaque entrée, pour chaque fil et pour chaque porte du circuit d'entrée.P l a n a r C i r c u i t S a t
La forme réelle du gadget dépend de problème Y, celui que vous réduisez à . Par exemple, si vous réduisez à un problème concernant les graphiques, vos gadgets seront de petits sous-graphiques; voir l'article Wikipedia. Si vous réduisez à un problème de planification, chaque gadget sera un ensemble de tâches à planifier. Si vous vous réduisez à un problème concernant Mario , chaque gadget sera un ensemble de blocs, de briques et de Koopas.
Cela peut devenir déroutant si les deux problèmes impliquent le même type d'objet. Par exemple, si X et Y posent tous les deux des problèmes avec les graphiques, votre algorithme va transformer un graphique (une instance de X) en un graphique différent (une instance de Y). Choisissez judicieusement votre notation, afin de ne pas confondre ces deux graphiques. Je recommande également fortement d'utiliser plusieurs couleurs d'encre.
Enfin, votre algorithme de réduction doit satisfaire trois propriétés:
Il s'exécute en temps polynomial. (C'est généralement facile.)
Si votre algorithme de réduction reçoit une instance positive de X en entrée, il produit une instance positive de Y en sortie.
Si votre algorithme de réduction produit une instance positive de Y en sortie, il doit avoir reçu une instance positive de X en entrée.
Il y a ici une subtilité importante. Votre algorithme de réduction ne fonctionne que dans une seule direction, des instances de X aux instances de Y, mais pour prouver que l'algorithme est correct, il faut raisonner sur la transformation dans les deux directions. Vous devez également vous rappeler que votre algorithme de réduction ne peut pas dire si une instance donnée de X est positive ou négative - cela nécessiterait de résoudre un problème NP-difficile en temps polynomial!
Voilà le quoi . Le comment vient avec la pratique.