public DepthLimitedUCTTreeNode(IGameMove move, DepthLimitedUCTTreeNode parent, IGameState state, int depth, int maxDepth, IStateBestMoveEstimator stateEstimator, double constant = 1.0) : base(move, parent, state, constant, false) { this.maxDepth = maxDepth; this.depth = depth; this.stateEstimator = stateEstimator; if (depth <= maxDepth) { untriedMoves = state.GetMoves(); } else { untriedMoves = new List <IGameMove>(); if (!state.isTerminal()) { IGameMove estimatedMove = stateEstimator.EstimateMove(state); state.DoMove(estimatedMove); AddChild(estimatedMove, state); } else { ITreeNode node = this; while (node != null) { node.Update(state.GetResult(node.PlayerWhoJustMoved)); node = node.Parent; } } } }
public override ITreeNode AddChild(IGameMove move, IGameState state) { DepthLimitedUCTTreeNode n = new DepthLimitedUCTTreeNode(move, this, state, depth + 1, maxDepth, stateEstimator, constant); untriedMoves.Remove(move); childNodes.Add(n); return(n); }