示例#1
0
        public static List<List<MoveDesc>> Run(AnalysisNode starting_node,
            INodeGenerator node_generator, uint fullmove_depth)
        {
            Debug.Assert(starting_node != null && starting_node.Position != null);
            Debug.Assert(node_generator != null);
            Debug.Assert(fullmove_depth > 0);

            List<List<MoveDesc>> result = null;

            // Run recursive function, which finds all forced mates
            // This call erases all nodes (except root), which do not
            // lead to a forced checkmate. So, if there is (are) forced mate(s)
            // then the remaining tree nodes give us an answer
            if (FindMateRecursive(starting_node, node_generator, fullmove_depth)
                && !starting_node.IsLeaf)
            {
                result = new List<List<MoveDesc>>();
                foreach (var child in starting_node.Children)
                {
                    CollectAllVariations(child, new List<MoveDesc>(), result);
                }
                Debug.Assert(result.Count > 0);
            }

            return result;
        }
示例#2
0
        private static bool FindMateRecursive(AnalysisNode starting_node,
            INodeGenerator nodes_generator, uint fullmove_depth)
        {
            Debug.Assert(fullmove_depth > 0);

            if (fullmove_depth == 1)
            {
                nodes_generator.GenerateAllChildren(starting_node, 1);
                // Release all children nodes except checkmate nodes
                nodes_generator.ReleaseChildren(x =>
                {
                    if (x.Position.IsInCheck)
                    {
                        nodes_generator.GenerateAllChildren(x, 1);
                        return !x.Position.IsCheckmate;
                    }
                    return true;
                },
                starting_node);
            }
            else
            {
                nodes_generator.GenerateAllChildren(starting_node, 2);
                foreach (var my_move in starting_node.Children)
                {
                    bool is_skip = false;
                    foreach (var her_move in my_move.Children)
                    {
                        if (!FindMateRecursive(her_move, nodes_generator,
                            fullmove_depth - 1))
                        {
                            // My opponent can avoid being checkmated
                            is_skip = true;
                            break;
                        }
                    }

                    if (is_skip)
                    {
                        nodes_generator.ReleaseChildren(my_move);
                    }
                }

                // Erase all children except checkmate nodes or move sequences
                // that lead to a force mate
                nodes_generator.ReleaseChildren(x =>
                {
                    return !x.Position.IsCheckmate && x.Children == null;
                },
                starting_node);
            }

            return starting_node.Children != null;
        }
示例#3
0
        public NetworkBuilder(INodeGenerator nodeGenerator, int nodeCount, double networkPower)
        {
            if (networkPower <= 0.0)
            {
                throw new ArgumentException("networkPower");
            }
            if (nodeCount <= 0)
            {
                throw new ArgumentException("nodeCount");
            }

            _nodeGenerator = nodeGenerator;
            _nodeCount     = nodeCount;
            _networkPower  = networkPower;
        }
示例#4
0
        private INetworkHandler CreateNetwork()
        {
            var metropolitanNodesCount    = int.Parse(MetropolitanNodesNumber.Text);
            var metropolitanNetworksCount = int.Parse(MetropolitanNetworksCount.Text);
            var networkPower = double.Parse(NetworkPower.Text);

            _nodeGenerator = new NodeGenerator();

            _nodeGenerator.ResetAccumulator();

            _simpleNetworkBuilder = new NetworkBuilder(_nodeGenerator, metropolitanNodesCount, networkPower);
            _networkBuilder       = new WideAreaNetworkBuilder(_simpleNetworkBuilder, metropolitanNetworksCount);

            var network = _networkBuilder.Build();

            return(network);
        }
示例#5
0
 public void Setup()
 {
     _nodeGenerator = new NodeGenerator();
 }