Je programme une IA d'échecs en utilisant un algorithme d'élagage alpha-bêta fonctionnant à une profondeur fixe. J'ai été assez surpris de voir que, en réglant l'IA sur une plus grande profondeur, ça a joué encore moins bien. Mais je pense que je l'ai compris pourquoi.Comment comptabiliser l'ordre de déplacement dans l'évaluation de l'échiquier
Cela fonctionne actuellement de cette façon: Toutes les positions sont listées, et pour chacune d'elles, toutes les autres positions de ce coup sont listées et ainsi de suite ... Jusqu'à la profondeur fixée: le tableau est évalué en vérifiant sont présents et en définissant une valeur pour chaque type de pièce. Ensuite, la valeur augmente jusqu'à la racine en utilisant l'algorithme minimax avec alpha-beta. Mais je dois rendre compte de l'ordre de déménagement. Par exemple, il y a deux options, un checkmate dans 2 mouvements, et un autre dans 7 moves, alors le premier doit être choisi. La même chose va prendre une reine dans si 3 ou 6 coups. Mais comme je n'évalue le tableau qu'au niveau des nœuds les plus profonds et que je ne vérifie que le résultat de l'évaluation, il ne sait pas quels étaient les mouvements précédents.
Je suis sûr qu'il existe une meilleure façon d'évaluer le jeu qui peut expliquer la façon dont les pièces se sont déplacées pendant la recherche.
EDIT: J'ai compris pourquoi il jouait bizarrement. Quand je cherchais des mouvements (profondeur 5), cela se terminait par un mouvement AI (un niveau de nœud MAX). Ce faisant, il comptait des mouvements tels que prendre un chevalier avec une tour, même si cela rendait ce dernier vulnérable (l'algorithme ne peut pas le voir parce qu'il ne cherche pas plus profond que cela). J'ai donc changé cela et j'ai mis la profondeur à 6, donc ça se termine avec un niveau de nœud MIN. Ses mouvements ont maintenant plus de sens car ils se vengent quand ils sont attaqués (ce qu'ils n'ont parfois pas fait et ont plutôt joué un coup stupide). Cependant, il est maintenant plus défensif que jamais et ne joue pas: il déplace son chevalier, puis le ramène à l'endroit où il était auparavant, et par conséquent, il finit par perdre. Mon évaluation est très standard, seule la présence de pièces est importante pour la valeur du noeud, donc elle est libre de choisir la stratégie qu'elle veut sans la forcer à faire des choses dont elle n'a pas besoin. Conserver cela, est-ce un comportement normal pour mon algorithme? Est-ce un signe que mon algorithme alpha-beta est mal implémenté ou est-il parfaitement normal avec une telle fonction d'évaluation?
Alpha-bêta a besoin d'informations sur les lignes précédemment évaluées. Pas les mouvements eux-mêmes, mais les valeurs _alpha_ et _beta_. En anglais, cela signifie grosso modo: «Je peux déjà forcer un score de _alpha_ en utilisant une ligne précédente, donc si mon adversaire a une défense menant à un score inférieur à _alpha_, je peux arrêter d'évaluer tous les mouvements restants dans cette position. Par conséquent, une fois que vous avez découvert un partenaire dans 2, vous le propagez pour le reste de l'analyse et l'utilisez pour tailler le partenaire dans 7. –
@ C.Frâncu Okay Je suis d'accord que c'est ce que l'algorithme devrait faire. Mais si je n'évalue que ma planche à la profondeur la plus élevée (et vérifie donc le mate à cette profondeur), elle ne peut pas trouver de partenaire en 2, car elle ne voit que le résultat de 8 coups (si la profondeur est définie à 8). Et c'est un problème car l'algorithme ne fait que retarder le compagnon (puisque après chaque mouvement il peut aller plus loin dans la recherche). – Gradapin
Cela dépend de votre implémentation. Idéalement, en profondeur 2, vous devez réaliser que, puisqu'il n'y a pas de mouvements légaux, le jeu doit se terminer d'une façon ou d'une autre (que ce soit le partenaire ou l'impasse). Que fait votre algorithme lorsque la génération de mouvement ne renvoie aucun mouvement? –