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); }
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); } } } } }
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); } }
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); }
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); } } }
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); } }
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)); }
public WeightedEdge(DVertex <T> StartVertex, DVertex <T> EndVertex, float Weight) { startVertex = StartVertex; endVertex = EndVertex; weight = Weight; }
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 }