3.1 KiB
Description du projet et question
Je développe un jeu de TricTrac (https://fr.wikipedia.org/wiki/Trictrac) dans le langage rust. Pour le moment je me concentre sur l'application en ligne de commande simple, donc ne t'occupe pas des dossiers 'client_bevy', 'client_tui', et 'server' qui ne seront utilisés que pour de prochaines évolutions.
Les règles du jeu et l'état d'une partie sont implémentées dans 'store', l'application ligne de commande est implémentée dans 'client_cli', elle permet déjà de jouer contre un bot, ou de faire jouer deux bots l'un contre l'autre. Les stratégies de bots sont implémentées dans le dossier 'bot'.
Plus précisément, l'état du jeu est défini par le struct GameState dans store/src/game.rs, la méthode to_string_id() permet de coder cet état de manière compacte dans une chaîne de caractères, mais il n'y a pas l'historique des coups joués. Il y a aussi fmt::Display d'implémenté pour une representation textuelle plus lisible.
'client_cli/src/game_runner.rs' contient la logique permettant de faire jouer deux bots l'un contre l'autre. 'bot/src/default.rs' contient le code d'une stratégie de bot basique : il détermine la liste des mouvements valides (avec la méthode get_possible_moves_sequences de store::MoveRules) et joue simplement le premier de la liste.
Je cherche maintenant à ajouter des stratégies de bot plus fortes en entrainant un agent/bot par reinforcement learning.
Une première version avec DQN fonctionne (entraînement avec cargo run -bin=train_dqn)
Il gagne systématiquement contre le bot par défaut 'dummy' : cargo run --bin=client_cli -- --bot dqn:./models/dqn_model_final.json,dummy.
Une version, toujours DQN, mais en utilisant la bibliothèque burn (https://burn.dev/) est en cours de développement.
Le commit 1e18b784 compile sans erreur. La commande 'just trainbot' effectue l'entraînement du modèle DQN avec burn-rl puis sauvegarde le modèle d'inférence et le teste.
L'entraînement se passe bien, on voit que l'agent obtient des récompenses, par contre quand on test le modèle d'inférence il n'y a aucune récompense. Voici le résultat de 'just trainbot' avec le commit 1e18b784 :
> Entraînement
{"episode": 0, "reward": 0.0000, "duration": 1000}
{"episode": 1, "reward": 132.2001, "duration": 215}
{"episode": 2, "reward": 121.4000, "duration": 143}
> Sauvegarde du modèle de validation
Modèle de validation sauvegardé : models/burn_dqn_model.burn
> Chargement du modèle pour test
Chargement du modèle depuis : models/burn_dqn_model.burn
> Test avec le modèle chargé
Episode terminé. Récompense totale: 0.00, Étapes: 1000
Une hypothèse pour l'absence de récompenses de l'agent utilisant le modèle d'inférence est que l'action choisie n'est pas un coup correct et qu'il est refusé, l'état du jeu n'avance pas et boucle sans fin. Pour corriger cela les commits suivants tentent d'ajouter un masque d'actions pour que le modèle d'inférence ne choisisse que parmi des actions valides.
Il y a des erreurs de compilation. Peux-tu exécuter 'just trainbot', regarder les erreurs et les corriger ?