コード例 #1
0
        public void BFS(DVertex <T> vertex)
        {
            double totalWeight = 0;

            Console.WriteLine(vertex.item);
            Queue <DVertex <T> > queue = new Queue <DVertex <T> >();

            for (int i = 0; i < vertices.Count; i++)
            {
                for (int j = 0; j < vertices[i].weightedEdges.Count; j++)
                {
                    if (vertices[i].weightedEdges[j].endVertex.Visited == false)
                    {
                        vertices[i].weightedEdges[j].endVertex.Visited = true;
                        totalWeight += vertices[i].weightedEdges[j].weight;
                        queue.Enqueue(vertices[i].weightedEdges[j].endVertex);
                    }
                }
            }
            while (queue.Count > 0)
            {
                Console.WriteLine(queue.Dequeue().item);
            }
            Console.WriteLine("Total weight: " + totalWeight);
        }
コード例 #2
0
 public void RemoveEdge(DVertex <T> vertex1, DVertex <T> vertex2)
 {
     for (int i = 0; i < vertices.Count; i++)
     {
         if (vertices[i].item.CompareTo(vertex1.item) == 0)
         {
             for (int j = 0; j < vertices[i].weightedEdges.Count; j++)
             {
                 if (vertices[i].weightedEdges[j].startVertex == vertex1 && vertices[i].weightedEdges[j].endVertex == vertex2)
                 {
                     vertices[i].weightedEdges.RemoveAt(j);
                 }
             }
         }
         if (vertices[i].item.CompareTo(vertex2.item) == 0)
         {
             for (int j = 0; j < vertices[i].weightedEdges.Count; j++)
             {
                 if (vertices[i].weightedEdges[j].startVertex == vertex1 && vertices[i].weightedEdges[j].endVertex == vertex2)
                 {
                     vertices[i].weightedEdges.RemoveAt(j);
                 }
             }
         }
     }
 }
コード例 #3
0
        public void Dijkstra(DVertex <T> startVertex, DVertex <T> endVertex)
        {
            Queue <DVertex <T> > priorityQueue = new Queue <DVertex <T> >();

            for (int i = 0; i < vertices.Count; i++)
            {
                vertices[i].distance = float.PositiveInfinity;
                vertices[i].Visited  = false;
                vertices[i].founder  = null;
            }
            startVertex.distance = 0;
            priorityQueue.Enqueue(startVertex);

            while (priorityQueue.Count > 0)
            {
                var current = priorityQueue.Dequeue();
                //if current is the end vertex, break
                if (current == endVertex)
                {
                    break;
                }

                for (int i = 0; i < current.weightedEdges.Count; i++)
                {
                    var neighbor = current.weightedEdges[i].endVertex;

                    float tentativeDistance = current.distance + current.weightedEdges[i].weight;
                    if (tentativeDistance < neighbor.distance)
                    {
                        neighbor.distance = tentativeDistance;
                        neighbor.founder  = current;
                        neighbor.Visited  = false;
                    }

                    //if not visited and not in queue, add to queue
                    if (!(neighbor.Visited && priorityQueue.Contains(neighbor)))
                    {
                        priorityQueue.Enqueue(neighbor);
                    }
                }
            }

            //stack and add end
            Stack <DVertex <T> > path = new Stack <DVertex <T> >();
            var curr = endVertex;

            while (curr != startVertex)
            {
                path.Push(curr);
                curr = curr.founder;
            }
            path.Push(startVertex);
            while (path.Count > 0)
            {
                Console.WriteLine(path.Peek().item + " " + path.Pop().distance);
            }
        }
コード例 #4
0
        public IEnumerable <DVertex <T> > AStar(DVertex <T> startVertex, DVertex <T> endVertex)
        {
            Queue <DVertex <T> > priorityQueue = new Queue <DVertex <T> >();

            for (int i = 0; i < vertices.Count; i++)
            {
                vertices[i].distance      = float.PositiveInfinity;
                vertices[i].finalDistance = float.PositiveInfinity;
                vertices[i].Visited       = false;
                vertices[i].founder       = null;
            }
            startVertex.distance      = 0;
            startVertex.finalDistance = Mathattan(startVertex, endVertex);
            priorityQueue.Enqueue(startVertex);

            while (priorityQueue.Count > 0)
            {
                var current = priorityQueue.Dequeue();
                current.Visited = true;
                if (current == endVertex)
                {
                    break;
                }

                for (int i = 0; i < current.weightedEdges.Count; i++)
                {
                    var neighbor = current.weightedEdges[i].endVertex;

                    float tentativeDistance = current.distance + current.weightedEdges[i].weight;
                    if (tentativeDistance < neighbor.distance)
                    {
                        neighbor.distance      = tentativeDistance;
                        neighbor.founder       = current;
                        neighbor.Visited       = false;
                        neighbor.finalDistance = neighbor.distance + Mathattan(neighbor, endVertex);
                    }

                    //if not visited and not in queue, add to queue
                    if (!neighbor.Visited && !priorityQueue.Contains(neighbor))
                    {
                        priorityQueue.Enqueue(neighbor);
                    }
                }
            }

            //stack and add end
            Stack <DVertex <T> > path = new Stack <DVertex <T> >();
            var curr = endVertex;

            while (curr.founder != null)
            {
                path.Push(curr);
                curr = curr.founder;
            }
            path.Push(startVertex);
            return(path);
        }
コード例 #5
0
 public void DFS(DVertex <T> vertex, double weight)
 {
     Console.WriteLine(vertex.item + " " + weight);
     vertex.Visited = true;
     for (int i = 0; i < vertex.weightedEdges.Count; i++)
     {
         if (vertex.weightedEdges[i].endVertex.Visited == false)
         {
             weight += vertex.weightedEdges[i].weight;
             DFS(vertex.weightedEdges[i].endVertex, weight);
         }
     }
 }
コード例 #6
0
 public void AddEdge(DVertex <T> vertex1, DVertex <T> vertex2, float weight)
 {
     vertex1.weightedEdges.Add(new WeightedEdge <T>(vertex1, vertex2, weight));
     vertex2.weightedEdges.Add(new WeightedEdge <T>(vertex1, vertex2, weight));
     if (!(vertices.Contains(vertex1)))
     {
         vertices.Add(vertex1);
     }
     if (!(vertices.Contains(vertex2)))
     {
         vertices.Add(vertex2);
     }
 }
コード例 #7
0
        private float Mathattan(DVertex <T> vertex, DVertex <T> endVertex)
        {
            float dx = Math.Abs(vertex.x - endVertex.x);
            float dy = Math.Abs(vertex.y - endVertex.y);
            float D  = float.PositiveInfinity;

            for (int i = 0; i < vertex.weightedEdges.Count; i++)
            {
                if (vertex.weightedEdges[i].weight < D)
                {
                    D = vertex.weightedEdges[i].weight;
                }
            }
            return(D * (dx + dy));
        }
コード例 #8
0
ファイル: WeightedEdge.cs プロジェクト: penlu01/JPanGraphs
 public WeightedEdge(DVertex <T> StartVertex, DVertex <T> EndVertex, float Weight)
 {
     startVertex = StartVertex;
     endVertex   = EndVertex;
     weight      = Weight;
 }
コード例 #9
0
ファイル: Program.cs プロジェクト: penlu01/JPanGraphs
        static void Main(string[] args)
        {
            DirectedGraph <int> graph = new DirectedGraph <int>();

            DVertex <int>[,] vertices = new DVertex <int> [10, 10];
            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    DVertex <int> temp = new DVertex <int>(i, j);
                    vertices[i, j] = temp;
                    if (i < 9 && vertices[i + 1, j] != null)
                    {
                        graph.AddEdge(vertices[i, j], vertices[i + 1, j], 1);
                        graph.AddEdge(vertices[i + 1, j], vertices[i, j], 1);
                    }
                    if (i > 0 && vertices[i - 1, j] != null)
                    {
                        graph.AddEdge(vertices[i, j], vertices[i - 1, j], 1);
                        graph.AddEdge(vertices[i - 1, j], vertices[i, j], 1);
                    }
                    if (j < 9 && vertices[i, j + 1] != null)
                    {
                        graph.AddEdge(vertices[i, j], vertices[i, j + 1], 1);
                        graph.AddEdge(vertices[i, j + 1], vertices[i, j], 1);
                    }
                    if (j > 0 && vertices[i, j - 1] != null)
                    {
                        graph.AddEdge(vertices[i, j], vertices[i, j - 1], 1);
                        graph.AddEdge(vertices[i, j - 1], vertices[i, j], 1);
                    }
                }
            }
            for (int i = 0; i < vertices[0, 9].weightedEdges.Count; i++)
            {
                vertices[0, 9].weightedEdges[i].weight = 2;
            }
            for (int i = 0; i < vertices[1, 8].weightedEdges.Count; i++)
            {
                vertices[1, 8].weightedEdges[i].weight = 2;
            }
            DVertex <int> start = vertices[0, 0];
            DVertex <int> end   = vertices[9, 9];
            IEnumerable <DVertex <int> > path = graph.AStar(start, end);

            #region oldEdges2
            //DirectedGraph<int> tree = new DirectedGraph<int>();
            //Vertex<int> vertex1 = new Vertex<int>(1);
            //Vertex<int> vertex2 = new Vertex<int>(2);
            //Vertex<int> vertex3 = new Vertex<int>(3);
            //Vertex<int> vertex4 = new Vertex<int>(4);
            //Vertex<int> vertex5 = new Vertex<int>(5);
            //Vertex<int> vertex6 = new Vertex<int>(6);
            //Vertex<int> vertex7 = new Vertex<int>(7);
            //Vertex<int> vertex8 = new Vertex<int>(8);
            //tree.AddEdge(vertex1, vertex2, 5);
            //tree.AddEdge(vertex1, vertex3, 3);
            //tree.AddEdge(vertex2, vertex4, 8);
            //tree.AddEdge(vertex2, vertex5, 9);
            //tree.AddEdge(vertex3, vertex6, 2);
            //tree.AddEdge(vertex3, vertex7, 7);
            //tree.AddEdge(vertex5, vertex8, 4);
            //tree.Dijkstra(vertex1, vertex8);
            #endregion
            #region oldEdges
            //tree.AddEdge(vertex1, vertex2, 5);
            //tree.AddEdge(vertex5, vertex1, 3);
            //tree.AddEdge(vertex3, vertex2, 4);
            //tree.AddEdge(vertex7, vertex3, 8);
            //tree.AddEdge(vertex4, vertex7, 2);
            //tree.AddEdge(vertex6, vertex3, 11);
            //tree.AddEdge(vertex3, vertex7, 9);
            //tree.AddEdge(vertex2, vertex4, 1);
            //tree.AddEdge(vertex6, vertex1, 7);
            //tree.AddEdge(vertex6, vertex8, 14);
            //tree.AddEdge(vertex3, vertex1, 6);
            //tree.AddEdge(vertex7, vertex4, 10);
            //tree.AddEdge(vertex3, vertex5, 12);
            //tree.AddEdge(vertex3, vertex6, 13);
            //graph.DFS(vertex1, 0);
            #endregion
            //tree.BFS(vertex1);
            Console.ReadLine();
            #region old stuff
            //    DirectedGraph<int> graph = new DirectedGraph<int>();
            //    string input;
            //    while (true)
            //    {
            //        Console.WriteLine("Insert a vertex in the graph");
            //        input = Console.ReadLine();
            //        if (input.Contains("AddEdge"))
            //        {
            //            Console.WriteLine("Insert an edge in the graph");
            //            var temp = int.Parse(Console.ReadLine());
            //            var temp2 = int.Parse(Console.ReadLine());
            //            int index = 0;
            //            int index2 = 0;
            //            for (int i = 0; i < graph.vertices.Count; i++)
            //            {
            //                if (graph.vertices[i].item == temp)
            //                {
            //                    index = i;
            //                }
            //                if (graph.vertices[i].item == temp2)
            //                {
            //                    index2 = i;
            //                }
            //            }
            //            graph.AddEdge(graph.vertices[index], graph.vertices[index2]);
            //            continue;
            //        }
            //        else if (input.Contains("RemoveVertex"))
            //        {
            //            Console.WriteLine("Delete a vertex from the graph");
            //            graph.RemoveVertex(int.Parse(Console.ReadLine()));
            //            continue;
            //        }
            //        else if (input.Contains("RemoveEdge"))
            //        {
            //            Console.WriteLine("Insert an edge in the graph");
            //            var temp = int.Parse(Console.ReadLine());
            //            var temp2 = int.Parse(Console.ReadLine());
            //            int index = 0;
            //            int index2 = 0;
            //            for (int i = 0; i < graph.vertices.Count; i++)
            //            {
            //                if (graph.vertices[i].item == temp)
            //                {
            //                    index = i;
            //                }
            //                if (graph.vertices[i].item == temp2)
            //                {
            //                    index2 = i;
            //                }
            //            }
            //            graph.RemoveEdge(graph.vertices[index], graph.vertices[index2]);
            //            continue;
            //        }
            //        else if (input.Contains("DFS"))
            //        {
            //            Console.WriteLine("Give a starting point");
            //            Stack<Vertex<int>> stack = new Stack<Vertex<int>>();
            //            var temp = int.Parse(Console.ReadLine());
            //            int index = 0;
            //            for (int i = 0; i < graph.vertices.Count; i++)
            //            {
            //                if (graph.vertices[i].item == temp)
            //                {
            //                    index = i;
            //                }
            //            }
            //            graph.DFS(graph.vertices[index], stack);
            //            continue;
            //        }
            //        else if (input.Contains("BFS"))
            //        {
            //            Console.WriteLine("Give a starting point");
            //            var temp = int.Parse(Console.ReadLine());
            //            int index = 0;
            //            for (int i = 0; i < graph.vertices.Count; i++)
            //            {
            //                if (graph.vertices[i].item == temp)
            //                {
            //                    index = i;
            //                }
            //            }
            //            graph.BFS(graph.vertices[index]);
            //            continue;
            //        }
            //        graph.AddVertex(int.Parse(input));
            //    }
            #endregion
        }