Exemple #1
0
        private IEnumerable <NodeToNodeEdge> GetDistinctEdges()
        {
            var distinctEdges = new List <NodeToNodeEdge>();
            var nodes         = _mapProvider.GetAllNodes();

            foreach (var node in nodes)
            {
                var edges = node.Edges
                            .Select(e => new NodeToNodeEdge(node.Id, e.EndNode));
                foreach (var edge in edges)
                {
                    if (!distinctEdges.Any(e => e.Equals(edge)))
                    {
                        distinctEdges.Add(edge);
                    }
                }
            }

            return(distinctEdges);
        }
Exemple #2
0
        /// <summary>
        /// Returns a dictionary where each Key is a Node on the map with its closest predecessor as value.
        /// </summary>
        private Dictionary <Node, Node> FindAllPaths(int startNodeId)
        {
            Node startNode = _mapProvider.GetNode(startNodeId);

            // Initialize sets ready for walking
            var queue = new List <Node>()
            {
                startNode
            };
            var distances = new Dictionary <Node, int>()
            {
                { startNode, 0 }
            };
            var predecessors = new Dictionary <Node, Node>();

            var unvisited = _mapProvider.GetAllNodes()
                            .Except(new [] { startNode }).ToList();

            IEnumerable <Edge> GetUnvisitedEdges(Node node) =>
            node.Edges
            .Where(edge => unvisited.Any(visitedNode => edge.EndNode == visitedNode.Id));

            Node GetNearestNodeInQueue() => queue.OrderBy(node => distances[node])
            .First();

            while (queue.Any())
            {
                var currentNode = GetNearestNodeInQueue();
                queue.Remove(currentNode);

                var currentDistance = distances[currentNode];
                var unvisitedEdges  = GetUnvisitedEdges(currentNode);
                foreach (var edge in unvisitedEdges)
                {
                    var unvisitedEndPoint = _mapProvider.GetNode(edge.EndNode);

                    queue.Add(unvisitedEndPoint);
                    distances.Add(unvisitedEndPoint, currentDistance + edge.Distance);
                    predecessors.Add(unvisitedEndPoint, currentNode);

                    unvisited.Remove(unvisitedEndPoint);
                }
            }

            return(predecessors);
        }