Quelle est la définition de P, NP, NP-complet et NP-difficile?


249

Je suis un cours d' informatique et de complexité et je suis incapable de comprendre la signification de ces termes.

Tout ce que je sais, c'est que NP est un sous-ensemble de NP-complete, qui est un sous-ensemble de NP-hard, mais je n'ai aucune idée de ce qu'ils signifient réellement. Wikipedia n'est pas d'une grande aide non plus, car les explications sont encore un peu trop élevées.


6
C'est un objet formel avec une définition formelle. J'ai trouvé que la plupart des explications "simples" manquaient. Si vous avez du mal à comprendre les définitions, que faites-vous dans un cours sur la théorie de la complexité? (Question sérieuse.) En passant, Wikipedia n'est pas une très bonne référence pour le SDC.
Raphaël

17
Tout ce que vous savez n'est pas vrai: le PNJ (NP complet) est un sous-ensemble du NP, et non l'inverse. L'exhaustivité implique toujours d'être un élément de la classe pour laquelle le problème est complet. De plus, NP n'est pas un sous-ensemble de NP-difficile, car tous les problèmes de NP ne sont pas difficiles.
Frafl

5
@frafl: "Tous les problèmes de NP ne sont pas durs", ce qui reste à démontrer.
Raphaël

3
@Raphael: Cela dépend du type de réduction que vous utilisez. J'ai pensé au temps polynomial de nombreuses réductions, où . NPC
Frafl

Réponses:


366

Je pense que les articles Wikipedia , et contre sont plutôt bons. Voici encore ce que je dirais: Partie I , Partie IIPNPPNP

[Je vais utiliser des remarques entre crochets pour discuter de certains détails techniques que vous pouvez sauter si vous le souhaitez.]


Partie I

Problèmes de décision

Il existe différents types de problèmes de calcul. Cependant, dans un cours d'introduction à la théorie de la complexité computationnelle, il est plus facile de se concentrer sur un problème de décision , c'est-à-dire des problèmes pour lesquels la réponse est OUI ou NON. Il existe d'autres types de problèmes de calcul, mais la plupart du temps, les questions les concernant peuvent être réduites à des questions similaires concernant les problèmes de décision. De plus, les problèmes de décision sont très simples. Par conséquent, dans un cours d'introduction à la théorie de la complexité computationnelle, nous nous concentrons sur l'étude des problèmes de décision.

Nous pouvons identifier un problème de décision avec le sous-ensemble d'entrées ayant répondu OUI. Cela simplifie la notation et nous permet d’écrire à la place de et à la place de .xQQ(x)=YESxQQ(x)=NO

Une autre perspective est que nous parlons de requêtes d'adhésion dans un ensemble. Voici un exemple:

Problème de décision:

Entrée: Un nombre naturel , Question: Est-ce que est un nombre pair?xx
x

Problème d'adhésion:

Entrée: Un nombre naturel , Question: Est-ce que est dans ?xx E v e n = { 0 , 2 , 4 , 6 , }
xEven={0,2,4,6,}

Nous nous référons à la réponse OUI sur une entrée comme acceptant l'entrée et à la réponse NON à une entrée comme rejetant l'entrée.

Nous examinerons des algorithmes pour des problèmes de décision et de discuter de la façon dont ces algorithmes efficaces sont dans leur utilisation des ressources calculables . Je me fierai à votre intuition pour la programmation dans un langage tel que C au lieu de définir formellement ce que nous entendons par un algorithme et des ressources de calcul.

[Remarques: 1. Si nous voulions tout faire de manière formelle et précise, nous aurions besoin de fixer un modèle de calcul tel que le modèle standard de la machine de Turing pour définir avec précision ce que nous entendons par un algorithme et son utilisation des ressources de calcul. 2. Si nous voulons parler de calcul sur des objets que le modèle ne peut pas gérer directement, nous devons les coder en tant qu’objets que le modèle de machine peut gérer. Par exemple, si nous utilisons des machines de Turing, nous devons coder des objets tels que des nombres naturels et des graphes. comme des chaînes binaires.]


P = Problèmes avec des algorithmes efficaces pour trouver des solutions

Supposons que des algorithmes efficaces désignent des algorithmes utilisant au maximum la quantité polynomiale de ressources de calcul. La ressource principale qui nous importe est le temps d'exécution des algorithmes dans le pire des cas en ce qui concerne la taille d'entrée, c'est-à-dire le nombre d'étapes de base qu'un algorithme prend sur une entrée de taille . La taille d'une entrée est s'il faut bits de mémoire d'ordinateur pour stocker , auquel cas on écrit . Donc, par algorithmes efficaces, nous entendons des algorithmes qui ont un temps d'exécution polynomial dans le cas le plus défavorable .nxnnx|x|=n

La thèse de Cobham repose sur l' hypothèse selon laquelle les algorithmes à temps polynomiaux capturent la notion intuitive d'algorithmes efficaces . Je ne discuterai pas à ce stade si est le bon modèle pour résoudre efficacement les problèmes et si capture ou ne capture pas ce qui peut être calculé efficacement dans la pratique et les problèmes connexes. Pour le moment, il y a de bonnes raisons de faire cette hypothèse, donc nous supposons que tel est le cas. Si vous n'acceptez pas la thèse de Cobham, cela ne rend pas fausses ce que j'écris ci-dessous, la seule chose que nous perdrons, c'est l' intuition.PPsur le calcul efficace dans la pratique. Je pense que c'est une hypothèse utile pour quelqu'un qui commence à en apprendre davantage sur la théorie de la complexité.

P est la classe de problèmes de décision pouvant être résolus efficacement ,
c'est-à - dire les problèmes de décision ayant des algorithmes à temps polynomiaux.

Plus formellement, nous disons qu'un problème de décision est dans si eteQP

il existe un algorithme efficace tel que pour toutes les entrées ,Ax
x

  • si alors , Q(x)=YESA(x)=YES
  • si alors .Q(x)=NOA(x)=NO

Je peux simplement écrire mais je l’écris de cette façon afin que nous puissions le comparer à la définition de .A(x)=Q(x)NP


NP = Problèmes avec des algorithmes efficaces pour la vérification des preuves / certificats / témoins

Parfois, nous ne connaissons aucun moyen efficace de trouver la réponse à un problème de décision. Toutefois, si quelqu'un nous dit la réponse et nous donne une preuve, nous pouvons vérifier de manière efficace que la réponse est correcte en vérifiant si la preuve est valide. . C'est l'idée derrière la classe de complexité .NP

Si la preuve est trop longue, ce n'est pas vraiment utile, il peut prendre trop de temps pour lire la preuve et encore moins vérifier si elle est valide. Nous voulons que le temps requis pour la vérification soit raisonnable en taille de l'entrée originale, pas en taille de la preuve donnée! Cela signifie que ce que nous voulons vraiment, ce ne sont pas de longues preuves arbitraires, mais de courtes preuves. Notez que si la durée d'exécution du vérificateur est polynomiale dans la taille de l'entrée d'origine, il ne peut lire qu'une partie polynomiale de l'épreuve. En bref, nous entendons par taille polynomiale .

Formulez ce point chaque fois que j'utilise le mot "preuve", je veux dire "preuve courte".

Voici un exemple de problème que nous ne savons pas résoudre efficacement mais que nous pouvons vérifier efficacement des preuves:


Entrée de partition : un ensemble fini de nombres naturels , Question: est-il possible de partitionner en deux ensembles et ( et ) tels que la somme des nombres de est égal à la somme du nombre dans ( )?SS A B A B = S A B = A B Σ x A x = Σ x B x
SABAB=SAB=
ABxAx=xBx

Si je vous donne et vous demande si nous pouvons le partitionner en deux ensembles tels que leurs sommes soient égales, vous ne connaissez pas d'algorithme efficace pour le résoudre. Vous essaierez probablement toutes les manières possibles de partitionner les nombres en deux jeux jusqu'à ce que vous trouviez une partition où les sommes sont égales ou jusqu'à ce que vous ayez essayé toutes les partitions possibles et qu'aucune n'ait fonctionné. Si l'un d'entre eux travaillait, vous diriez OUI, sinon, vous diriez NON.S

Mais il y a de manière exponentielle beaucoup de partitions possibles, donc cela prendra beaucoup de temps. Toutefois , si je vous donne deux séries et , vous pouvez facilement vérifier si les sommes sont égales et si A et B est une partition de S . Notez que nous pouvons calculer les sommes efficacement.ABABS

Ici, la paire de A et B que je vous donne est une preuve de réponse OUI. Vous pouvez vérifier efficacement ma réclamation en consultant ma preuve et en vérifiant si elle est valide . Si la réponse est OUI, il existe une preuve valide que je peux vous donner et que vous pouvez vérifier efficacement. Si la réponse est NON, il n'y a pas de preuve valable. Donc, quoi que je vous donne, vous pouvez vérifier et voir que ce n'est pas une preuve valable. Je ne peux pas vous tromper par une preuve invalide que la réponse est OUI. Rappelons que si la preuve est trop grande, il faudra beaucoup de temps pour la vérifier, nous ne voulons pas que cela se produise, nous ne nous intéressons donc qu'aux preuves efficaces , c'est-à-dire aux preuves de taille polynomiale.

Parfois, les gens utilisent " certificat " ou " témoin " au lieu de "preuve".

Remarque Je vous donne suffisamment d'informations sur la réponse pour une entrée donnée x afin que vous puissiez trouver et vérifier la réponse efficacement. Par exemple, dans notre exemple de partition, je ne vous dis pas la réponse, je vous donne simplement une partition et vous pouvez vérifier si elle est valide ou non. Notez que vous devez vérifier la réponse vous-même, vous ne pouvez pas me faire confiance pour ce que je dis. De plus, vous ne pouvez que vérifier l'exactitude de mes preuves. Si ma preuve est valide, cela signifie que la réponse est OUI. Mais si ma preuve est invalide, cela ne signifie pas que la réponse est NON. Vous avez vu qu'une preuve était invalide et non qu'il n'y avait aucune preuve valide. Nous parlons de preuves pour OUI. Nous ne parlons pas de preuves pour NO.

Prenons un exemple: A={2,4} et B={1,5} prouve que S={1,2,4,5} peut être partitionné en deux ensembles de sommes égales. Nous avons juste besoin de résumer les chiffres en A et les nombres B et voir si les résultats sont égaux, et vérifiez si A , B est la partition de S .

Si je vous ai donné A={2,5} et B={1,4} , vous allez vérifier que ma preuve est invalide. Cela ne signifie pas que la réponse est NON, cela signifie simplement que cette preuve était invalide. Votre tâche ici n’est pas de trouver la réponse, mais seulement de vérifier si la preuve qui vous est donnée est valide.

C'est comme si un étudiant résolvait une question dans un examen et un professeur vérifiait si la réponse était correcte. :) (malheureusement souvent les étudiants ne donnent pas assez d'informations pour vérifier l'exactitude de leur réponse et les professeurs doivent deviner le reste de leur réponse partielle et décider quelle note ils doivent accorder aux étudiants pour leurs réponses partielles, voire très difficile tâche).

Ce qui est étonnant, c’est que la même situation s’applique à de nombreux autres problèmes naturels que nous voulons résoudre: nous pouvons vérifier efficacement si une preuve courte donnée est valide, mais nous ne connaissons aucun moyen efficace de trouver la réponse . C'est la raison pour laquelle la classe de complexité NP est extrêmement intéressante (même si ce n'était pas la motivation initiale pour la définir). Quoi que vous fassiez (pas seulement en CS, mais aussi en mathématiques, biologie, physique, chimie, économie, gestion, sociologie, entreprises,…), vous serez confronté à des problèmes de calcul relevant de cette classe. Pour avoir une idée du nombre de problèmes qui se révèlent être chez NP check out un condensé des problèmes d'optimisation des NP . En effet , vous aurez du mal à trouver des problèmes naturels qui ne sont pas en NP . C'est simplement incroyable.

NP est la classe de problèmes pour lesquels les vérificateurs sont efficaces, c'est-à-dire
qu'il existe un algorithme polynomial permettant de vérifier si une solution donnée est correcte.

Plus formellement, nous disons un problème de décision Q est NP ssi

il existe un algorithme efficace V appelé vérificateur tel que
pour toutes les entrées x ,

  • si Q(x)=YES alors il y a une preuve y telle que V(x,y)=YES ,
  • si Q(x)=NO alors pour toutes les preuves y , .V(x,y)=NO

Nous disons qu'un vérificateur est valable s'il n'accepte aucune preuve lorsque la réponse est NON. En d'autres termes, un vérificateur de son ne peut pas être trompé pour accepter une preuve si la réponse est vraiment NON. Pas de faux positifs.

De même, nous disons qu'un vérificateur est complet s'il accepte au moins une preuve lorsque la réponse est OUI. En d'autres termes, un vérificateur complet peut être convaincu que la réponse est OUI.

La terminologie vient des systèmes de logique et de preuve . Nous ne pouvons pas utiliser un système d'insonorisation pour prouver des déclarations fausses. Nous pouvons utiliser un système de preuves complet pour prouver toutes les affirmations vraies.

Le vérificateur obtient deux entrées,V

  • xQ : l'entrée d'origine pour , etQ
  • y : une preuve suggérée pourQ(x)=YES .

Notez que nous voulons que V soit efficace dans la taille de x . Si y est une grande preuve, le vérificateur ne pourra lire qu’une partie polynomiale de y . C'est pourquoi nous exigeons que les preuves soient courtes. Si y est court, dire que V est efficace dans x équivaut à dire que V est efficace dans x et y (car la taille de y est limitée par un polynôme fixe de la taille de x ).

En résumé, pour montrer qu'un problème de décision Q est NP nous devons donner un efficace algorithme de vérification qui est son et complète .

Note historique: historique ce n'est pas la définition originale de NP . La définition d'origine utilise ce qu'on appelle des machines de Turing non déterministes . Ces machines ne correspondent pas à un réel modèle de machine et sont difficiles à se habituer à (au moins lorsque vous commencez à en apprendre davantage sur la théorie de la complexité). J'ai lu que de nombreux experts pensent qu'ils auraient utilisé la définition du vérificateur comme définition principale et auraient même nommé la classe VP (pour vérifiable en temps polynomial) à la place de NP s'ils remontent à l'aube de la théorie de la complexité informatique. La définition du vérificateur est plus naturel, plus facile à comprendre sur le plan conceptuel, et plus facile à utiliser pour montrer les problèmes sont en NP .


PNP

Nous avons donc P = efficace résoluble et NP = vérifiable efficacement . Alors P=NP ssi les problèmes qui peuvent être efficacement vérifiés sont les mêmes que les problèmes qui peuvent être efficacement résolus.

Notez que tout problème dans P est également dans NP , c'est-à-dire que si vous pouvez résoudre le problème, vous pouvez également vérifier si une preuve donnée est correcte: le vérificateur ignorera simplement la preuve!

C'est parce que nous n'en avons pas besoin, le vérificateur peut calculer la réponse lui-même, il peut décider si la réponse est OUI ou NON sans aucune aide. Si la réponse est NON, nous savons qu'il ne devrait y avoir aucune preuve et notre vérificateur rejettera simplement toutes les preuves suggérées. Si la réponse est OUI, il devrait y avoir une preuve, et en fait, nous n'accepterons rien comme preuve.

[Nous aurions pu demander à notre vérificateur d’en accepter seulement quelques-unes, ce qui est également bien, à condition que notre vérificateur accepte au moins une preuve que le vérificateur fonctionne correctement pour le problème.]

Voici un exemple:

Somme d'
entrée: une liste de n+1 nombres naturels a1,,an et s ,
Question: est Σi=1nai=s ?

Le problème est dans P parce que nous pouvons résumer les nombres puis les comparer avec s , nous retournons OUI s'ils sont égaux et NON si ils ne le sont pas.

Le problème est également en NP . Prenons un vérificateur V qui obtient une épreuve plus l’entrée pour Sum. Il agit de la même manière que l'algorithme de P décrit ci-dessus. C'est un vérificateur efficace pour Sum.

Notez qu'il existe d'autres vérificateurs efficaces pour Sum et que certains d'entre eux peuvent utiliser la preuve qui leur est donnée. Cependant, celui que nous avons conçu ne le fait pas et cela convient également. Depuis que nous avons donné un vérificateur efficace pour somme le problème est dans NP . La même astuce fonctionne pour tous les autres problèmes P donc PNP .


Algorithmes de recherche par force brute / recherche exhaustive pour NP et NPExpTime

Les meilleurs algorithmes que nous connaissons pour résoudre un problème arbitraire dans NP sont les algorithmes de force brute / recherche exhaustive . Choisissez un vérificateur efficace pour le problème (il a un vérificateur efficace en supposant qu'il est dans NP ) et vérifiez toutes les preuves possibles une par une. Si le vérificateur en accepte un, la réponse est OUI. Sinon, la réponse est NON.

Dans notre exemple de partition, nous essayons toutes les partitions possibles et vérifions si les sommes sont égales dans l'une d'elles.

Notez que l'algorithme de force brute s'exécute dans le temps exponentiel dans le pire des cas. La taille des preuves est polynomiale dans la taille de l'entrée. Si la taille des épreuves est m il y a 2m épreuves possibles. La vérification de chacun d’eux prendra un temps polynomial par le vérificateur. Donc, au total, l'algorithme de force brute prend un temps exponentiel.

Cela montre que tout problème de NP peut être résolu en temps exponentiel, c'est-à-dire NPExpTime . ( En outre , l'algorithme de force brute va utiliser seulement une quantité polynomiale de l' espace, à savoir NPPSpace mais qui est une histoire pour un autre jour).

Un problème dans NP peut avoir des algorithmes beaucoup plus rapides, par exemple tout problème dans P a un algorithme polynomial. Cependant, pour un problème arbitraire dans NP nous ne connaissons pas d’algorithmes capables de faire beaucoup mieux. En d'autres termes, si vous venez de me dire que votre problème est dans NP (et rien d'autre à propos du problème), alors l'algorithme le plus rapide que nous connaissons pour le résoudre prend un temps exponentiel.

Cependant, cela ne signifie pas qu’il n’ya pas de meilleurs algorithmes, nous ne le savons pas . Autant que nous sachions, il est toujours possible (bien que cela soit considéré comme très improbable par presque tous les théoriciens de la complexité) que NP=P et tous les problèmes de NP puissent être résolus en temps polynomial.

En outre, certains experts supposent que nous ne pouvons pas faire beaucoup mieux, c'est-à-dire qu'il existe des problèmes dans NP qui ne peuvent pas être résolus beaucoup plus efficacement que les algorithmes de recherche par force brute, qui prennent un temps exponentiel. Voir Hypothèse de temps exponentiel pour plus d'informations. Mais ce n'est pas prouvé, ce n'est qu'une conjecture . Cela montre à quel point nous sommes loin de trouver des algorithmes de temps polynomiaux pour des problèmes arbitraires de NP

Cette association avec le temps exponentiel confond certaines personnes: elles pensent à tort que les problèmes de NP nécessitent une résolution de temps exponentiel (ou pire, il n’existe aucun algorithme pour eux). Affirmer qu'un problème est dans NP ne signifie pas qu'un problème est difficile à résoudre, cela signifie simplement qu'il est facile à vérifier, c'est une limite supérieure à la difficulté de résoudre le problème, et de nombreux problèmes de NP sont faciles à résoudre étant donné que PNP .

Néanmoins, il existe des problèmes NP qui semblent difficiles à résoudre. Je reviendrai quand nous discutons NP -hardness.


Les limites inférieures semblent difficiles à prouver

D'accord, nous savons maintenant qu'il existe de nombreux problèmes naturels en NP , nous ne connaissons aucun moyen efficace de les résoudre et nous pensons qu'ils ont vraiment besoin de temps exponentiel pour les résoudre. Pouvons-nous le prouver?

Malheureusement, il est très difficile de prouver les limites inférieures . Nous ne pouvons même pas prouver que ces problèmes nécessitent plus que du temps linéaire ! Laisse seul nécessiter un temps exponentiel.

Il est assez facile de prouver les limites inférieures du temps linéaire: l'algorithme doit lire l'entrée après tout. Prouver des limites inférieures super-linéaires est une histoire complètement différente. Nous pouvons prouver des limites inférieures super-linéaires avec davantage de restrictions sur le type d'algorithmes que nous envisageons, par exemple, les algorithmes de tri utilisant la comparaison, mais nous ne connaissons pas les limites inférieures sans ces restrictions.

Pour prouver une limite supérieure à un problème, nous avons juste besoin de concevoir un algorithme assez bon. La mise au point d'un tel algorithme nécessite souvent des connaissances, une pensée créative et même de l'ingéniosité.

Cependant, la tâche est considérablement plus simple que de prouver une limite inférieure. Nous devons montrer qu'il n'y a pas de bons algorithmes . Non pas que nous ne connaissions pas assez d’algorithmes assez bons à l’heure actuelle, mais qu’il n’existe aucun bon algorithme , que personne ne trouvera jamais un bon algorithme . Pensez-y une minute si vous ne l'avez pas encore fait, comment pouvons-nous montrer un résultat aussi impossible ?

C'est un autre endroit où les gens sont confus. Ici, "impossibilité" est une impossibilité mathématique , c’est-à-dire que ce n’est pas un hasard si un génie peut le réparer à l’avenir. Lorsque nous disons impossible, nous entendons qu'il est absolument impossible, aussi impossible que 1=0 . Aucune avancée scientifique ne peut le rendre possible. C'est ce que nous faisons lorsque nous prouvons des limites inférieures.

Pour prouver une limite inférieure, par exemple pour montrer qu'un problème nécessite une certaine quantité de temps pour résoudre, signifie que nous devons prouver que toutUn algorithme, même très ingénieux qui ne le sait pas encore, ne peut résoudre le problème plus rapidement. Nous connaissons de nombreuses idées intelligentes (gourmande, correspondance, programmation dynamique, programmation linéaire, programmation semi-finale, programmation par somme de carrés, et bien d’autres idées intelligentes) et il en existe beaucoup d’autres que nous ne connaissons pas encore. Exclure un algorithme ou une idée particulière de concevoir des algorithmes ne suffit pas, nous devons les exclure tous, même ceux que nous ne connaissons pas encore, même ceux qui ne le savent peut-être jamais! Et on peut combiner tous ces éléments dans un algorithme, il faut donc également exclure leurs combinaisons. Certains progrès ont été réalisés pour montrer que certaines idées ne peuvent pas résoudre des problèmes difficiles NPles problèmes, par exemple glouton et ses extensions, ne peuvent pas fonctionner, et certains travaux sont liés aux algorithmes de programmation dynamique, et certains travaux concernent des manières particulières d'utiliser la programmation linéaire. Mais ils ne sont même pas près d’écarter les idées intelligentes que nous connaissons (recherchez des limites inférieures dans des modèles de calcul restreints si vous êtes intéressé).


Obstacles: les limites inférieures sont difficiles à prouver

D'autre part, nous avons des résultats mathématiques appelés obstacles qui disent qu'une preuve de la limite inférieure ne peut pas être telle ou telle, et telle ou telle couvre presque toutes les techniques que nous avons utilisées pour prouver les limites inférieures! En fait, de nombreux chercheurs ont abandonné le travail de démonstration des limites inférieures après le résultat de barrière aux preuves naturelles d' Alexander Razbarov et Steven Rudich . Il s’avère que l’existence d’un type particulier de preuves à la limite inférieure impliquerait l’insécurité des générateurs de nombres cryptographiques pseudo-aléatoires et de nombreux autres outils cryptographiques.

Je dis presque parce que ces dernières années, certains progrès ont été réalisés, principalement par Ryan Williams, qui a réussi à contourner intelligemment les résultats de la barrière. Néanmoins, les résultats obtenus jusqu'à présent concernent des modèles de calcul très faibles et assez loin d'exclure les algorithmes généraux à temps polynomiaux. .

Mais je suis en train de diverger. Ce que je voulais surtout dire, c’est qu’il est difficile de prouver les limites inférieures et que nous n’avons pas de fortes limites inférieures pour les algorithmes généraux résolvant NP problèmes.

[D'autre part, les travaux de Ryan Williams montrent qu'il existe des liens étroits entre la détermination de limites inférieures et la détermination de valeurs supérieures. Voir sa présentation à l'ICM 2014 si cela vous intéresse.]


Réductions: Résoudre un problème en utilisant un autre problème comme sous-programme / Oracle / Black Box

L'idée d'une réduction est très simple: pour résoudre un problème, utilisez un algorithme pour un autre problème.

Voici un exemple simple: supposons que nous voulions calculer la somme d'une liste de n nombres naturels et que nous ayons un algorithme Sum qui renvoie la somme de deux nombres donnés. Pouvons-nous utiliser Sum pour additionner les nombres de la liste? Bien sûr!

Problème:

Entrée: une liste de n nombres naturels x1,,xn ,
Sortie: return i=1nxi .

Algorithme de réduction:

  1. s=0
  2. pour i de 1 à n
    2.1. s=Sum(s,xi)
  3. retour s

Ici, nous utilisons Sum dans notre algorithme en tant que sous - programme . Notez que nous ne se soucient pas de la façon dont Sum fonctionne, il agit comme boîte noire pour nous, nous ne nous soucions pas ce qui se passe à l' intérieur Sum . On parle souvent du sous - programme Sum comme oracle . C'est comme l'oracle de Delphes dans la mythologie grecque, nous posons des questions et l'oracle y répond et nous utilisons les réponses.

C’est essentiellement ce qu’est une réduction: supposons que nous ayons un algorithme pour un problème et l’utilisons comme un oracle pour résoudre un autre problème. Dans ce cas, efficace signifie efficace, en supposant que l'oracle réponde en unité de temps, c'est-à-dire que nous comptons chaque exécution de l'oracle comme une étape.

Si l'oracle renvoie une réponse volumineuse, nous devons la lire et cela peut prendre un certain temps. Nous devons donc compter le temps qu'il nous faut pour lire la réponse fournie par Oracle. De même pour écrire / poser la question de l'oracle. Mais oracle fonctionne instantanément, c'est-à-dire que dès que nous posons la question de l'oracle, l'oracle écrit la réponse pour nous en une seule unité de temps. Tout le travail effectué par oracle est compté en une seule étape, mais cela exclut le temps nécessaire pour écrire la question et lire la réponse.

Parce que nous ne nous soucions pas du fonctionnement d’Oracle mais seulement des réponses qu’il nous renvoie, nous pouvons faire une simplification et considérer l’Oracle comme le problème à la place d’un algorithme. En d'autres termes, nous ne nous soucions pas de savoir si l'oracle n'est pas un algorithme, nous ne nous soucions pas de savoir comment oracles parvient à ses réponses.

Par exemple, dans la question ci-dessus , Sum est la fonction d’addition elle-même (et non un algorithme de calcul de l’addition).

Nous pouvons poser plusieurs questions à un oracle et il n’est pas nécessaire que les questions soient prédéterminées: nous pouvons poser une question et sur la base de la réponse renvoyée par Oracle, nous effectuons certains calculs par nous-mêmes, puis nous posons une autre question en fonction de la réponse obtenue. la question précédente.

Une autre façon de voir cela consiste à le considérer comme un calcul interactif . Le calcul interactif est en soi un sujet important, je ne vais donc pas en parler ici, mais je pense que mentionner cette perspective de réduction peut être utile.

Un algorithme A qui utilise un oracle / boîte noire O est habituellement désignée par AO .

La réduction , nous avons discuté ci - dessus est la forme la plus générale d'une réduction et est connu comme la réduction de la boîte noire (aka réduction oracle , réduction Turing ).

Plus formellement:

Nous disons que le problème Q est une boîte noire réductible au problème O et écrivons QTO si et seulement si
il existe un algorithme A tel que pour toutes les entrées x ,
Q(x)=AO(x) .

En d' autres termes , s'il existe un algorithme A qui utilise l'oracle O en tant que sous - programme et résout le problème Q .

Si l' algorithme de réduction A court en temps polynomial que nous appelons un temps polynomiale réduction boîte noire ou simplement une réduction de Cook (en l' honneur de Stephen A. Cook ) et écrire QTPO . (L'indice T signifie "Turing" en l'honneur d' Alan Turing ).

Cependant, nous pouvons vouloir imposer des restrictions à la manière dont l'algorithme de réduction interagit avec l'oracle. Plusieurs restrictions sont étudiées, mais la restriction la plus utile est celle appelée réductions de plusieurs unités (ou réductions de mappage ).

L'idée ici est que, sur une entrée donnée x , nous effectuons un calcul polynomial en temps et générons un y représentant le problème résolu par l'oracle. Nous demandons ensuite à l'oracle et nous retournons la réponse qu'il nous renvoie. Nous sommes autorisés à poser une seule question de l'oracle et les réponses de l'oracle sont ce qui sera retourné.

Plus formellement,

Nous disons que le problème Q est plusieurs-un réductible au problème O et écrivons QmO si et seulement
s'il existe un algorithme A tel que pour toutes les entrées x ,
Q(x)=O(A(x)) .

Lorsque l'algorithme de réduction est temps polynomiale que nous appelons polynôme temps beaucoup-une réduction ou simplement la réduction Karp (en l' honneur de Richard M. Karp ) et on note par QmPO .

La principale raison de l'intérêt dans ce cas particulier la réduction non interactive est qu'il préserve NP problèmes: s'il y a un polynôme temps beaucoup-une réduction d'un problème A à un NP problème B , alors A est également en NP .

La notion simple de réduction est l’une des notions les plus fondamentales de la théorie de la complexité avec P , NP et NP complète (que nous verrons plus loin).


La publication est devenue trop longue et dépasse la limite d'une réponse (30000 caractères). Je vais continuer la réponse dans la partie II .


2
En ce qui concerne votre introduction, les lecteurs pourraient être intéressés par « NP-complet » problèmes d'optimisation et problèmes de décision contre « vrais » problèmes qui ne sont pas oui ou non .
Raphaël

4
@Kaveh C'est un post génial, merci. Je faisais la décidabilité avant cette section dans la classe, mais je suis un peu en retard dans ma compréhension de prouver l'indécidabilité. Je ne sais pas si cela a quelque chose à voir avec mon manque de compréhension de la complexité.
agent154

5
J'ai lu de nombreux livres de complexité allant du niveau d'introduction (y compris Sipser) au plus avancé. Je n'ai aucun problème avec les mathématiques abstraites (par exemple, je suis capable de lire l'algèbre de Lang). Cette réponse est la meilleure pour expliquer NP contre P. Je vous suggère de passer plus de temps à le polir et à en faire des notes de cours. Cela peut aider beaucoup de gens.
Scaaahu

@scaaahu, merci pour la gentille remarque et aussi pour les suggestions. Je prévois de terminer et de peaufiner cela bientôt.
Kaveh

10
Cette réponse doit être faite à titre de réponse de référence. Toutes les futures questions de base de type P / NP doivent être abordées en premier. Description très fluide!
Paresh

180

Partie II

Suite de la première partie .

Le précédent dépassait le nombre maximal de lettres autorisé dans une réponse (30000), je le décompose donc en deux.

Complétude:Universal N P ProblemsNP NP

OK, jusqu’à présent, nous avons discuté de la classe de problèmes efficacement résolvables ( ) et de la classe de problèmes effectivement vérifiables ( N P ). Comme nous en avons discuté ci-dessus, ces deux valeurs sont des limites supérieures . Concentrons notre attention pour l' instant sur les problèmes à l' intérieur N P comme incroyablement nombreux problèmes naturels se révèlent être à l' intérieur N P .PNPNPNP

Maintenant, nous voulons parfois dire qu'un problème est difficile à résoudre . Mais comme nous l’avons mentionné ci-dessus, nous ne pouvons pas utiliser les limites inférieures à cette fin: théoriquement, ce sont exactement ce que nous voudrions prouver, mais dans la pratique, nous n’avons pas beaucoup réussi à établir les limites inférieures et, en général, ils sont difficiles à prouver comme nous l’avons mentionné. au dessus de. Y a-t-il encore moyen de dire qu'un problème est difficile à résoudre ?

Voici la notion de complétude. Mais avant de définir N P -completeness nous laisser un autre regard sur les réductions.NPNP

Réductions en tant que difficulté relative

Nous pouvons considérer les limites inférieures comme une difficulté absolue des problèmes. Ensuite, nous pouvons considérer les réductions comme une difficulté relative des problèmes. Nous pouvons prendre une réduction de à BAB en disant est plus facile que BAB . Ceci est implicite dans la notion nous avons utilisée pour les réductions. Formellement, les réductions donnent des ordres partiels sur les problèmes.

Si nous pouvons réduire efficacement un problème à un autre problème B, alors A ne devrait pas être plus difficile à résoudre que B. L'intuition est la suivante:ABAB

Que soit une réduction efficace de A à B , à savoir M est un algorithme efficace qui utilise B et résout A . Laissez - N être un algorithme efficace qui résout B . Nous pouvons combiner la réduction efficace M B et l'algorithme efficace N pour obtenir M N qui est un algorithme efficace qui permet de résoudre A .MBABMBANBMBNMNA

En effet, nous pouvons utiliser un sous-programme efficace dans un algorithme efficace (chaque appel de sous-programme coûte une unité de temps) et le résultat est un algorithme efficace. C'est une très belle propriété de fermeture des algorithmes polynomiaux et , elle ne vaut pas pour beaucoup d'autres classes de complexité.P

-complete signifie plus difficiles N P problèmesNPNP

Maintenant que nous avons un moyen relatif de comparer la difficulté des problèmes, nous pouvons demander quels problèmes sont les plus difficiles parmi les problèmes de ? Nous appelons ces problèmes N P -complete .NPNP

les problèmes sont les plus difficiles N P problèmesNPNP,
si nous pouvons résoudre un problème -complete efficacement, nous pouvons résoudre tous les N P efficacementproblèmes.NPNP

Plus formellement, nous disons qu'un problème de décision est N P -complete si et seulementUNENP

est dans N P , et pour tous les N P problèmes B , B est un polynôme de plusieurs fois réductible à A ( B P m A ).UNENP
NPBBUNEBmPUNE

Une autre façon de penser aux problèmes -complets est de les considérer comme la version complexe des machines de Turing universelles . Un N P problème -complete est universel parmi N P problèmes dans un sens similaire: vous pouvez les utiliser pour résoudre tous les N P problème.NPNPNPNP

C'est l'une des raisons pour lesquelles les bons solveurs SAT sont importants, en particulier dans l'industrie. SAT est complet (plus sur cela plus tard), nous pouvons donc nous concentrer sur la conception de très bons algorithmes (autant que possible) pour résoudre SAT. Pour résoudre tout autre problème dans N P, nous pouvons convertir l'instance de problème en une instance SAT, puis utiliser un solveur SAT hautement optimisé de qualité industrielle.NPNP

(Deux autres problèmes sur lesquels beaucoup de personnes travaillent pour optimiser leurs algorithmes pour une utilisation pratique dans l’industrie sont la programmation sur nombres entiers et le problème de satisfaction des contraintes . Selon votre problème et les instances qui vous intéressent, les algorithmes optimisés pour l’un d’eux peuvent donner de meilleurs résultats que le autres.)

Si un problème satisfait à la deuxième condition de la définition de complétude (c'est-à-dire la condition d'universalité), nous appelons le problème N P -hard .NP
NP

dureté N P est une façon de dire qu'un problème est difficile.NP

Personnellement, je préfère penser à la dureté comme à l’universalité. N P- universal aurait probablement pu être un nom plus correct, car nous ne savons pas pour le moment si elles sont vraiment dures ou si c’est simplement parce que nous n’avons pas pu. trouver un algorithme polynomial pour eux).NPNP

Le nom hard confond également les gens à penser à tort que les problèmes N P- hard sont des problèmes qui sont absolument difficiles à résoudre. Nous ne le savons pas encore, nous savons seulement qu’ils sont aussi difficiles que tout problème N P à résoudre. Bien que les experts pensent qu'il est peu probable qu'il soit encore possible de résoudre tous les problèmes de N P de manière simple et efficace. En d'autres termes, être aussi difficile que tout autre problème N P ne signifie pas vraiment difficile. Cela n’est vrai que s’il ya un problème N P absolument absolu.NPNPNPNPNPNP difficile (c’est-à-dire qu’il n’a pas d’algorithme de temps polynomial).

Maintenant les questions sont:

  • NP

  • En connaissons-nous?

NPNPNPNP

NPEXpTjemeNPNP

p¬p

NPNP

UNENPUNEBBNPNPUNEUNEBNPB

NPNPNP

NPNP

SUNETNPSUNETSvousbsetSvousmNPSUNETSvousbsetSvousm

NP

NP

Remarque: la partie suivante pourrait être un peu technique en première lecture.

NP


VXtk
YESkVXtNO

UnjeVerNP

VNPXVXUnjeVer
tkVXVX

tttk

NPUnjeVerNP


MXMt
YESMXYEStNOYESt

CPt

jenterpreter

UnjeVerNPMXtkcckjenterpreterMYESXct

SUNETNP

UnjeVerNPUnjeVerNP

NPSUNET

SUNET


φ
YESφNO

SUNETNP


Pour être écrit ...

NP

NP

NP

PNP

Et après? Où aller en partant d'ici?


6
J'aimerais pouvoir voter plus d'une fois, merci d'avoir déployé tant d'efforts pour répondre!
Fingolfin

2
Wow, article génial! Je suis aussi vraiment impatient de voir les parties annoncées, notamment "Que faire si vous devez résoudre un problème NP-complet?".
Tobias Hermann

5
@ xci13 Vous pouvez! Upvote la première partie;)
Vince Emigh

4
J'ai créé un compte ici juste pour voter vos deux posts!
ghosts_in_the_code

6
@Kaveh Est-il prévu de terminer cet article merveilleusement écrit?
Gab

26

Plus que d’utiles réponses citées, je vous recommande vivement de regarder « Au-delà du calcul: le problème P vs NP » de Michael Sipser . Je pense que cette vidéo devrait être archivée comme l’une des principales vidéos d’enseignement en informatique.!

Prendre plaisir!


Fait intéressant, mon manuel est par lui. Ce n'est pas un livre horrible, mais il en laisse à désirer.
agent154

8

Copier ma réponse à une question similaire sur le débordement de pile:

Le moyen le plus simple d’expliquer P v. NP et ainsi de suite sans entrer dans les détails techniques est de comparer les "problèmes de mots" à ceux de "problèmes à choix multiples".

Lorsque vous essayez de résoudre un "problème de mots", vous devez trouver la solution à partir de zéro. Lorsque vous essayez de résoudre un "problème à choix multiples", vous avez le choix: résolvez-le comme vous le feriez avec un "problème de mots" ou essayez de brancher chacune des réponses qui vous sont données et de choisir la réponse du candidat qui convient.

Il arrive souvent qu’un «problème à choix multiples» soit beaucoup plus facile que le «problème de mots» correspondant: substituer les réponses du candidat et vérifier si elles s’accordent peut demander beaucoup moins d’efforts que de trouver la bonne réponse à partir de zéro.

Maintenant, si nous sommes d’accord sur l’effort qui prend du temps polynomial "facile", la classe P consisterait en "problèmes de mots simples" et la classe NP en "problèmes simples à choix multiples".

L’essence de P v. NP est la question suivante: "Existe-t-il des problèmes faciles à choix multiples qui ne sont pas faciles à résoudre comme des mots"? Autrement dit, existe-t-il des problèmes pour lesquels il est facile de vérifier la validité d'une réponse donnée, mais il est difficile de trouver cette réponse à partir de zéro?

Maintenant que nous comprenons intuitivement ce qu'est le NP, nous devons remettre en question notre intuition. Il s’avère qu’il existe des "problèmes à choix multiples" qui, d’une certaine manière, sont les plus difficiles de tous: si l’on trouvait une solution à l’un de ces problèmes, le plus difficile de tous, on pourrait trouver une solution à TOUS Problèmes NP! Lorsque Cook a découvert cela il y a 40 ans, cela a été une surprise totale. Ces problèmes les plus difficiles sont connus sous le nom de NP-hard. Si vous trouvez une "solution de problèmes de mots" à l'une d'elles, vous trouverez automatiquement une "solution de problèmes de mots" à chacun de "problèmes faciles à choix multiples"!

Enfin, les problèmes NP-complets sont ceux qui sont simultanément NP et NP-durs. Suivant notre analogie, ils sont à la fois "faciles à problèmes à choix multiples" et "le plus difficile d'entre eux, à problèmes de mots".


Maintenant que nous comprenons intuitivement ce qu'est le NP, nous devons remettre en question notre intuition. Il s'avère qu'il existe des "problèmes à choix multiples" - vouliez-vous dire "problèmes de mots"? Je pense que oui, parce que tous les problèmes de NP sont faciles à "choix multiples" par définition.
Dmitry Grigoryev le

Par la ligne Il se trouve qu'il ya des « multiples problèmes de choix » qui, dans un certain sens, sont les plus difficiles de tous je voulais dire Il se trouve qu'il ya des problèmes NP qui, dans un certain sens, sont les plus difficiles de tous . Ces problèmes NP sont en effet des problèmes faciles à choix multiples par définition, mais ils sont aussi les plus difficiles à résoudre. L’exemple standard est SAT3: c’est simple comme problème à choix multiples, mais difficile comme problème de mots.
Michael

7

Le plus simple d'entre eux est P, les problèmes résolvables en temps polynomial appartiennent ici.

Puis vient NP. Les problèmes pouvant être résolus en temps polynomial sur une machine de Turing non déterministe appartiennent ici.

La dureté et la complétude doivent être réduites. Un problème A est difficile pour une classe C si tous les problèmes de C se réduisent à A. Si le problème A est difficile pour NP , ou NP-difficile, si tous les problèmes de NP se réduisent à A.

Enfin, un problème est complet pour une classe C s'il est en C et difficile pour C. Dans votre cas, le problème A est complet pour NP , ou NP-complet, si tous les problèmes de NP se réduisent à A et que A est dans NP .

Pour ajouter à l'explication de NP, un problème existe dans NP si et seulement si une solution peut être vérifiée en temps polynomial (déterministe). Considérez n'importe quel problème NP-complet que vous connaissez, SAT, CLIQUE, SOMME SUBSET, VERTEX COVER, etc. Si vous "obtenez la solution", vous pouvez vérifier son exactitude en temps polynomial. Ce sont, respectivement, des assignations de vérité pour les variables, un sous-graphe complet, un sous-ensemble de nombres et un ensemble de sommets qui dominent toutes les arêtes.


7

Extrait de la vidéo P vs. NP et de la vidéo Computing Complexity Zoo .

Pour un ordinateur avec une très grosse version d'un problème ...

P problèmes

facile à résoudre (rubix cube)

Problèmes de NP

difficile à résoudre - mais vérifier les réponses est facile (sudoku)

Peut-être que ce sont tous vraiment des problèmes avec P mais nous ne le savons pas ... P vs NP .

NP-complet

Beaucoup de problèmes de NP se ramènent au même (le sudoku est un nouveau venu sur la liste).

Problèmes d'EXP

vraiment difficile à résoudre (par exemple, le meilleur coup suivant aux échecs)

NP-problèmes difficiles

NP-hard n'est pas bien expliqué dans la vidéo (ce sont tous les bits roses du diagramme ci-dessous). Le diagramme NP-hard d' Euler de Wikipedia est plus clair à ce sujet.

Diagrammes d'Euler SVG de P, NP, NP-complet et NP-difficile

Diagramme

Comme affiché vers la fin de la vidéo.

Diagrammes Black-Euler de P, NP, NP-complet, EXP et NP-difficile


2

P , NP , NP-complete et NP-hard sont des classes de complexité, classant les problèmes en fonction de la complexité algorithmique utilisée pour les résoudre. En bref, ils sont basés sur trois propriétés:

tableau des classes de complexité

Résolu en temps polynomial: définit les problèmes de décision pouvant être résolus par une machine de Turing déterministe (DTM) utilisant une quantité polynomiale de temps de calcul, c'est-à-dire que son temps d'exécution est limité au maximum par une expression polynomiale de la taille de l'entrée de l'algorithme. En utilisant la notation Big-O, cette complexité temporelle est définie comme suit O(n ^ k), où n est la taille de l’entrée et le coefficient ka constant.

Solution vérifiable en temps polynomial: définit les problèmes de décision pour lesquels une solution donnée peut être vérifiée par un DTM utilisant une durée de calcul polynomiale, même si l'obtention de la solution correcte peut nécessiter des temps plus longs.

Réduit tout problème de NP en temps polynomial : définit les problèmes de décision dont les algorithmes de résolution peuvent être utilisés pour résoudre tout problème de NP après une étape de traduction polynomiale.


J'ai récemment écrit un article sur ce sujet fournissant plus de détails, notamment une démonstration de code permettant de réduire un problème NP en problème NP-difficile: Classes de problèmes de complexité

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.