Ejemplo n.º 1
0
        public DijkstraFindAllPathsResponse <TNode> FindAllPaths(TNode start)
        {
            InitSets(start);
            while (unexploredSet.Count > 0)
            {
                TNode  current          = unexploredSet.Pool();
                double distanceFromNode = distanceFromStartToNode.GetValueOrDefault(current);

                foreach (TNode neightboar in heuristicImpl.GetNeighboars(current))
                {
                    double distanceFromStart = distanceFromNode + heuristicImpl.VertexLength(current, neightboar);
                    double distanceToN       = distanceFromStartToNode.ContainsKey(neightboar) ? distanceFromStartToNode.GetValueOrDefault(neightboar) : double.MaxValue;
                    if (distanceFromStart < distanceToN)
                    {
                        ReplaceInDictionary(distanceFromStartToNode, neightboar, distanceFromStart);
                        ReplaceInDictionary(nodeToParent, neightboar, current);
                        if (!unexploredSet.Contains(neightboar))
                        {
                            unexploredSet.Add(neightboar, distanceFromStart);
                        }
                    }
                }
            }

            return(new DijkstraFindAllPathsResponse <TNode>
            {
                distances = distanceFromStartToNode,
                nodeToParent = nodeToParent
            });
        }
Ejemplo n.º 2
0
        public IEnumerable <TNode> FindPath(TNode start, TNode goal)
        {
            InitializeSets(start, goal);
            while (notEvaluatedNodes.Count > 0)
            {
                TNode current = notEvaluatedNodes.Peek();

                if (current.CompareTo(goal) == 0)
                {
                    // TODO reconstruct_path
                    return(ReconstructPath(current));
                }

                notEvaluatedNodes.Pool();
                nodesVisited.Add(current, true);
                foreach (TNode neighboar in heuristicImpl.GetNeighboars(current))
                {
                    if (nodesVisited.ContainsKey(neighboar))
                    {
                        continue;
                    }

                    // compute heuristic cost
                    double tentativeDistance = costFromStartToNode.GetValueOrDefault(current) + heuristicImpl.HeuristicDistanceBetween(current, neighboar);
                    // This is not a better path.
                    double costOrDefault = costFromStartToNode.ContainsKey(neighboar) ? costFromStartToNode.GetValueOrDefault(neighboar) : double.MaxValue;

                    if (tentativeDistance >= costOrDefault)
                    {
                        AddWithPriotiry(neighboar, int.MaxValue);
                        continue;
                    }

                    // This path is the best until now. Record it!
                    ReplaceInDictionary(nodeToParent, neighboar, current);
                    ReplaceInDictionary(costFromStartToNode, neighboar, tentativeDistance);
                    //ReplaceInDictionary(costToGoal, neighboar, heuristicImpl.DistanceBetween(neighboar, goal));
                    AddWithPriotiry(neighboar, heuristicImpl.HeuristicDistanceBetween(neighboar, goal));

                    //notEvaluatedNodes = notEvaluatedNodes.OrderBy(keyIt => costToGoal.GetValueOrDefault(keyIt.Key)).ToDictionary((keyItem) => keyItem.Key, (valueItem) => valueItem.Value);
                }
            }

            return(null);
        }