le 10-02-2014 05:45 AM
le 10-02-2014 05:57 AM
@MathieuSteiner
Bientôt, une version avec des variants partout ?
Je viens seulement de "voir". (serait-ce un complot organisé ? ... on essaye de me pousser au burn-out ?)
Une version exclusivement avec des Variants ...
Le "sujet" est "chaud" ... donc .... Joker !
le 10-02-2014 06:50 AM
Plutôt qu’une version avec variant, une version en OOP avec class aurait plus … de classe !
Mais l’homme n’est jamais satisfait. Après ta refonte du jeu d’échec, j’ai écrit « jouer contre l’ordinateur », avec la version contre l’ordinateur « en OOP », après le OOP, en Actor Framework…. Quelques défis pour le reste de la journée…
au travail
Luc Desruelle | Mon profil | Mon blog LabVIEW | Auteur livre LabVIEW : Programmation et applications - G Web
Certified LabVIEW Architect (CLA) & Certified TestStand Developper (CTD) | LabVIEW Champion
MESULOG - LinkedIn site | NERYS - NERYS Group
| directeur CEO MESULOG
| CODIR - NERYS group
le 10-02-2014 08:56 AM
Je doute qu'une approche OOP soit compatible avec la contrainte "de temps".
Actor Framework ... encore moins.
Peut-être quand nous aurons des PCs à processeurs neuronaux ?
(je n'en suis pas certains ... mais intuitivement je pense cela)
ceci dit ...
on changerait "la façon de" et non le "fond" ... j'entends pas là, les algorithmes par eux-mêmes.
et perso, mon "truc", ce sont les algorithmes (d'où ma difficulté quand on parle IHM)
le 10-02-2014 10:46 AM
le 10-03-2014 02:40 AM
hello,
Merci pout ta réponse sur les roques, et désolé de t'avoir fait froler l'attaque cardiaque de bon matin.
pas eu le temps hier, mais je viens de tester ce matin.
Evidement, ça fonctionne impec.
J'avais juste omis un régle en tentant de roquer la premiére fois => les cases par lesquelles transite le roi lors du roque ne doivent pas être contrôlées par une pièce adverse.
la honte, désolé !
10-03-2014 04:19 AM - modifié 10-03-2014 04:27 AM
désolé de t'avoir fait froler l'attaque cardiaque de bon matin
oui ...
les 3 cases utilisées par le Roi (départ + passage + arrivée) ne doivent pas être ciblées par une pièce adverse.
et aussi ... La Tour et le Roi concerné ne doivent pas avoir bougé "avant".
petite parlotte :
si tu bouges (par exemple) la Tour, et que tu reviens ensuite, avec cette même Tour, à sa position initiale ... tu ne peux plus roquer.
En fait, j'utilise un U16 pour coder les pièces. Pour coder la pièce en elle-même je n'utilise que les 4 premiers bits (de 0 à 15 en décimal).
Le bit n°0 pour la couleur (0=blanc - 1=noir), et les bits n° 1,2 et 3 pour la pièce.
Ce qui donne pour les Blancs : 2 pion, 4 cavalier, 6 fou, 8 tour, 10 dame, 12 roi.
et pour les Noirs : 3 pion, 5 cavalier, 7 fou, 9 tour, 11 dame, 13 roi.
Les autres bits sont disponibles. Dès qu'une pièce bouge, elle reçoit le flag "à bougé".
Et dans le code qui détermine les mouvements possibles du Roi ... je regarde si ce flag est présent ou non.
Il y a d'autres flags ... j'ai également les flags "à roqué" et "s'est engagé".
Le flag "s'est engagé" me permet de "pousser" (de favoriser) les pièces qui n'ont pas encore bougé ... à bouger et donc à s'engager.
La pièce qui est la plus difficile à "mettre en mouvement" est la Tour.
Pour mettre en mouvement une Tour, il faut que cette Tour puisse "voir" qu'elle peut apporter un avantage.
Pour ce faire, il faut qu"une "ligne" s'ouvre devant elle ... et ça ... c'est difficile à cause des pions.
difficile ???
oui ... car pour ouvrir "l'horizon" à une Tour, il faut donc, soit a) bouger le pion, soit b) contourner le pion.
Bouger un pion, ou contourner un pion, n'est pas dans l'absolu une chose difficile ... cela demande simplement "un certain nombres de coups".
Et c'est là que le soucis arrive ... il faut "des coups" ... et des coups, c'est aussi et surtout de la "profondeur d'analyse".
Engager un Fou, ou une Dame .... est très très facile. Il suffit de bouger un seul pion d'une seule case ... et on ouvre une diagonale
Pour engager une Tour depuis sa position de départ, il faut un minimum de 3 coups.
Avec "3 coups" (pour une Tour) ... on est encore nul part.
nul part ? oui, car cela veut dire que la Tour est arrivée en "position de s'engager" ... mais n'a pas encore "vu" l'utilité de le faire.
A ce moment, pour elle, va commencer l'analyse en profondeur. Elle est en situation de "faire quelque chose" ... mais faire quoi ?
Il lui faudra donc au minimum 1 coup de plus pour apporter la moindre contribution à la situation (par exemple ... prendre directement un pièce adverse)
Conclusion:
Depuis sa position de départ, il faut au minimum 4 coups (dans le meilleur des cas) pour engager dans la bataille (de façon active) une Tour.
Et 4 coups_noirs ... c'est une profondeur d'analyse de (4x2)-1=8-1= 7 .... et le moteur s-e base sur une profondeur "de base" de 4 !!
Voila pourquoi les Tours ont si difficile à s'engager et restent "sans bouger" ... longtemps.
Si je pouvais débuter le jeu avec une profondeur de 7 ou 8, le comportement des Tours serait complètement transformé.
(et le niveau du jeu exploserait)
10-03-2014 04:33 AM - modifié 10-03-2014 04:35 AM
Super, merci pour les explications sur la methode de codage des piéces, ainsi que pour les considerations sur le besoin de profondeur vs le type de piéce. C'est trés interressant.
10-03-2014 05:49 AM - modifié 10-03-2014 06:10 AM
ah ouiiii ...
aucune stratégie n'est codée en dur dans le code.
Si tu cherches dans le code la trace d'un "comportement" ... tu vas tourner en rond.
Le moteur "anticipe" les coups possibles ... et choisi celui qui lui donne "le plus de chance" de prendre l'avantage par la suite.
Dis toi bien que le moindre coup joué par l'IA est souvent le résultat de l'analyse de .... disons ... entre 20.000 et 5.000.000 ... de "situations".
Ce, sur base d'un système d'évaluation.
évaluation ? pourquoi doit-on évaluer ?
Si le moteur pouvait "envisager" la totalité des coups possibles
(au total environ 10E+120 ... plus de 300 milliards pour l'enchainement des 4 premiers coups d'une partie)
Il n'aurait pas besoin "d'évaluer" ... la partie serait alors gagnée ou perdue dès le premier coup.
Ce type de résolution jusqu'à la finalité est possible pour des jeux simples ... le morpion par exemple ... mais pas pour les échecs.
Le nombre de coups possibles dans une partie d'échecs est de loin supérieur au nombre d'atomes dans l'Univers.
Donc ... il "regarde" jusqu'à une certaine "profondeur" (enchainements alternés des coups)
Et à un certain moment, il stoppe (la profondeur d'analyse) ... et là ... il évalue ... cette voie est-elle bonne pour moi ?
Cette évalutaion est très délicate et détermine à 90% (99%?) la qualité du moteur.
et c'est là ... au niveau de cette fonction d'évaluation ... qu'il y a (très certainement) moyen de faire "beaucoup mieux".
L'algo récursif en lui-même n'est qu'une structure, un support.
Il est juste là pour déterminer "les coups possibles" ... ceci dit, il faut qu'il fonctionne parfaitement, il ne faut pas qu'il "oublie" un coup.
Mais sinon ... le coeur ... je vais presque dire "l'âme" du moteur .... c'est la fonction d'évaluation.
a+
EDIT :
"plus de 300 milliards pour l'enchainement des 4 premiers coups d'une partie)"
Non ... ça, c'est faux. Voici les vrais chiffres. Perft results
On tourne autour de 85E+9 pour les 4 premiers échanges (8 demi-coups) ... c'est déjà pas mal
Résoudre l'ensemble de ces "Perft results" est le b-a-ba pour un moteur d'échecs.
Il doit "passer" ce premier test, c'est indispensable. Le moteur que je propose solutionne sans aucune erreur tous les tests de "Perft".
10-03-2014 10:23 AM - modifié 10-03-2014 10:31 AM
Pour ceux que cela intéresse :
mise en évidence des résultats PERFT
1) placer le vi ci-joint (PERFT.vi) dans le répertoire principale, soit : ...\ Chess_Ouadji_Game (au même niveau que "Chess_Ouadji.vi" )
2) petite modif dans Dark_IA \ ChessCore.vi ... comme ceci .... déconnecter un fil et placer une constante "false"
ceci pour désactiver l'élagage alpha-beta ... et donc obtenir toutes les combinaisons.
comme ceci :
Lancer PERFT.vi , depth = 4
RUN .... attendre quelque secondes .... Résultat " 197.281 "
Le moteur vient de comptabiliser tous les enchainements de coups possibles
(essayez avec "depth 5" ... vous aurez un résultat de 4.865.609)
C'est juste un tout petit exemple, pour une position de l'échiquier "de départ", et pour une pronfondeur de 4.
On peut faire un test Perft au départ d'une position quelconque (il y a beaucoup de "situations" sur le net, avec le résultat que l'on doit obtenir)
on peut mesurer "toutes les combinaisons" (comme ici, dans l'exemple proposé)
ou ... cibler ... le nombre de "captures", le nombre de "prise en passant" ... de roques, d'échecs ... etc ...
(je peux faire des mesures ciblées aussi avec mon moteur, tout est possible)
Ici, je vous ai juste demandé de déconnecter " l'élagage " ... c'est le minimum indispensable.
mais on peut aussi deconnecter tout le système " d'évaluation " ... totalement inutile pour une " analyse Perft ".
Dans ce cas les tests " perft " sont 30x fois plus rapide.
Mais là ... pour déconnecter toute " l'évaluation " ... impossible d'expliquer ça avec une image et 4 mots.
voila, c'était juste pour ne pas "parler de certaines choses" .... et laisser tout le monde dans le "vague", sans rien "concrétiser".