0

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?

+0

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. –

+0

@ 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

+0

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? –

Répondre

1

Si vous souhaitez sélectionner le chemin le plus court vers un gain, vous devez également sélectionner le chemin le plus long vers une perte. Si vous deviez tenir compte de cela dans la fonction d'évaluation, vous auriez à la longueur du chemin avec le score et avoir des fonctions d'évaluation séparées pour min et max. C'est beaucoup de frais généraux complexes et confus.

La manière standard de résoudre ce problème est une approche d'approfondissement itératif de l'évaluation. D'abord, vous effectuez une recherche assez profonde pour 1 coup pour tous les joueurs, puis vous recommencez toute la recherche en recherchant 2 coups pour chaque joueur, etc. jusqu'à ce que vous manquiez de temps. Si vous trouvez une victoire en 2 coups, vous arrêtez de chercher et vous ne rencontrerez jamais la situation des 7 coups. Cela résout également votre problème de recherche de profondeurs étranges et d'obtenir des évaluations étranges. Il a beaucoup d'autres avantages, comme avoir toujours un mouvement prêt à partir quand vous manquez de temps, et quelques améliorations algorithmiques importantes parce que vous n'aurez pas besoin de la surcharge du suivi des états visités. En ce qui concerne le jeu défensif, c'est un peu l'effet de l'horizon et un peu de la fonction d'évaluation. Si vous avez une fonction d'évaluation parfaite, l'algorithme n'a besoin que d'un mouvement profond. Si ce n'est pas parfait (et ce n'est pas le cas), vous devrez approfondir votre recherche. Dernière fois que j'ai vérifié, les algorithmes qui peuvent fonctionner sur votre ordinateur portable et voir environ 8 plys de profondeur (une pli est de 1 mouvement pour chaque joueur) peuvent rivaliser avec des humains forts.

0

Afin de laisser le programme choisir le plus court checkmate, l'approche standard est de donner une valeur plus élevée aux compagnons qui se produisent plus près de la racine. Bien sûr, vous devez détecter les cocheurs et leur donner un score.

De plus, d'après ce que vous décrivez, vous avez besoin d'une recherche de quiescence.

Tout cela (et beaucoup plus) est expliqué dans le wiki de programmation d'échecs. Vous devez le vérifier: https://chessprogramming.wikispaces.com/Checkmate#MateScore https://chessprogramming.wikispaces.com/Quiescence+Search