Radix Sort

8 août 2017

C’est un article qui date mais, parfois, il est bon de revisiter les algorithmes de base, ne serait-ce que pour les avoir encore bien en tête quand le jour viendra où vous en aurez besoin pour un problème bien particulier!  Parce que les cours universitaires, ils commencent à être loin loin loin dans mes pensées!

Le radix sort revisité!


Gnochon : le plan (2)

8 février 2017
alice-kent-stoddard-the-chess-game

Alice Kent Stoddard – The Chess Game

1-L’objectif

Comme je l’ai expliqué prédemment, je me lance dans la création d’un programme d’échecs en Smalltalk. J’y pensais depuis longtemps et m’y voici, finalement.  Je tâcherai d’atteindre deux buts : faire un programme d’échecs qui atteindra au moins 2000 Elo et ne consulter aucun code source pour m’inspirer des algorithmes des autres.  Autre défi de taille, essayer de trouver du contenu en français pour vous aiguiller si vous avez besoin d’un coup de pouce supplémentaire!

2-Pourquoi Smalltalk?

Pourquoi Smalltalk, un langage interprété? Tout d’abord, parce que c’est de loin le langage de programmation que je connais le plus comme je l’utilise depuis plus de 22 ans.  Ensuite, parce l’environnement Smalltalk offre une facilité de débogage, une panoplie d’outils et une rapidité de dévelopement inégalés.  Par ailleurs, Smalltalk est pourvu d’une riche et mature librairie de code et d’une multitude de classes de base par défault. Finalement, j’ai aussi choisi Smalltalk parce que c’est un des meilleurs exemples de « write once, run anywhere« .  Pharo et Squeak sont disponibles sur mac (macOS, OS X), Windows (x32, x64) et GNU/Linux (x86 et ARM).

3-Les prérequis

Dans la mesure où vous seriez tentés de suivre ce blogue et cette aventure en essayant vous aussi de coder un programme d’échecs, il vous faudra quelques prérequis pour suivre mes développements.  Premièment, une connaissance de Smalltalk est grandement souhaitable (quoique la syntaxe du langage et le code sont si simples que vous devriez tous être en mesure de comprendre).

Ensuite, une connaissance minimale des règles du jeu d’échecs est nécessaire : cela inclut le déplacement des pièces, la prise en passant, le roque, la promotion du pion, la règle des cinquante coups, la règle de répétition de position, le mat, le pat, les cas de parties nulles (e.g. matériel insuffisant pour mater), la notation algébrique, etc.  Idéalement, vous seriez un joueur d’échecs vous-même quoique cela n’est pas absolument nécessaire comme l’a déjà prouvé Claude Jarry [1]!

Claude Jarry attendant la réponse de son programme d’échecs « L’Excentrique »

4-Les outils

Évidemment, vous aurez besoin de Squeak et/ou Pharo!

Je ne compte utiliser que des solutions open source pour ce projet alors ne craignez pas de dépenser un seul sou! Alors si vous désirez me suivre pas à pas, j’utiliserai Squeak au début puis je migrerai ensuite mon programme sur Pharo.

ampoule48x48

Comme Pharo a comme ancêtre Squeak, vous pourrez utiliser l’un des deux environnements sans distinction ni problème. S’il y a des différences rencontrées en cours de chemin, je me ferai un devoir de vous les souligner et de vous les expliquer!

Il vous faudra aussi un éditeur de texte convenable (je n’ai que de bons mots pour Notepad++).  Puis un logiciel de comparaison de fichier pourra aussi s’avérer très utile (je ne jure que par WinMerge). Ensuite, un logiciel de base de données de parties d’échecs (pour pouvoir construire une bibliothèque d’ouverture, lire et sauvegarder des parties et des positions, imprimer des diagrammes, etc comme SCID vs PC ou SCID) est un outil incontournable et vital pour ce projet. Finalement, un logiciel de compression de données et d’archivage comme 7-Zip (j’utilise principalement les formats zip, gz et 7z).

Dès que le programme sera en mesure de jouer une partie complète, il nous faudra un logiciel d’appariement (comme Arena ou CuteChess) pour automatiser les tests et le faire jouer contre d’autres programmes d’échecs : il nous faudra alors utiliser un des protocoles de communication disponibles  (Xboard ou UCI). Aussi, un autre incontournable, le programme d’extraction PGN-Extract pour les parties d’échecs en format PGN.

Finalement, si votre esprit s’égare parfois d’une idée à l’autre comme moi, la technique Pomodoro (et un minuteur Pomodoro approprié) sont plus que bénéfiques!

5-Les ressources

Pour apprendre à jouer aux échecs : l’article dans Wikipedia, les leçons d’échecs pour débutants en ligne, le WikiLivre Apprendre à jouer aux échecs.

Pour apprendre Squeak : le livre Squeak par l’exemple.

Pour apprendre Pharo : le livre Pharo par l’exemple.

Pour de l’aide en programmation (général) : developpez.net

Pour de l’aide en Squeak ou Pharo : sachez que les listes de diffusion (toutes en anglais) de Pharo et Squeak sont toujours très efficaces et rapides à répondre aux questions.  Qui plus est, un grand nombre d’utilisateurs de Squeak et Pharo sont situés en Europe et parlent français!  Évidemment nétiquette oblige, posez vos questions en anglais en premier lieu!

Pour toute autre aide pour ce projet : bien que les salons de discussions sur IRC (sur irc.freenode.net) soient habituellement en anglais, sachez que vous me trouverez toujours sur ##chessprogramming, #pharo ainsi que #squeak sous l’alias lamneth (et un peu partout sur IRC dans tous les salons reliés à Smalltalk de près ou de loin)!

6-Pourquoi le nom Gnochon?

En québécois, un gnochon désigne une personne idiote, stupide, imbécile.  C’est probablement ce dont aura l’air mon programme d’échecs au début!

7-Les étapes

Voici une liste assez complète de tout ce dont j’ai l’intention d’équiper mon programme.  J’ai divisé le projet en sept jalons afin de ne pas perde de vue l’objectif final ni de céder au découragement ou à l’éparpillement des efforts!

a) Avoir un programme qui génère tous les coups valides d’une position

Définir les classes de base : l’échiquier et les coups.
Définir le générateur de coups
Arriver à lire/écrire des fichiers EPD
Tester le générateur de coups avec perft
Définir un évaluateur de position de base (matériel seulement)
Définir un mécanisme de tri des coups (move ordering)

b) Avoir un programme capable de faire une recherche de plusieurs niveaux

Définir les tables de piece-square et bitmasks nécessaires/manquants
Définir la recherche alpha-beta (ou équivalent)
Définir le iterative deepening

c) Avoir un programme capable de jouer une partie complète

Définir un gestionnaire de temps de réflexion (pour respecter les cadences)
Gérer le protocole de communication utilisé (XBoard ou UCI, à décider)
Définir une fonction d’évaluation positionnelle
Arriver à lire/écrire des fichiers PGN

d) Raffiner l’élagage de l’arbre et accélérer la recherche

Implémenter le null move
Implémenter le concept de aspiration window
Implémenter le static exchange evaluator
Arriver à lire une bibliothèque d’ouverture (opening book)

e) Permettre au programme de chercher à une plus grande profondeur

Implémenter le futility pruning
Implémenter le late move reduction
Implémenter la quiescence search
Implémenter une table de killer move

f) Accélérer l’évaluation et permettre un meilleur jeu en finales

Ajouter le support pour les tables de fin de partie (tablebases)
Implémenter une table de transposition avec le Zobrist hashing
Implémenter une table de hachage pour la structure de pions
Implémenter le late move reduction

g) Mieux gérer les débuts et les fins de partie

Implémenter un évaluateur de fin de partie
Générer ma propre bibliothèque d’ouvertures avec les parties du CGR
Ajouter des algorithmes de gestion de fin de partie pour certaines finales

8-Et après?

Il y aura toujours d’autres fonctionalités et algorithmes qu’on pourra ajouter à n’importe quel programme d’échecs.  Que ce soit le contempt factor, le desperate move, la recherche en parallèle, le pondering, etc.  Tellement de trucs ont été essayés, tellement de papiers ont été écrits sur le sujet, tellement d’algorithmes et de structures de données ont été expressément développées dans le cadre des jeux d’échecs par ordinateur que c’est une inépuisable spirale qui bouffera tous vos temps libres si vous n’y faites pas attention!

L’important est d’y aller lentement, pas à pas.  Et surtout de tester.  De retester.  De tester encore. Et d’encore tester! À chaque étape, à chaque changement!

Parce que comme Ken Thompson l’a déjà dit, écrire un programme d’échecs a été une des choses les plus difficiles qu’il a faite.

ken-joe

Ken Thompson (à droite) et Joe Condon

Quand on sait que le gars a inventé des fontes d’échecs, qu’il a inventé le langage B et participé à l’élaboration du langage C, qu’il a développé Unix, qu’il a développé le système d’exploitation Plan 9, qu’il a généré les toutes premières tables de finales de parties d’échecs, qu’il a écrit Belle (programme d’échecs champion en 1978, 1980, 1981, 1982 et 1986), qu’il a co-inventé le langage Go, qu’il a élaboré les expressions régulières, implémenté les éditeurs de texte QED et Ed, qu’il a participé à la définition du standard du codage UTF-8, bien on se dit que si Ken Thompson a trouvé qu’écrire un programme d’échecs c’était difficle, c’est que ça doit l’être!

kenthompsonchessfonts

Les fontes d’échecs inventées par Ken Thompson

Note: pour une liste encore plus longue de tous les accomplissements de Ken Thompson, la page wikipedia en anglais en encore plus complète.  La liste des choses que ce génie de l’informatique a réalisé est tout simplement hallucinante!

 

 


La suite de Fibonacci

7 février 2015

La suite de Fibonacci : c’est probablement l’algorithme le plus enseigné au monde.  Quiconque a suivi des cours en informatique sait bien que c’est l’exemple dont l’on se sert pour enseigner la récursivité.  Mais pour la plupart des informaticiens de gestion, la suite de Fibonacci est vite reléguée aux oubliettes après les études.

Toutefois, cette suite regorge de trésors, malgré son étonnante simplicité.  C’est probablement l’algorithme qui est traduit dans le plus grand nombre de langages de programmation.  Pour le lecteur averti et nostalgique, quelques façons plus optimales d’implémenter cet algorithme!  Quelques autres variantes dans votre langage de programmation préféré sont ici.  Pour les plus curieux d’entre vous, une liste exhaustive sur RosettaCode.


Algorithmes génétiques et marche

6 février 2015

ga_walking

Une amusante démonstration visuelle d’un algorithme génétique cherchant à optimiser la marche!


Un autre tri : LampSort

8 décembre 2014

LampSort

Pour les passionnés d’algorithmes et les nostalgiques des bibles (en particulier le volume 3!) de Donald Knuth, un nouvel algorithme de tri est maintenant disponible pour Pharo : LampSort.


2048

23 mai 2014

2048, ce petit jeu si simple et pourtant si complexe et prenant!  J’en suis accroc!  La version originale, pour jouer en ligne, est ici.

Grabriele Cirulli, son auteur, cause des mots de tête à plusieurs millions de personnes!

Qu’à cela ne tienne, j’ai maintenant une raison de plus de m’y intéresser!!

En effet, Cincom a décidé de lancer un concours de programmation (avec VisualWorks ou ObjectStudio) pour le meilleur programme de résolution de 2048, annoncé ici.

Quelques idées d’algorithmes se retrouvent ici, ici, et ici (en français).

J’entends déjà l’insomnie qui me guette se pouffer de rire!