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 };