Décidabilité et classes de complexité
Cours complet · informatique (MP2I/MPI), chapitre 31 · MP2I et MPI
Travailler ce chapitre sur Adloun Exercices corrigés de ce chapitre
31.1 Ce qu'un algorithme ne peut pas faire
Ce dernier chapitre change de question. Les trente précédents demandaient comment résoudre un problème ; celui-ci demande si l'on peut, et à quel prix. Le programme le formule ainsi : « on s'intéresse à la question de savoir ce qu'un algorithme peut ou ne peut pas faire, inconditionnellement ou sous condition de ressources en temps. Cette partie permet de justifier la construction, plus haut, d'algorithmes exhaustifs, approchés, probabilistes. »
C'est donc le chapitre qui explique a posteriori pourquoi le chapitre chap:probabilistes existe.
« La notion de machine de Turing est hors programme. On s'en tient à une présentation intuitive du modèle de calcul (code exécuté avec une machine à mémoire infinie). » Et plus loin : « le modèle de calcul est une machine à mémoire infinie qui exécute un programme rédigé en OCaml ou en C ». Enfin : « les modèles de calcul non-déterministes sont hors programme ».
On raisonne donc sur des programmes ordinaires, avec une mémoire idéalement illimitée. C'est suffisant pour tout ce qui suit.
31.2 Mesurer
Un problème de décision appelle une réponse par oui ou non. Une instance est une donnée particulière, et sa taille est le nombre de bits nécessaires pour l'écrire.
Le chapitre chap:dynamique l'annonçait : l'algorithme du sac à dos en n'est pas polynomial, car s'écrit avec bits. Un algorithme dont le coût est proportionnel à la valeur d'un nombre est exponentiel en sa taille.
| Entrée | Taille | Coût de |
|---|---|---|
| bits | ||
| bits | ||
| bits |
Trois fois plus de bits — de à — et un million de fois plus de travail ; six fois plus, et c'est . C'est bien une exponentielle, et il suffit de lire le tableau ligne à ligne pour s'en convaincre. On dit l'algorithme pseudo-polynomial.
Une opération élémentaire est une lecture ou écriture en mémoire, une opération arithmétique, une comparaison — chacune comptée pour une unité. La complexité en temps d'un algorithme est le nombre d'opérations élémentaires en fonction de la taille de l'entrée, dans le pire cas.
31.3 Les classes P et NP
est l'ensemble des problèmes de décision pour lesquels il existe un algorithme de complexité polynomiale en la taille de l'entrée.
Le programme y insiste : « on prend soin de distinguer la notion de complexité d'un algorithme de la notion de classe de complexité d'un problème ».
| Complexité d'un algorithme | ce que cet algorithme coûte |
|---|---|
| Classe d'un problème | ce que coûte le meilleur algorithme, connu ou non |
Le second énoncé est infiniment plus fort. Dire « le tri est en » parle d'un algorithme ; dire « ce problème n'est pas dans » affirmerait que personne, jamais, n'en trouvera de polynomial. C'est pourquoi les résultats de la seconde espèce sont si rares.
Et ne contient que des problèmes de décision — le programme le souligne. « Trouver le plus court chemin » n'est pas dans à proprement parler ; « existe-t-il un chemin de longueur ? » y est.
Le programme demande cette « transformation d'un problème d'optimisation en un problème de décision à l'aide d'un seuil ». On remplace « quel est le minimum ? » par « existe-t-il une solution de coût ? ».
Les deux versions sont équivalentes en difficulté : par dichotomie sur — celle du chapitre chap:diviser — un nombre logarithmique d'appels à la version décision donne la valeur optimale.
est l'ensemble des problèmes de décision dont toute réponse « oui » admet un certificat de taille polynomiale, vérifiable en temps polynomial.
C'est le point le plus mal compris de la théorie. n'est pas « non polynomial ». Le programme donne d'ailleurs la définition par la vérification, et écarte les modèles non déterministes.
| Problème | Certificat | Vérification |
|---|---|---|
| sat | une valuation | évaluer la formule : |
| -coloration | une coloration | vérifier chaque arête : |
| Sac à dos ( ?) | la liste des objets | sommer poids et valeurs : |
| Chemin hamiltonien | l'ordre des sommets | vérifier les arcs : |
Dans les quatre cas, trouver le certificat semble exiger une recherche exponentielle ; le vérifier prend quelques lignes.
Démonstration
Si un problème se résout en temps polynomial, le certificat peut être vide : le vérificateur ignore le certificat et relance l'algorithme de résolution, qui est polynomial.
L'inclusion réciproque est ouverte depuis 1971. Personne n'a exhibé d'algorithme polynomial pour un problème np-complet, et personne n'a démontré qu'il n'en existe pas.
Ce qu'il faut en retenir n'est pas une opinion sur la réponse, mais sa conséquence pratique : sur un problème np-complet, on ne cherche pas d'algorithme exact et rapide — on emploie les méthodes du chapitre chap:probabilistes.
31.4 Réductions et NP-complétude
Un problème se réduit polynomialement à , noté , s'il existe une fonction calculable en temps polynomial telle que
Le programme s'en tient « à quelques exemples élémentaires ».
signifie : est au moins aussi difficile que . Car si l'on savait résoudre vite, on résoudrait vite — en traduisant puis en résolvant.
C'est le sens que l'on inverse une fois sur deux. La mnémonique : la réduction transporte la difficulté vers la cible. On réduit un problème connu difficile vers celui qu'on étudie, pour montrer que le nouveau est difficile aussi.
Un problème est np-difficile si tout problème de s'y réduit polynomialement. Il est np-complet s'il est de plus dans .
Les problèmes np-complets sont donc les plus difficiles de : si l'un d'eux était dans , tous y seraient, et .
sat est np-complet.
Le programme l'admet — « théorème de Cook-Levin (admis) » — et demande d'en tirer des réductions : « on présente des exemples de réduction de problèmes np-complets à partir de sat ».
Sa portée : il fournit le premier problème np-complet, celui à partir duquel tous les autres se démontrent. Une fois sat établi, montrer qu'un problème est np-difficile ne demande plus qu'une réduction — un travail fini, souvent élégant, au lieu d'un raisonnement sur tous les problèmes de .
Le programme ajoute une limite : « la connaissance d'un catalogue de problèmes np-complets n'est pas un objectif du programme ». On retient la méthode, pas la liste.
On construit, à partir d'une formule en -fnc, un graphe -coloriable si et seulement si est satisfiable. Trois couleurs : V, F, N (neutre).
Le socle : un triangle sur trois sommets — ils reçoivent forcément trois couleurs distinctes, qui nomment les couleurs.
Les variables : pour chaque , deux sommets et reliés entre eux et tous deux reliés à . Ils reçoivent donc l'un V et l'autre F : la coloration est une valuation.
Les clauses : un petit assemblage par clause, construit pour être -coloriable exactement lorsqu'au moins un de ses trois littéraux reçoit V.
La construction est polynomiale — un nombre borné de sommets par variable et par clause — et l'équivalence est immédiate par construction. Donc la -coloration est np-difficile.
Bonne pratique (Ce qu'on fait quand un problème est NP-complet)
C'est la conclusion utile, et elle rassemble le livre.
| Si l'instance est petite | exhaustif ou branch and bound (ch. chap:exploration, chap:probabilistes) |
|---|---|
| Si un paramètre reste petit | programmation dynamique pseudo-poly. (ch. chap:dynamique) |
| Si l'à-peu-près suffit | approximation garantie (ch. chap:gloutons) |
| Si l'on accepte un risque | algorithme probabiliste (ch. chap:probabilistes) |
| Si le cas particulier s'y prête | -sat est linéaire (ch. chap:graphes-avances) |
La dernière ligne mérite attention : np-complet qualifie le problème général. Un cas particulier peut être facile, et c'est souvent là qu'est la solution réelle.
31.5 L'indécidable
Jusqu'ici, la difficulté était une question de temps. Il existe pire.
Un programme peut prendre un autre programme en donnée. Une machine universelle est un programme qui, recevant le texte d'un programme et une entrée , simule l'exécution de sur .
Ce n'est pas une abstraction : tout interpréteur en est une, et le chargeur du système d'exploitation aussi.
arrêt : étant donné le texte d'un programme et une entrée , l'exécution de sur se termine-t-elle ?
Aucun programme ne décide arrêt pour toutes les entrées.
Démonstration
Supposons qu'existe un programme arrete : string -> string -> bool qui rende true exactement quand le programme de texte termine sur l'entrée . Construisons alors :
(* d prend le TEXTE d'un programme, et fait le contraire de ce qu'il fait. *)
let d p =
if arrete p p then boucle_infinie () (* il s'arrête -> on boucle *)
else () (* il boucle -> on s'arrête *)
Soit le texte de d, et appliquons d à .
- Si
dtermine, alorsarretea rendufalse— donc, par correction dearrete,dne termine pas. - Si
dne termine pas, alorsarretea rendutrue— doncdtermine.
Les deux cas se contredisent. arrete ne peut donc pas exister.
| Ce que le théorème dit | Ce qu'il ne dit pas |
|---|---|
| aucun programme ne répond pour toutes les entrées | qu'on ne puisse répondre sur certains programmes |
| aucune amélioration de matériel n'y changera rien | que l'analyse statique soit inutile |
| c'est une limite logique, pas technique | que les outils réels ne servent à rien |
La colonne de droite est celle qu'on oublie. Les analyseurs de programmes existent et sont utiles : ils répondent « termine », « ne termine pas », ou « je ne sais pas ». C'est cette troisième réponse qui rend la chose possible, et c'est aussi pourquoi un compilateur vous avertit sans jamais garantir l'absence de bogue.
| Un algorithme existe ? | Est-il rapide ? | |
|---|---|---|
| oui | oui, polynomial | |
| np-complet | oui (l'exhaustif) | personne n'en connaît de rapide |
| Indécidable | non, et c'est démontré | sans objet |
La deuxième ligne est une ignorance — peut-être temporaire. La troisième est un théorème : aucun progrès ne la lèvera.
31.6 Ce qu'il faut retenir
- La taille d'une instance se compte en bits. est pseudo-polynomial, donc exponentiel.
- La classe d'un problème n'est pas la complexité d'un algorithme : la première parle de tous les algorithmes, connus et inconnus.
- signifie « certificat vérifiable en temps polynomial », jamais « non polynomial ».
- veut dire est au moins aussi difficile que . sat est np-complet (Cook-Levin, admis), et sert de point de départ à toutes les autres réductions.
- Un problème np-complet n'interdit pas d'agir : exhaustif borné, pseudo-polynomial, approximation garantie, probabiliste, ou cas particulier facile.
- Le problème de l'arrêt est indécidable — non par manque de puissance, mais par contradiction logique. C'est une limite définitive, et elle laisse place aux outils qui répondent « je ne sais pas ».