|
Comment
les ordinateurs
jouent-ils
aux échecs ?
Depuis
quasiment l'aube de l'informatique, au début des années 50, les
programmeurs ont essayé de faire jouer les ordinateurs au échecs.
Cependant, l'enthousiasme initial a rapidement laissé place à
la perplexité puis à la déception : faire battre le champion du
monde d'échecs en titre par un ordinateur n'est pas une chose
aussi simple qu'il y paraissait à première vue.
Dans cet article, après avoir fait un petit historique des programmes
d'échecs, nous allons expliquer les principales techniques utilisées
par les ordinateurs pour jouer aux échecs ainsi que leurs diverses
variantes. Nous examinerons ensuite plus en détails les techniques
d'optimisations utilisées par les programmes performants pour
obtenir un meilleur niveau de jeu.
Historique des programmes d'échecs
En
1950, Alan Turing (un des pères de l'informatique) a écrit le
premier programme d'échecs. Turing avait à l'époque dû se contenter
de simuler l'exécution de son programme sur papier. Son programme
jouait extrêmement mal, mais il avait l'avantage de marcher. La
même année, Claude Shannon (un autre des pionniers de l'informatique
a qui l'on doit notamment la théorie du codage de l'information)
énonça 2 stratégies permettant aux ordinateurs de jouer aux échecs,
cependant étant donné les médiocres (et le mot est faible) performances
des ordinateurs de cette époque, il était alors impossible de
savoir si un ordinateur serait un jour capable de battre un joueur
humain ayant un niveau correct.
Il
fallu attendre 1958 pour voir un ordinateur battre un joueur humain
pour la première fois. Ce délai de huit ans étant largement dû
au fait qu'étant donné les fortunes colossales que coûtaient les
ordinateurs à cette époque, ceux-ci étaient en général réservés
à des tâches plus productives que de les faire jouer aux échecs.
La première personne a avoir été battue par un ordinateur était
la secrétaire de l'équipe des programmeurs qui n'avait jamais
joué aux échecs auparavant en dehors d'une heure d'apprentissage
dispensée par ses collègues. Cette première victoire, loin d'être
spectaculaire, permis néanmoins de prouver qu'un programme pouvait
accumuler suffisamment d'"intelligence", égale à environ
une heure d'apprentissage, pour battre un joueur humain.
Après
cet événement, certains programmeurs prédirent que d'ici la fin
des années 60, un ordinateur serait capable de battre aux échecs
le champion du monde en titre. Or, à la fin des années soixante,
le champion du monde en titre était Boris Spassky, et celui-ci
n'avait que très peu de risque de se faire battre par un ordinateur
étant donné que ceux-ci jouaient alors avec un niveau similaire
à celui d'un adolescent moyennement entraîné.
La même prédiction a néanmoins été renouvelée pour les années
70. Ce que n'empêcha pas qu'en 1978 le meilleur programme d'échecs
du moment (qui portait le nom peu original de "CHESS 4.7")
a été battu par David Levy (Maître International d'échecs).
Loin d'avec été refroidis par cette nouvelle défaite, les "experts"
en programmes d'échecs de l'époque ont naturellement réitéré la
prédiction qu'un ordinateur serait capable de battre le champion
du monde en titre durant la décennie suivante. Ce qui prouve bien
que tout ce que l'on apprend de l'Histoire, c'est que l'on apprend
rien de l'Histoire ;-)
Sans surprise, dix ans plus tard, en 1988, le champion du monde
d'échecs était toujours humain. L'année suivante, IBM a mis au
point l'ordinateur Deep Thought qui battit assez aisément D. Levy.
Puis, en 1990, une partie fut organisée entre Deep Thought et
le champion du monde en titre de l'époque (Garry Kasparov) au
cours de laquelle le Russe infligea une défaite cuisante à l'ordinateur.
Sans se décourager IBM mis au point Deep Blue (évolution de Deep
Thought) en 1996 et le reconfronta contre Kasparov. Cette fois,
bien qu'ayant encore perdu, la défaite de la machine fut beaucoup
plus "honorable". Malgré les quelques années qui nous
séparent de 1996, les performances de cette première version de
Deep Blue ne seront pas égalés sur des ordinateurs à porté du
grand public avant encore quelques années. Deep Blue fonctionne
sur un super-calculateur de type SP/2 avec l'aide de processeurs
spécialement étudiés pour l'évaluation des positions. Chacun d'entre
eux contient 48 Mo de mémoire et peut analyser 3 millions de coups
par seconde.
Dernier épisode en date : en 1997, IBM est revenu à la charge
avec Deeper Blue et cette fois (enfin!) le match s'est soldé par
la victoire de la machine. Les experts relativisent ce succès
dans la mesure où le programme utilisé par Deep Blue n'est pas
un programme d'échecs "générique", mais a été spécialement
optimisé pour être opposé au style de jeu de Kasparov (que les
programmeurs d'IBM ont eu tout le temps d'analyser au cours des
années), d'autre part Kasparov n'était visiblement pas au meilleur
de sa forme durant le match dans la mesure ou il a commit une
grossière erreur au 7ème coup de la dernière partie, ce qui a
entraîné sa défaite.
Première approche du problème
Faire
un programme qui joue aux échecs est quasi-trivial : il suffit
de générer la liste des coups possible à partir de la position
actuelle et de choisir un de ces coups au hasard. Bien évidement
cette technique a été testée et les programmes qui les utilisent
peuvent dans la plupart des cas être vaincus en une dizaine de
coups.
Maintenant que vous êtes persuadés (au cas ou vous ne l'étiez
pas déjà) qu'un ordinateur peut jouer aux échecs, demandons-nous
comment un ordinateur peut bien jouer aux échecs (et c'est
précisément là que tout se complique).
En théorie, il "suffit de" créer un programme qui explore
tous les coups possibles jusqu'à la fin de la partie et utilisera
ensuite le résultat de cette exploration pour toujours choisir
la meilleure stratégie.
Considérons comme exemple le jeu du morpion sur une grille de
trois cases de coté : la meilleure stratégie permet toujours d'obtenir
soit une victoire, soit une égalité. Quelle que soit la tactique
utilisée par l'adversaire, il existe toujours un coup qui permet
de s'assurer la victoire, voire au pire une partie nulle. Pour
cela il suffit à partir de la position initiale de considérer
tous les coups possibles, puis toutes les réponses possibles de
l'adversaire pour chacun de ces coups, et ainsi de suite jusqu'à
la fin de la partie. Une fois l'analyse terminée, le programme
choisira à chaque tour la meilleure possibilité en évitant la
défaite à coup sûr.
Il se trouve que, malheureusement, dans le cas des échecs le nombre
de possibilités qui doivent être explorées est gigantesque (estimé
à 1040). Ce nombre étant bien au delà des possibilités
des ordinateurs actuels (et cela pour encore un bon moment), les
programmes d'échecs doivent utiliser des techniques permettant
de limiter le nombre de possibilités à évaluer.
Les techniques de base
Dès
1950, Claude Shannon a proposé 2 stratégies pour restreindre le
nombre de possibilités a explorer. Ces deux méthodes sont toujours
largement utilisées par les programmes d'échecs actuels.
La première méthode, appelée "stratégie de Shannon type A",
considère tous les mouvements possibles à partir d'une position
donnée jusqu'à un certain nombre de coups (déterminé à l'avance).
A chaque position explorée, une fonction d'évaluation est appliquée
pour déterminer si cette position est intéressante ou non. A la
fin de cette exploration, le coup le plus intéressant est joué.
L'idée de base étant que puisqu'il n'est pas possible d'explorer
toutes les alternatives possibles, on se limite à regarder les
positions engendrées en jouant un nombre de coups donné, ce qui
peut se faire en un temps raisonnable.
Fonction d'évaluation
Pour
déterminer si une position est favorable ou non, l'ordinateur
utilise une fonction d'évaluation qui assigne une valeur à chaque
position en fonction de la situation de l'échiquier : avantage
matériel ou positionnel, etc.
Morgenstein
et von Neumann, qui ont formalisé la théorie des jeux sur ordinateurs,
ont réalisé que le jeu peut être considéré comme une arborescence
de positions possibles reliées entre elles par les mouvements
de pièces. A chaque embranchement, le joueur qui a le trait choisi
de s'engager sur une branche de l'arbre qui maximise ses chances
de gagner ou qui minimise les chances de gain de l'adversaire.
D'où le nom de cette méthode : min-max.
Du fait que la complexité de ce problème est exponentielle, les
ordinateurs actuels utilisant cette méthode doivent limiter leur
recherche à une douzaine de déplacements. A raison de 30 possibilités
de déplacement en moyenne pour chaque coup, cela représente déjà
3012 (soit environ 5.3 * 1012) cas à explorer.
L'arbre d'exploration est également trop gros pour tenir en mémoire
et les programmes utilisant cette méthode de recherche ne conservent
en mémoire que les meilleures branches de l'arbre, ce qui fait
que celui-ci doit être recalculé à chaque mouvement.
L'autre
stratégie de base définie par Shannon, dite "stratégie de
Shannon type B", consiste a limiter le nombre de possibilités
a considérer à chaque niveau. Pour chaque configuration de l'échiquier
examinée, un générateur de mouvement détermine les mouvements
possibles, et sélectionne seulement les meilleurs (approximativement
huit). Par opposition à la stratégie A, celle-ci ne définie pas
de profondeur maximale pour la recherche. Typiquement, la recherche
est effectuée à une profondeur minimum, mais si on arrive à une
position intéressante, comme une série de captures ou un échec
au roi, alors l'exploration sera poursuivie quelques niveaux plus
loin. L'explication est simple : si au dernier niveau d'exploration
le joueur peut capturer une tour adverse avec sa dame, cela peut
sembler être un bon coup, cependant si au coup suivant l'adversaire
capture la dame du joueur avec un pion, le coup n'est plus du
tout intéressant.
Les
essais ont montré que les explorations en profondeur ne sont pas
très efficaces si seulement certains mouvements sont sélectionnés
à chaque position de l'échiquier. Pour cette raison, les ordinateurs
rapides utilisent souvent la stratégie A, alors que les programmes
qui tournent sur des architectures plus modestes, comme des microcontroleurs,
utilisent la stratégie B.
Optimisations et heuristiques !
Maintenant
que nous avons planté le décors et présenté les algorithmes de
base intéressons-nous aux diverses heuristiques et techniques
permettant d'améliorer le niveau de jeu des programmes d'échecs.
Recherche alpha-beta
Cette
méthode est une amélioration du min-max. Au lieu d'explorer l'arbre
des coups "bêtement" dans le sens de la largeur, on
stoppe l'exploration sur les branches dont les meilleurs noeuds
sont nettement moins favorables que les meilleurs coups possibles
déjà trouvés sur d'autres branches. A elle seule, cette technique
permet une amélioration considérable du niveau de jeu (Consultez
le document cité dans les références si vous désirez en savoir
plus sur l'algorithme alpha-beta).
Dictionnaire d'ouvertures
Tous
les débuts de parties d'échecs intéressantes connues sont rassemblés
dans un dictionnaire que le programme peut utiliser pour choisir
ses coups plus rapidement en début de partie. En effet, tout au
long de l'histoire des échecs, des milliers de joueurs ont analysés
un grand nombre de positions initiales et longuement écris à leur
sujet. Il n'est donc pas judicieux que les programmes d'échecs
perdent du temps à redécouvrir ces ouvertures. Les programmes
évolués sont donc capables d'exploiter une base de données d'ouvertures
connues soit comme étant "bonnes" soit à éviter absolument
et joueront leurs coups quasi-instantanément en début de parties.
Comme pour la plupart des techniques, celle-ci résout certains
problèmes, mais elle en crée aussi d'autres.
Par exemple, un excellent joueur peut exploiter le dictionnaire
d'un programme en jouant une série de coups pour amener l'échiquier
dans une configuration qu'il suppose ne pas être dans le dictionnaire.
Ainsi, lorsque le programme ne peut plus utiliser son dictionnaire
et doit commencer à "réfléchir", il peut se trouver
en assez mauvaise posture et perdre de précieux coups à replacer
ses pièces. D'autre part, si un joueur connaît le contenu exact
du dictionnaire d'ouverture de son adversaire, il peut préparer
des pièges spécialement contre lui. Contre un joueur humain, ce
genre de piège ne marchera qu'une seule fois. En revanche, contre
un programme qui n'est pas capable d'"apprendre", un
même piège marchera évidemment à tous les coups. Pour éviter ce
genre d'attaque, la plupart des programmes d'échecs sérieux sont
capables d'analyser le début de la partie et d'éventuellement
modifier leur dictionnaire d'ouvertures en conséquences. L'expérience
a montré que la qualité du dictionnaire et sa méthode d'utilisation
ont une influence déterminante sur la qualité de jeu d'un programme.
Dictionnaire de fins de parties
Tout
comme pour les ouvertures, il existe un certain nombre de configurations
de fins de parties pour lesquelles les stratégies sont connues.
De plus, lorsque le nombre de pièces restantes sur l'échiquier
est suffisamment faible, il devient possible d'explorer de manière
exhaustive toutes les possibilités. Par exemple, lorsqu'il ne
reste que cinq pièces le nombre de configurations possibles n'est
"que" de 160 millions (en tenant compte des symétries),
ce qui est tout à fait à la portée des ordinateurs actuels.
De telles analyses ont d'ailleurs mené à certains résultats étonnants
et totalement inattendus. Par exemple, il était connu depuis longtemps
que lorsqu'il ne reste qu'une dame et un roi contre une tour et
un roi, la partie peut être assez facilement gagnée par le joueur
qui possède la dame, ce qui conduisait généralement l'adversaire
a abandonner la partie. Cependant, l'analyse a montré que la victoire
est en fait très difficile et que si le joueur possédant la dame
ne connaît pas parfaitement cette fin de partie, il pourra être
contraint à une partie nulle par l'adversaire.
L'autre surprise (de taille également) concerne la fin de partie
entre un roi et deux fous contre un roi et un cavalier. On a longtemps
considéré que cette position menait à la partie nulle, alors que
l'ordinateur a montré que ce cas de figure se soldait dans la
plupart des cas par la victoire du joueur possédant les fous.
Cependant personne actuellement n'a pu prétendre comprendre la
méthode à utiliser. Celle-ci semble être une série de mouvements
aléatoires qui mène, après un grand nombre de coups, à la prise
du cavalier adverse; le mat est ensuite simple pour le joueur
qui possède les deux fous.
En pratique, les dictionnaires de fin de parties sont limités
aux configurations avec au maximum 5 pièces, car au delà on assiste
à une explosion combinatoire.
L'utilisation de ce genre de connaissances par les programmes
d'échecs mène cependant parfois à des situations singulières.
Par exemple un programme qui a un gros avantage matériel sur l'adversaire
peut choisir de sacrifier délibérément sa dame uniquement pour
simplifier la configuration de l'échiquier et mener à une configuration
référencée comme gagnante dans le dictionnaire de fins de parties.
De même, un programme peut refuser catégoriquement les "cadeaux"
qui lui sont fait pour éviter de tomber dans une configuration
qui amènera à sa défaite de manière quasi-certaine.
Matériel spécifique
Une
fois les stratégies utilisées par l'ordinateur déterminées, il
est possible de construire des cartes spécifiques pour réaliser
certaines opérations. De même que la plupart des ordinateurs actuels
contiennent des cartes graphiques qui savent gérer elles-mêmes
les fonctions de base du calcul en 3D, voire même des fonctions
plus évoluées comme l'application de textures, des cartes ont
été mises au point pour accélérer les programmes d'échecs. Les
ordinateurs d'échecs produits par IBM, par exemple, utilisent
ce type de matériel spécifique.
Tables de transpositions
Souvent,
une même position peut être atteinte de plusieurs manières différentes.
Pour éviter d'avoir a explorer des sous-arbres identiques, une
liste des positions atteintes est conservée en mémoire. Lorsqu'une
de ces positions est atteinte par un autre chemin, on peut arrêter
la recherche sur cette branche.
Rien en vue à l'horizon
L'effet
d'horizon constituait un des principaux problèmes des premiers
programmes d'échecs. Dans le cas où l'une de ses pièces était
sur le point d'être prise, si le joueur humain repérait le problème
suffisamment tôt, il lui était possible de l'éviter en modifiant
sa tactique de jeu pour faire "reculer" ce coup dans
l'arbre d'exploration avec des déplacements qui retardent ce coup,
comme une mise en échec inoffensive, une attaque inutile sur la
dame de l'adversaire, etc; jusqu'à ce que le coup remonte suffisamment
loin dans l'arbre pour qu'il devienne hors de portée du programme.
A ce moment, il devait lui être possible de trouver un déplacement
qui permettait d'éviter ce mauvais coup. La plupart des programmes
d'échecs actuels évitent ce problème en conservant une liste des
meilleurs coups trouvés ("killer moves") et vérifient
régulièrement s'il est toujours possible de les atteindre. De
la sorte, lorsqu'un "bon" coup est trouvé mais qu'il
ne peut être joué de suite, celui-ci est gardé en mémoire pour
essayer de le jouer dès que l'occasion se présente.
Distance
Lorsqu'un
programme sait qu'il a partie gagnée (par exemple dans le cas
d'une fin de partie avec une dame et roi contre un roi), il peut
arriver qu'il se limite à tenter en permanence d'améliorer sa
position sans jamais faire de réel progrès. Dans le cas où l'exploration
utilise l'algorithme alpha-beta par exemple, le programme peut
voir un mat en deux coups et du fait de la coupure introduite
par l'algorithme ne pas voir un mat possible en un coup. Cela
pourrait passer, sauf si le cas se reproduit au coup suivant,
ainsi qu'au suivant, etc. ;-) La méthode classique pour éviter
ce problème est très simple. Lorsque l'on détecte un mat possible
en N coups, on force au tour suivant de choisir un déplacement
qui mène à un mat en N-1 coups. L'utilisation de dictionnaires
de fins de parties permet également d'éviter ce problème dans
un bon nombre de cas.
"Tranquillité" de l'échiquier
Si
l'exploration est limitée à (par exemple) 8 coups, et qu'une position
favorable est trouvée à cette limite, cela peut en fait s'avérer
être un très mauvais coup si au tour suivant l'adversaire peut
prendre la dame du joueur sans contrepartie. Du fait que l'évaluation
d'une position est statique, c'est-à-dire qu'elle ne tient compte
que de la position courante, le seul moyen d'éviter ce problème
est de poursuivre la recherche un cran plus loin; sachant qu'arrivé
là, on se trouvera en face du même problème. La solution classique
consiste à diviser l'exploration en deux phases : La phase statique,
durant laquelle tous les coups, même ceux qui paraissent les plus
mauvais sont examinés ; puis la phase dynamique qui permettra
de creuser un peu plus loin si besoin est. Durant cette deuxième
phase, seuls les coups intéressants ou menant à la prise d'une
pièce sont considérés. De la sorte, l'exploration peut aller jusqu'à
15, voire 20 coups en avance lorsque la situation de l'échiquier
l'exige.
Considérations périphériques
En
plus des méthodes énumérées ci-dessus, il faut également tenir
compte d'un certain nombre de considérations supplémentaires qui
sont plus difficiles à évaluer de manière objective. En voici
quelques unes :
Offres de parties nulles
Dans
le cas où l'adversaire propose une partie nulle, dans quelles
conditions doit-on accepter? Si l'exploration de l'arborescence
découvre une série de coups qui mène à une partie nulle, doit-elle
être jouée? Dans quelles situations peut-on ou doit-on proposer
une partie nulle? Si l'on découvre que quoi qu'il arrive l'adversaire
va faire mat dans 8 coups, peut-on tenter de bluffer et proposer
une partie nulle? Lorsque ce genre de décision doit être prise,
la situation actuelle de l'échiquier doit bien évidement être
prise en compte, mais il faut également tenir compte d'autres
paramètres comme le niveau de jeu de l'adversaire ou le score
du match en cours (Lors d'un match, une partie gagnée rapporte
un point, une partie nulle un demi-point et une défaite zéro point.
Le gagnant est le premier qui obtient trois points). Si l'adversaire
est un grand maître ou si une partie nulle est suffisante pour
gagner le match, une offre de partie nulle est tout à fait acceptable.
En revanche si l'adversaire joue avec un niveau assez faible ou
si une victoire est indispensable pour gagner le match, alors
il vaut peut être mieux refuser l'offre même si les chances de
faire mat sont faibles.
Complexité contre simplicité
L'ordinateur
doit apprendre a gérer les éventuelles imperfections de son adversaire
(que celui-ci soit humain ou non). C'est-à-dire que dans certains
cas, il est préférable de prendre le risque que l'adversaire n'ait
pas vu une combinaison gagnante extrêmement obscure et continuer
à jouer comme si de rien n'était, plutôt que de tenter de l'éviter
à tout prix dans la mesure où cela peut mener à une situation
embarrassante. De même, dans certains cas, la meilleure alternative
consiste à jouer en ne prenant absolument aucun risque et a attendre
que l'adversaire fasse une gaffe. La gestion de ce genre de considérations
est extrêmement délicate pour un ordinateur dans la mesure ou
ils relèvent de critères totalement subjectifs.
Gestion du temps
Toutes
les parties sérieuses se jouent en temps limité. Les programmes
doivent donc apprendre à gérer ce temps au mieux. Ils doivent
donc régulièrement comparer l'avancement de leur recherche avec
le temps imparti et décider si le meilleur coup trouvé doit être
joué ou si plus de temps peut ou doit être consacré à la recherche
d'un meilleur coup. Si un coup "suffisamment bon" est
trouvé ou si le coup à jouer est "évident", c'est en
général une bonne chose de jouer avant que le temps initialement
imparti pour le calcul du coup soit écoulé pour économiser du
temps qui peut être précieux plus tard dans la partie.
Résolution de problèmes
La
résolution de problèmes d'échecs (du genre "les blancs jouent
et font mat en trois coups" ou similaire) est un peu différente
des parties classiques. Dans certains cas, le nombre de coups
à jouer n'est pas important et il suffit de trouver une combinaison
gagnante. Un programme d'échecs peut être transformé en solveur
de problèmes en modifiant la fonction d'évaluation pour qu'elle
retourne toujours zéro sauf lorsque le mat est atteint.
Les programmes d'échecs disponibles
sous Linux
Il
existe une multitude de programmes d'échecs disponibles sous Linux.
Les 3 plus intéressants (ie: ceux qui offrent le meilleur niveau
de jeu) sont Crafty, GNU Chess et Phalanx. Leurs modes de fonctionnement
ainsi que leurs niveaux de jeu respectifs ont été abordés dans
l'article "Jouez aux échecs contre Linux" paru dans
le numéro précédent. Les 3 sont compatibles avec les interfaces
graphiques XBoard et gnome-chess. Maintenant, vous pourrez jouer
contre eux en sachant un peu mieux comment ils fonctionnent (Bonne
chance ;-)
Références
|
-
Deep Blue v1:
http://www.ibm.com/stretch/eos/deepblue/dbo.phtml
- Deep Blue v2:
http://www.research.ibm.com/deepblue/
- Newsgroups :
rec.games.chess.misc
rec.games.chess.computer
- Internet Chess Library
http://www.freechess.org/
- Site de la revue "Europe Échecs"
http://www.echecs.com/
- Algorithme de recherche "alpha-beta" :
http://www.epita.fr/~dumesn_r/Les%20algo/alpha.htm
- Crafty
ftp://news.cis.uab.edu/pub/hyatt/
- GNU Chess
http://www.fsf.org/software/chess/chess.html
- Phalanx
http://www.crosswinds.net/~dobes/phalanx/
- XBoard
http://www.research.digital.com/SRC/personnal/Tim_Mann/chess.html
|
Utilisateur
de GNU/Linux depuis 1993, Vincent Renardias est activement
impliqué dans son développement depuis 1996 : Développeur
de la distribution Debian, auteur de la traduction Française
de l'environnement GNOME, créateur du groupe d'utilisateurs
Linux de Marseille (PLUG). Il continue aujourd'hui activement
a promouvoir le système GNU/Linux en tant que responsable
technique de la société Echo (créatrice du moteur de recherche
www.voila.fr).
Vincent Renardias <vincent@echo.fr>
|
|
|