(C'est gentil de me préparer à mon oral de stage
)
Donc, PNS (Proof Number Search) est un algorithme servant à déterminer la valeur théorique d'un jeu : joueur 1 gagne, joueur 2 gagne, ou nul, en supposant que les deux joueurs ne fassent pas la moindre erreur. Il a par exemple été utilisé pour démontrer que le premier joueur gagne toujours au puissance 4. (en parallèle d'une autre méthode, qui elle utilisait des connaissances spécifiques au jeu pour "jouer parfaitement", ce qui n'est pas toujours possible quand le jeu n'est pas aussi simple que Puissance 4)
L'algorithme fonctionne un peu comme un mini-max : les noeuds max (où on joue notre coup) deviennent des noeuds OU, et les noeuds min deviennent ET.
On descend l'arbre de jeu de la racine jusqu'à la fin (la racine correspond typiquement à la position initiale mais rien n'empêche de lancer l'algorithme en milieu de partie). Chaque noeud possède deux attributs : pn (proof number) et dn (disproof number) qui correspondent au nombre de noeuds à évaluer pour prouver la victoire (resp. la défaite) du joueur.
Les noeuds sont initialisés avec pn = 1 et dn = 1.
Dans le traitement d'un noeud OU, pn reçoit le minimum des pn des autres fils (il suffit qu'un seul fils ait une séquence gagnante forcée pour que le noeud traité soit aussi gagnant) et dn reçoit la somme des dn des fils, et inversement lors d'un noeud ET. (il faut que tous les fils d'un noeud ET soient gagnants pour que celui-ci le soit également)
Lorsqu'on arrive à un noeud terminal, on met pn à 0 et dn à Infini s'il est gagnant, et l'inverse s'il est perdant.
Les valeurs sont remontées jusqu'à ce que la racine vaille 0 ou Infini, auquel cas on connaît le résultat du jeu.
Ici, j'ai rajouté un traitement particulier à chaque noeud visant à gérer le nul, mais là tout de suite j'ai pas de quoi expliquer formellement l'idée derrière.
Grosso-modo, l'idée principale est que le nombre -Infini est utilisé comme "signal" de la même manière que 0 et Infini, avec quelques bidouilles parce que l'algo est pas censé utiliser des nombres négatifs à la base.
Je sais que ça fonctionne en tout cas, donc restera plus qu'à formuler joliment la preuve.
Pour la deuxième question : concrètement, plus personne utilise PNS de manière sérieuse. Pourquoi ? Parce qu'il a des besoins ABSURDES en mémoire (on sauvegarde tout l'arbre de jeu, j'ai donc un magnifique tableau de plusieurs millions d'entrées dans mon programme, avec un compteur qui décroit et si on atteint 0, arrêt du programme), donc on a développé des variantes. Il y a notamment PN² qui consiste à faire un PN à deux niveaux, et df-pn qui fait une recherche en profondeur d'abord.
Les deux algorithmes consomment moins de mémoire mais PN² est plus lent, alors que DF-PN est plus rapide. Il est aussi beaucoup plus complexe, c'est pourquoi j'ai préféré rester sur un PNS basique dans cet exemple, étant donné que c'était un peu la première fois que je bossais avec ce genre d'algo, et que le jeu sur lequel je travaille n'est pas ultra-compliqué. (facteur de branchement maximum de 4*T, avec T la taille d'un côté du plateau, donc en 9*9 ça donne 9*4 = 36 coups possibles grand maximum, on est loin des échecs ou du jeu de Go)
P.S. Je pense que ma gestion du draw ne serait pas adaptée à tous les jeux : en effet, ici on sait quand la partie est terminée rien qu'en comptant les pierres sur le plateau. Au Go (où on peut capturer) ou aux échecs (où une partie peut durer 3 coups comme 150) ça ne marcherait sûrement pas parce que le draw est bien plus difficile à "détecter".
P.P.S. Avant d'implémenter PNS j'ai aussi fait un alpha-bêta qui se contente de jouer au jeu (pas de prouver sa valeur théorique). Ca s'est révélé très utile car je réutilise la fonction d'évaluation pour PNS, spécifiquement pour trier les coups. En effet, c'est beaucoup mieux de tester les meilleurs coups en premier puisqu'on a plus de chance de trouver le résultat final. On perd du temps à appeler la fonction d'évaluation (qui est relativement lourde avec plein de conditions partout) mais on en gagne en divisant très fortement le nombre de descentes à effectuer.
P.P.S Oh, un formulaire expiré, ça faisait longtemps.
Pavé César, ceux qui n'ont pas lu... 