Le problème du voyageur de commerce est dit être pratiquement "insoluble" lorsque le nombre de nœuds augmente.
Quels autres problèmes de programmation sont considérés comme insolubles ?
Le problème du voyageur de commerce est dit être pratiquement "insoluble" lorsque le nombre de nœuds augmente.
Quels autres problèmes de programmation sont considérés comme insolubles ?
Si vous cherchez des problèmes similaires au problème du voyageur de commerce, je vous suggère de chercher sur Google les problèmes NP-complets. Il s'agit d'une classe de problèmes qui n'ont pas de solution efficace connue, c'est-à-dire un algorithme qui calcule le résultat en temps polynomial. Ce qui est intriguant avec la classe des problèmes NP, c'est que personne n'a été capable de montrer qu'un algorithme pour les résoudre. doit prennent un temps exponentiel. C'est peut-être la plus grande question non résolue en informatique.
Il convient toutefois de préciser qu'il est souvent assez facile de trouver a solution à un problème NP, l'affaire délicate est de trouver la optimal solution.
Voici une liste d'autres problèmes NP-complets :
Je pourrais continuer, mais je pense que la plupart des autres problèmes que je connais sont plutôt théoriques. Vous feriez mieux de chercher sur Google par vous-même.
Comme de nombreuses personnes l'ont déjà répondu, l'ur-problème qui est impossible à résoudre est le problème de halting : écrire un programme H
qui prend un programme P
comme entrée et répond si le programme d'entrée P
va tourner en boucle ou pas. Notez que notre programme H
peut répondre correctement pour de nombreux programmes d'entrée, le défi est d'écrire un programme qui peut répondre à cette question pour todo programmes.
Pourquoi le problème du halting est-il insoluble ? La preuve est assez simple et plutôt amusante : Supposons que l'on puisse écrire le programme H
ce qui résout le problème de la halte. (Le but est de montrer qu'en supposant cela, nous allons produire des résultats qui n'ont aucun sens, donc que notre hypothèse est erronée). Maintenant, construisez un programme EVIL
qui utilise H
comme une sous-routine. Nous pouvons écrire EVIL
así:
EVIL p = if H p then loop
else false
Une brève explication s'impose. EVIL
prend un programme et si ce programme s'arrête, alors EVIL
boucles. Si le programme d'entrée boucle indéfiniment, alors EVIL
retourne faux.
L'étape suivante est vraiment cool : appliquer EVIL
à lui-même ! La question est de savoir quelle sera la réponse de EVIL EVIL
être ? Cela dépend clairement du fait que EVIL
est en train de boucler pour toujours ou pas. Considérons les deux alternatives :
Supposons que EVIL
des boucles pour toujours. Mais quand on lui donne un programme en entrée, il doit retourner false
depuis H
a détecté que ça tournerait en boucle pour toujours. Mais en retournant false
contredit ce que nous avons d'abord dit que EVIL
des boucles pour toujours, donc cela ne peut clairement pas être le cas.
Ok, alors qu'est-ce que EVIL
ne fait pas de boucle. Eh bien, quand on alimente EVIL
à lui-même, il tournera en boucle parce que H
a retourné true
. Nous avons donc une contradiction ici aussi.
Bummer ! Les deux alternatives ( EVIL
boucles ou pas) conduit à des contradictions. Nos hypothèses doivent donc être erronées. Il n'existe pas de programme tel que H
qui peut décider si une fonction s'arrête ou non.
Il existe de nombreux problèmes intéressants qui ne sont pas calculables et qui découlent du problème de la halte. Certains de mes préférés proviennent de la technologie des compilateurs. Par exemple : trouver le plus petit programme équivalent.
Un autre exemple est le suivant : étant donné que vous avez annoté votre programme avec des assertions, écrivez un programme qui vérifie si l'une des assertions sera violée au moment de l'exécution. Un tel programme est parfois appelé un vérificateur de modèle, et ils peuvent être vraiment utiles mais ils ne peuvent jamais être complets, c'est-à-dire qu'ils doivent parfois répondre "je ne sais pas" quand le problème devient trop difficile.
Je trouve le problème de sac à dos particulièrement intéressant car il s'applique à de nombreux domaines différents.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.