Théorie de la complexité Un article de Wikipédia, l'encyclopédie libre. La théorie de la complexité s'intéresse à l'étude formelle de la difficulté des problèmes en informatique. Elle se distingue de la théorie de la calculabilité qui s'attache à savoir si un problème peut ou pas être résolu par un ordinateur. La théorie de la complexité se concentre donc sur les problèmes qui peuvent effectivement être résolus, la question étant de savoir s'ils peuvent être résolus efficacement ou pas en se basant sur une estimation (théorique) des temps de calcul et des besoins en mémoire informatique. Sommaire [masquer] 1 Généralités 2 Problème NP-Complet 3 Polynomial contre non polynomial 4 Modèles de calcul 5 Liens 6 Références Généralités En théorie de la complexité, un problème est formalisé de la manière suivante : un ensemble de données (ou instance) en entrée, et une question sur ces données (pouvant demander éventuellement un calcul). La théorie de la complexité ne traite que des problèmes de décision binaire, c'est-à-dire posant une question dont la réponse soit oui ou non. Cependant on étend la notion de complexité aux problèmes d'optimisation. En effet il est facile de transformer un problème d'optimisation en problème de décision. Si par exemple on cherche à optimiser une valeur n on traite le problème de décision qui consiste à comparer n à un certain k. En traitant plusieurs valeurs de k on peut déterminer une valeur optimale. On confondra souvent un problème d'optimisation et son problème de décision associé. La théorie de la complexité repose sur la définition de classes de complexité qui permettent de classer les problèmes en fonction de la complexité des algorithmes qui existent pour les résoudre. Parmi les classes les plus courantes, on distingue: Classe L : un problème de décision qui peut être résolu par un algorithme déterministe en espace logarithmique par rapport à la taille de l'instance est dans L. Classe NL : cette classe correspond à la précédente mais pour un algorithme non-déterministe. Classe P : un problème de décision est dans P s'il peut être décidé par un algorithme déterministe en un temps polynomial par rapport à la taille de l'instance. On qualifie alors le problème de polynomial. Classe NP : c'est la classe des problèmes de décision pour lesquels la réponse oui peut être décidée par un algorithme non-déterministe en un temps polynomial par rapport à la taille de l'instance. Classe Co-NP : nom parfois donné pour l'équivalent de la classe NP avec la réponse non. Classe PSPACE : les problèmes décidables par un algorithme déterministe en espace polynomial par rapport à la taille de son instance. Classe NSPACE ou NPSPACE : les problèmes décidables par un algorithme non-déterministe en espace polynomial par rapport à la taille de son instance. Classe EXPTIME : les problèmes décidables par un algorithme déterministe en temps exponentiel par rapport à la taille de son instance. On a les inclusions: P ? NP et Co-NP ? PSPACE = NPSPACE. Problème NP-Complet Soit C une classe de complexité (comme P, NP, etc.). On dit qu'un problème est C-complet si il est dans C il est C-dur (ou C-difficile) Un problème est C-dur (ou C-difficile) si ce problème est plus dur que tous problèmes dans C. Formellement on définit une notion de réduction : soient p et q deux problèmes, p se réduit à q si p est une instance de q. Et donc p est C-dur (ou C-difficile) si pour tout problème q de C, q se réduit à p. Les problèmes complets les plus étudiés sont les problèmes NP-complets. Ceci parce que beaucoup de problèmes intéressants sont NP-complets et que l'on ne sait pas résoudre un problème NP-complet efficacement à cause du non déterminisme. La classe de complexité étant par définition réservée à des problèmes de décisions, on parlera de problème NPdifficile pour les problèmes d'optimisation sachant que pour ces problèmes d'optimisation on peut construire facilement un problème qui lui est associé et est dans NP et qui est donc NPcomplet. De manière intuitive, dire qu'un problème peut être décidé à l'aide d'un algorithme nondéterministe polynomial signifie qu'il est facile, pour une solution donnée, de vérifier en un temps polynomial si celle-ci répond au problème pour une instance donnée (à l'aide d'un Certificat); mais que le nombre de solutions à tester pour résoudre le problème est exponentiel par rapport à la taille de l'instance. Le non-déterminisme permet de masquer la taille exponentielle des solutions à tester tout en permettant à l'algorithme de rester polynomial. Problème NP-Complets célèbres Problème SAT et variante 3SAT (mais 2SAT est polynomial) ; notons qu'il existe des logiciels (dits SAT solvers) spécialisés dans la résolution performante de problèmes SAT ; Problème du voyageur de commerce Problème du cycle hamiltonien Problème de la clique maximum Problèmes de colorations de graphes Problème d'ensemble dominant dans un graphe Problème de couverture de sommets dans un graphe Bien que moins étudiés, les problèmes complets pour les autres classes ne sont pas moins intéressants Le problème Reach (ou Accessibilité) qui consiste à savoir s’il existe un chemin entre deux sommets d'un graphe est NL-complet Le problème Circuit Value (et monotone Circuit Value : le même mais sans négation) sont des problèmes Pcomplets Le problème QBF (SAT avec des quantificateurs) est PSPACE-complet Remarque : tous les problèmes de la classe L sont L-complets vu que la notion de réduction est trop vague. En effet la fonction qui doit transformer un instance d'un problème à l'autre doit se calculer en espace logarithmique. Polynomial contre non polynomial On a trivialement car un algorithme déterministe est un algorithme non déterministe particulier. En revanche la réciproque : , que l'on résume généralement à P = NP du fait de la trivialité de l'autre inclusion, est l'un des problèmes ouverts les plus fondamentaux et intéressants en informatique théorique. Cette question a été posée en 1970 pour la première fois et celui qui arrivera à prouver que P et NP sont différents ou égaux recevra le prix Clay (plus de 1.000.000 $) Le problème de fond est que les algorithmes que l'on programme sont tous déterministes. Et ceci pour la bonne et simple raison que l'on ne sait pas construire de machine non déterministe. Ce qui fait que l'on ne peut que simuler un algorithme non déterministe par un algorithme déterministe. Or il est démontré qu'un algorithme déterministe qui simule un algorithme non-déterministe qui fonctionne en temps polynomial, fonctionne en temps exponentiel. Ce qui fait que pour de grandes entrées on ne peut pas résoudre le problème en pratique, quelle que soit la puissance de la machine. De plus cela apporte une confusion dans le nom NP car on l'associe souvent à Non Polynomial alors que c'est bien Non déterministe Polynomial. Le problème P = NP revient à savoir si on peut faire cette simulation en restant polynomial. En effet, s'il s'avérait que P = NP, alors on pourrait résoudre tous les problèmes NP en un temps polynomial sur une machine déterministe; or les problèmes NP-Complets sont très fréquents et pour aucun d'eux on n'a réussi à trouver un algorithme polynomial le résolvant. Ce qui fait qu'on conjecture cependant que les problèmes NP-complets ne sont pas solubles en un temps polynomial. À partir de là plusieurs approches sont tentées : des algorithmes d'approximation permettent de trouver des solutions approchées de l'optimum en un temps raisonnable pour un certain nombre de programmes. Dans le cas d'un problème d'optimisation on trouve généralement une réponse correcte sauf que l'on en sait pas si c'est la meilleure solution. des algorithmes stochastiques : en utilisant des nombres aléatoires on peut «forcer» l'algorithme à ne pas utiliser les cas les moins favorables. C'est ainsi que récemment un algorithme de test de primalité qui fonctionne en temps polynomial a été découvert. des heuristiques permettent d'obtenir des solutions généralement bonnes mais non exacte en un temps de calcul modéré; des algorithmes par séparation et évaluation permettent de trouver la ou les solutions exactes. Le temps de calcul n'est bien sûr pas borné polynomialement mais, pour certaines classes de problèmes, il peut rester modéré pour des instances relativement grandes. on peut restreindre la classe des problèmes d'entrée à une sous-classe suffisante, mais plus facile à résoudre. Si ces approches échouent, le problème est non soluble en pratique dans l'état actuel des connaissances. Pour le cas de L et NL on ne sait pas non plus si L = NL mais cette question est moins primordiale car . Ce qui fait que les problèmes qui sont dans L et dans NL sont solubles efficacement. Inversement on sait que PSPACE = NPSPACE, mais par contre Donc avant de résoudre NP = PSPACE il faut résoudre P = NP. . Pour résumer on a , et de plus on sait que NL est strictement inclus dans PSPACE et donc il y en a au moins deux entre NL et PSPACE qui ne sont pas égaux. Modèles de calcul Ces théorèmes ont été établis grâce au modèle des machines de Turing. Mais d'autres modèles sont utilisés en complexité dont : les fonctions récursives dues à Kleene les automates celullaires les automates à pile les machines à registres les lambda-calculs On sait que tous ces modèles sont équivalents. De plus grâce aux machines universelles de Turing on sait que tout ce qui est calculable est modélisable dans ces systèmes. Les conséquences sont importantes et nombreuses. La première fait que je suis derrière mon clavier en ce moment : on peut construire des ordinateurs. Ceci fait un lien avec la théorie de la calculabilité.