Exemple #1
0
        public ShortestPathSearcher(IGraph <V, E> graph, V source, V target, Func <E, long> getWeight)
        {
            if (graph == null)
            {
                throw new ArgumentNullException("graph");
            }
            if (!graph.HasVertex(source))
            {
                throw new ArgumentException("source");
            }
            if (!graph.HasVertex(target))
            {
                throw new ArgumentException("target");
            }
            if (DefaultVertexComparer.Equals(source, target))
            {
                throw new ArgumentException("Source and Target are equal");
            }

            Graph  = graph;
            Source = source;
            Target = target;

            GetWeight = getWeight;
        }
Exemple #2
0
            public bool VertexIsInPath(V1 nextVertex)
            {
                PathNode <V1> node = this;

                while (node != null)
                {
                    if (DefaultVertexComparer.Equals(nextVertex, node.Vertex))
                    {
                        return(true);
                    }

                    node = node.Parent;
                }
                return(false);
            }
Exemple #3
0
        protected void MakeStep(PathNode <V> node)
        {
            IEnumerable <EdgeDescriptor <V, E> > edgeDescriptors = Graph.AdjacentVertices(node.Vertex);

            foreach (EdgeDescriptor <V, E> edgeDescriptor in edgeDescriptors)
            {
                V    nextVertex = edgeDescriptor.GetInvertedVertex(node.Vertex);
                bool isInverted = !DefaultVertexComparer.Equals(edgeDescriptor.Vertex1, node.Vertex);

                if (node.VertexIsInPath(nextVertex))
                {
                    continue;
                }

                if (DefaultVertexComparer.Equals(nextVertex, Target))
                {
                    SucceedNodes.Add(new PathNode <V>(nextVertex, node, NodeSearchStatus.Success)
                    {
                        IsInverted = isInverted,
                        Weight     = CalctWeight(edgeDescriptor.Edge, node)
                    });
                    node.Status = NodeSearchStatus.Intermediate;
                }
                else
                {
                    InProgressNodes.Add(new PathNode <V>(nextVertex, node)
                    {
                        IsInverted = isInverted,
                        Weight     = CalctWeight(edgeDescriptor.Edge, node)
                    });
                    node.Status = NodeSearchStatus.Intermediate;
                }
            }

            if (node.Status != NodeSearchStatus.Intermediate)
            {
                node.Status = NodeSearchStatus.Fault;
            }

            InProgressNodes.Remove(node);
        }
Exemple #4
0
 public bool IsVertex2(V vertex)
 {
     return(DefaultVertexComparer.Equals(vertex, Vertex2));
 }