public PhutballMoveScore Search(IFieldsGraph fieldsGraph) { var graphCopy = (IFieldsGraph)fieldsGraph.Clone(); var tree = _movesFactory.GetMovesTree(graphCopy); var targetBorder = _playersState.CurrentPlayer.GetTargetBorder(fieldsGraph); var cuttoffVisitor = new CuttoffPickBestValueNodeVisitor(targetBorder, graphCopy, _playersState) { CuttoffToTargetBorder = CuttoffToTarget }; var performMoves = cuttoffVisitor.MovesPerformer; var depthCounter = new DepthCounterNodeVisitor <JumpNode>(); var stopOnMaxNodesVisited = new StopOnVisitedNodesCount <JumpNode>(MaxVisitedNodes); var searchNodeVisitor = stopOnMaxNodesVisited .FollowedBy(cuttoffVisitor) .FollowedBy(depthCounter) .FollowedBy(_defaultNodeVistor); var search = _searchFactory(searchNodeVisitor, performMoves, targetBorder); search.Run(tree); return(new PhutballMoveScore(cuttoffVisitor.PickBestValue.ResultMove, cuttoffVisitor.PickBestValue.CurrentMaxValue) { VisitedNodesCount = stopOnMaxNodesVisited.VistedNodesCount, MaxDepth = depthCounter.MaxDepth, CuttoffsCount = cuttoffVisitor.CuttoffsCount }); }
public PhutballMoveScore Search(IFieldsGraph fieldsGraph) { var graphCopy = (IFieldsGraph)fieldsGraph.Clone(); var tree = _movesFactory.GetMovesTree(graphCopy); var targetBorder = _playersState.CurrentPlayer.GetTargetBorder(fieldsGraph); var cuttoffVisitor = new CuttoffPickBestValueNodeVisitor(targetBorder, graphCopy, _playersState) { CuttoffToTargetBorder = CuttoffToTarget }; var performMoves = cuttoffVisitor.MovesPerformer; var depthCounter = new DepthCounterNodeVisitor<JumpNode>(); var stopOnMaxNodesVisited = new StopOnVisitedNodesCount<JumpNode>(MaxVisitedNodes); var searchNodeVisitor = stopOnMaxNodesVisited .FollowedBy(cuttoffVisitor) .FollowedBy(depthCounter) .FollowedBy(_defaultNodeVistor); var search = _searchFactory(searchNodeVisitor, performMoves, targetBorder); search.Run(tree); return new PhutballMoveScore(cuttoffVisitor.PickBestValue.ResultMove, cuttoffVisitor.PickBestValue.CurrentMaxValue) { VisitedNodesCount = stopOnMaxNodesVisited.VistedNodesCount, MaxDepth = depthCounter.MaxDepth, CuttoffsCount = cuttoffVisitor.CuttoffsCount }; }
public AlphaBetaSearch(IValueOf <T> valuer, IAlphaBetaOptions maxDepth, ISearchNodeVisitor <T> nodeVisitor) { _valuer = valuer; _maxDepth = maxDepth.SearchDepth; _depthCounter = new DepthCounterNodeVisitor <T>(); _nodeVisitor = _depthCounter.FollowedBy(nodeVisitor); }
public PhutballMoveScore Search(IFieldsGraph fieldsGraph) { var graphCopy = (IFieldsGraph)fieldsGraph.Clone(); var tree = _movesFactory.GetMovesTree(graphCopy); var targetBorder = _playersState.CurrentPlayer.GetTargetBorder(fieldsGraph); var performMoves = new PerformMoves(graphCopy, _playersState); var bestValuePicker = new PickBestValueNodeVisitor(targetBorder, graphCopy, performMoves); var nodeCounter = new VisitedNodesCounter<JumpNode>(); var depthCounter = new DepthCounterNodeVisitor<JumpNode>(); var searchNodeVisitor = _defaultNodeVistor.FollowedBy(bestValuePicker).FollowedBy(nodeCounter).FollowedBy(depthCounter); var search = _searchFactory(searchNodeVisitor, performMoves, targetBorder); search.Run(tree); return new PhutballMoveScore( bestValuePicker.ResultMove, bestValuePicker.CurrentMaxValue) { VisitedNodesCount = nodeCounter.Count, MaxDepth = depthCounter.MaxDepth }; }
public PhutballMoveScore Search(IFieldsGraph fieldsGraph) { var graphCopy = (IFieldsGraph)fieldsGraph.Clone(); var tree = _movesFactory.GetMovesTree(graphCopy); var targetBorder = _playersState.CurrentPlayer.GetTargetBorder(fieldsGraph); var performMoves = new PerformMoves(graphCopy, _playersState); var bestValuePicker = new PickBestValueNodeVisitor(targetBorder, graphCopy, performMoves); var nodeCounter = new VisitedNodesCounter <JumpNode>(); var depthCounter = new DepthCounterNodeVisitor <JumpNode>(); var searchNodeVisitor = _defaultNodeVistor.FollowedBy(bestValuePicker).FollowedBy(nodeCounter).FollowedBy(depthCounter); var search = _searchFactory(searchNodeVisitor, performMoves, targetBorder); search.Run(tree); return(new PhutballMoveScore(bestValuePicker.ResultMove, bestValuePicker.CurrentMaxValue) { VisitedNodesCount = nodeCounter.Count, MaxDepth = depthCounter.MaxDepth }); }
public StopOnDepthNodeVisitor(int maxDepth) { _maxDepth = maxDepth; _depthCounter = new DepthCounterNodeVisitor <TNode>(); }