J'ai réécrit cette réponse pour essayer d'adresser quelques commentaires sur une version précédente.
Je suppose que vous avez lu la définition de Wikipedia pour NP-complétude qui ne se concentre pas vraiment sur les jeux. Je vais juste clarifier un peu le sens exact de NP-complétude et de la théorie des jeux et expliquer l’essence d’un jeu NP-Complete.
Considérons une partie à 2 joueurs avec des mouvements alternatifs. Plus restrictivement, il s’agit essentiellement de jeux combinatoires . Fondamentalement, un jeu dans lequel vous avez un certain nombre de mouvements que vous pouvez effectuer et vous devez en choisir un. Vous aimeriez jouer "parfaitement", ce qui signifie que vous ne feriez jamais un "mauvais" coup. Donc, parmi les mouvements autorisés, vous souhaitez sélectionner le meilleur. (Bien sûr, votre adversaire a le même objectif ...)
Notez que le jeu parfait ne signifie pas que vous gagnerez toujours. Les règles du jeu peuvent être telles que le premier ou le deuxième joueur doit gagner. De plus, certains jeux comme Tic-Tac-Toe devraient se terminer par un match nul. Voici donc ce que "jeu parfait" signifie dans cette discussion:
(1) que vous ne serez jamais dans une position gagnante et que vous perdrez ensuite le jeu parce que vous avez fait un "mauvais" coup
(2) vous ne manquerez jamais une occasion d'obtenir dans la position gagnante si une telle opportunité se présente.
Dans l’état actuel du jeu, vous voudriez pouvoir utiliser un "algorithme efficace" pour calculer le meilleur coup. D'autre part, notons qu'un algorithme qui doit parcourir toute l'arborescence du jeu est un "algorithme inefficace".
Définissons maintenant «efficacité» un peu plus formellement. Je vais simplifier un peu mais l'essentiel est correct. Considérez le nombre de calculs, , qui doivent être effectués pour choisir le prochain mouvement, le premier moyen pour chaque mouvement ayant une possibilité (le facteur de branchement ) et le fait qu'il reste coups dans la partie. L'idée est également que chaque calcul prend le même temps pour que l'effort puisse être traduit en complexité temporelle , , au lieu de calculs bruts.B n TCBnT
- Un "algorithme efficace" aura: où est un "petit entier," et ah sont de vrais nombres. Ainsi, l'algorithme efficace s'exécute en temps polynomial puisqu'il s'agit d'une expression polynomiale.
αT∝aBa+bBα−1+cBα−2+...+hB0
α
- Un "algorithme inefficace" aura:
et cet algorithme s'exécute en temps exponentiel (c'est-à-dire en temps non polynominal). Le point ici est que lorsque devient plus grand, il en résulte une explosion combinatoire.
nT∝aBn
n
Maintenant, l’important est qu’il est impossible d’avoir un algorithme efficace, le temps polynomial, qui joue parfaitement pour un jeu NP-complet. Pour jouer à la perfection, un problème NP-complet doit, par définition, être résolu par un algorithme inefficace fonctionnant en temps non polynomial.
Notez que le temps d'exécution concerne le nombre intrinsèque de calculs, pas le temps de réponse perçu par un humain. Pour un petit jeu comme Tic-Tac-Toe, l'ordinateur peut jouer tous les mouvements futurs possibles et toujours réagir rapidement tel que perçu par un humain.
Pour Nim, il est possible de créer un algorithme polynomial. À tout moment du jeu, l'algorithme peut calculer quel joueur a un coup gagnant et ce que ce coup devrait être.
Par contre, prenons le jeu de Qubic . (Vous essayez de faire une ligne de 4 dans une grille 3D. Il s'agit donc essentiellement d'un tic-tac-toe sur une grille 4x4x4.) Qubic est NP-complet, il n'y a donc pas d'algorithme polynomial pour calculer le prochain coup parfait. La seule façon de savoir si vous avez un coup gagnant est d'essayer tous les coups possibles des deux joueurs pour vérifier qu'un coup particulier est un gagnant, ou du moins pas un perdant.
En vérité, tout l’arbre de jeu de Qubic est suffisamment petit pour qu’il puisse être encodé dans un programme informatique qui fonctionne parfaitement. Ce que l’encodage signifie, c’est que tout l’arbre de jeu a été exploré et que tous les mouvements ont été calculés à l’avance. Ainsi, le programme peut essentiellement faire un appel rapide à la base de données en utilisant l'état actuel du conseil et obtenir le meilleur coup pour cet état sans avoir à effectuer la recherche arborescente à chaque fois qu'un déplacement doit être effectué. Ceci est vraiment un "triche" pour nos besoins ici.
Parlons maintenant des échecs pour discuter de la fonction d’évaluation en ignorant certaines des autres caractéristiques des programmes de jeu d’échecs. Les échecs sont encore un jeu non résolu . On ignore si le premier ou le deuxième joueur devrait gagner. Il n’est pas possible d’obtenir une position au sein du conseil et de prédire avec certitude qui va gagner. En fait, les échecs ont un tel arbre de jeu qu'il est impossible de parcourir tout cet arbre. Vous auriez besoin d'ordinateurs qui ne sont pas seulement 10 ou 100 fois plus rapides, mais des milliards de milliards de fois plus rapides que n'importe quel ordinateur actuel. (Il existe un espoir que l'informatique quantique puisse couper à travers ce nœud gordien.)
Pensez à la fonction d’évaluation des échecs comme donnant à chaque coup possible une probabilité d’être le meilleur coup. Ce que fait un programme d’échecs, c’est combiner regarder au-delà avec la fonction d’évaluation. Ainsi, le programme examine tous les mouvements possibles à venir jusqu'à atteindre un point où un "bon" score peut être attribué à la position du conseil. L’ordinateur évalue ainsi tous les chemins possibles dans l’arbre, puis choisit le chemin avec le meilleur score. Comme la recherche n’a jamais abouti à la fin du jeu pour tous les chemins en cours d’évaluation, tous les programmes d’échecs utilisent finalement une fonction d’évaluation imparfaite. (Si vous approchez de la fin du jeu, l'ordinateur pourra peut-être examiner tous les mouvements possibles.) Cela signifie qu'il sera peut-être possible de battre le programme même si le programme avait une position gagnante à un moment donné.