Récemment, j'ai vécu l' expérience douloureuse et amusante d'expliquer de manière informelle le concept de complexité informatique à un jeune programmeur autodidacte talentueux, qui n'avait jamais suivi de cours formel en algorithmes ou en complexité auparavant. Sans surprise, beaucoup de notions semblaient étranges au début mais avaient du sens avec certains exemples (PTIME, intractabilité, non calculabilité) , tandis que d'autres semblent venir plus naturellement (classification des problèmes via les réductions, temps et espace comme ressources, analyse asymptotique) . Tout allait bien jusqu'à ce que j'admette accidentellement que SATpeut être résolu efficacement * dans la pratique ... Et juste comme ça, je les ai perdus. Peu importait la façon convaincante dont j'essayais de plaider pour la théorie, le gamin était convaincu que ce n'était que des conneries artificielles dont il ne devrait pas se soucier. Bien...
¯ \ _ (ツ) _ / ¯
Non, je n'avais pas le cœur brisé, et je ne me souciais pas vraiment de ce qu'il pensait, ce n'est pas le but de cette question. Notre conversation m'a fait penser à une question différente,
Que sais-je vraiment des problèmes qui sont théoriquement insolubles (complexité temporelle superpolynomiale) mais pratiquement résolubles (via des heuristiques, des approximations, des solveurs SAT, etc.)?
J'ai réalisé, pas grand-chose. Je sais qu'il existe des solveurs SAT très efficaces qui résolvent efficacement d'énormes instances, que Simplex fonctionne très bien dans la pratique et peut-être quelques problèmes ou algorithmes supplémentaires. Pouvez-vous m'aider à brosser un tableau plus complet? Quels sont les problèmes connus ou même les classes de problèmes dans cette catégorie?
TL; DR: Quels sont les problèmes qui peuvent être résolus de manière contre-intuitive dans la pratique? Existe-t-il une ressource (mise à jour) pour en savoir plus? Avons-nous une caractérisation pour eux? Et, enfin, en tant que question de discussion générale, ne devrions-nous pas?
EDIT # 1: En essayant de répondre à ma dernière question de discussion sur une telle caractérisation , j'ai été initié à l' analyse lissée des algorithmes, un concept introduit par Daniel Spielman et Shang-Hua Teng dans [1] qui interpole en continu entre le pire des cas et analyses de cas moyen d'algorithmes. Ce n'est pas exactement la caractérisation discutée ci-dessus, mais elle capture le même concept, et je l'ai trouvé intéressant.
[1] Spielman, Daniel A. et Shang-Hua Teng. "Analyse lissée des algorithmes: pourquoi l'algorithme simplex prend généralement du temps polynomial." Journal de l'ACM (JACM) 51, no. 3 (2004): 385-463.