예제 #1
0
        //combination of breadth first search and a weighted shortest path algorithm
        public List <WeightedEdge <T> > TagFinder(Vertex <T> start, List <WeightedEdge <T> > final, List <Vertex <T> > visited, List <Vertex <T> > seen, List <WeightedEdge <T> > sortedNeighbors)
        {
            //Start with new queue. We start with new one each time because sortedNeighbors will just be transformed to queue and that persists across function calls
            Queue <WeightedEdge <T> > queue = new Queue <WeightedEdge <T> >();

            //Console.WriteLine("At Node: " + start.Value);
            //need visited node list
            //start at start list
            //add neighbors to queue of nodes to visit next based on their weight
            //as you visit node, add it to final list

            foreach (WeightedEdge <T> e in start.edges)
            {
                //if edge is not already in sortedNeighbors (i.e. it has been 'seen')
                //and if the target of the edge has not already been visited
                if (!sortedNeighbors.Contains(e) && !visited.Contains(e.End))
                {
                    sortedNeighbors.Add(e);
                    //seen.Add(e.End);
                }
            }

            //sort neighbors(edges) based on link strength
            //This sorting doesn't take into account proximity to start node
            sortedNeighbors.Sort(); //default sort is based on link

            //print out sortedNeighbors for debug purposes
            //Console.WriteLine("sortedNeighbors length:" + sortedNeighbors.Count());
            foreach (WeightedEdge <T> e in sortedNeighbors)
            {
                Console.WriteLine(e.ToString());
            }

            //added sortedNeighbors to queue
            foreach (WeightedEdge <T> e in sortedNeighbors)
            {
                queue.Enqueue(e);
            }

            //if queue is empty, return final
            if (queue.Count() == 0)
            {
                return(final);
            }

            //dequeue first element and visit that
            WeightedEdge <T> next = queue.Dequeue();

            //do similar operation to sortedNeighbors
            if (sortedNeighbors.Count() > 0)
            {
                sortedNeighbors.RemoveAt(0);
            }

            //visit node
            visited.Add(next.End);
            //add to list
            final.Add(next);//maybe add something else?
            return(TagFinder(next.End, final, visited, seen, sortedNeighbors));
        }
예제 #2
0
 public int CompareTo(WeightedEdge <T> e)
 {
     if (e.weight > weight)
     {
         return(1);
     }
     else if (e.weight < weight)
     {
         return(-1);
     }
     return(0);
 }
예제 #3
0
 public void RemoveEdge(WeightedEdge <T> edge)
 {
     edges.Remove(edge);
 }
예제 #4
0
 public void AddEdge(WeightedEdge <T> newEdge)
 {
     edges.Add(newEdge);
 }
예제 #5
0
 public void AddEdge(WeightedEdge <T> edge)
 {
     edges.Add(edge);
 }