From 5f13a87ce77c5f2cba0707c122f8cf3f584347cf Mon Sep 17 00:00:00 2001 From: Lucas CHOLLET Date: Sun, 14 Aug 2022 13:09:00 +0200 Subject: [PATCH] ChessEngine: Limit MCTSTree expansion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This method temperate the habit of Monte-Carlo based algorithms to repeatedly create new nodes. It was first implemented in `Efficient Selectivity and Backup Operators in Monte-Carlo Tree Search` by Rémi Coulom. --- Userland/Services/ChessEngine/MCTSTree.cpp | 10 +++++++++- Userland/Services/ChessEngine/MCTSTree.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Userland/Services/ChessEngine/MCTSTree.cpp b/Userland/Services/ChessEngine/MCTSTree.cpp index a06fa62d41..a1a65af4d0 100644 --- a/Userland/Services/ChessEngine/MCTSTree.cpp +++ b/Userland/Services/ChessEngine/MCTSTree.cpp @@ -98,7 +98,15 @@ void MCTSTree::apply_result(int game_score) void MCTSTree::do_round() { - auto& node = select_leaf().expand(); + + // Note: Limit expansion to spare some memory + // Efficient Selectivity and Backup Operators in Monte-Carlo Tree Search. + // Rémi Coulom. + auto* node_ptr = &select_leaf(); + if (node_ptr->m_simulations > s_number_of_visit_parameter) + node_ptr = &select_leaf().expand(); + + auto& node = *node_ptr; int result; if constexpr (s_eval_method == EvalMethod::Simulation) { diff --git a/Userland/Services/ChessEngine/MCTSTree.h b/Userland/Services/ChessEngine/MCTSTree.h index 8c7c0dd776..15ce2943c8 100644 --- a/Userland/Services/ChessEngine/MCTSTree.h +++ b/Userland/Services/ChessEngine/MCTSTree.h @@ -37,6 +37,7 @@ private: // While static parameters are less configurable, they don't take up any // memory in the tree, which I believe to be a worthy tradeoff. static constexpr double s_exploration_parameter { M_SQRT2 }; + static constexpr int s_number_of_visit_parameter { 1 }; // FIXME: Optimize simulations enough for use. static constexpr EvalMethod s_eval_method { EvalMethod::Heuristic };