private static void GoFindWay(SlingshotContext context, Node Start, Node End) { var queue = new List <Node>(); queue.Add(Start); Start.Distance = 0; do { queue.OrderBy(x => x.Distance).ToList(); var node = queue.First(); queue.Remove(node); foreach (var connectedNode in node.GetConnections(context)) { var childNode = connectedNode.Target; if (childNode.Visited) { continue; } if (childNode.Distance == null || node.Distance + connectedNode.Cost < childNode.Distance) { childNode.Distance = node.Distance + connectedNode.Cost; childNode.NearestToStart = node; } if (!queue.Contains(childNode)) { queue.Add(childNode); } } node.Visited = true; if (node == End) { return; } } while (queue.Any()); }
private static void InsertDataIntoDatabase(SlingshotContext context, IList <Node> nodes, IList <Edge> edges) { foreach (var node in nodes) { if (context.Nodes.Where(n => n.Id == node.Id).FirstOrDefault() == null) { context.Nodes.Add(node); } } foreach (var edge in edges) { if (context.Edges.Where(e => e.Id == edge.Id).FirstOrDefault() == null) { edge.Cost = edge.GetCost(); context.Edges.Add(edge); } } try { context.SaveChanges(); } catch (Exception ex) { Console.WriteLine(ex.Message); } }
public static List <Node> GetShortestPathDijkstra(Node Start, Node End, SlingshotContext context) { GoFindWay(context, Start, End); var shortestPath = new List <Node>(); shortestPath.Add(End); BuildShortestPath(shortestPath, End); shortestPath.Reverse(); return(shortestPath); }
static void Main(string[] args) { var context = new SlingshotContext(); string json; using (StreamReader r = new StreamReader("../../../BasicJSON.json")) { json = r.ReadToEnd(); } var obj = JObject.Parse(json); var nodes = GetAllNodes(obj); var edges = GetAllEdges(obj, nodes); if (nodes.Count > 0 && edges.Count > 0) { Console.WriteLine("Nodes and edges red from JSON file successefully!"); } else { Console.WriteLine("Problem accured while reading JSON file. Nodes or edges empty!"); } InsertDataIntoDatabase(context, nodes, edges); Console.WriteLine("Please enter the ID of PointA:"); var idA = Console.ReadLine(); var nodeA = context.Nodes.Where(n => n.Id == idA).FirstOrDefault(); while (nodeA == null) { Console.WriteLine("Please enter the correct ID of PointA:"); idA = Console.ReadLine(); nodeA = context.Nodes.Where(n => n.Id == idA).FirstOrDefault(); } Console.WriteLine("Please enter the ID of PointB:"); var idB = Console.ReadLine(); var nodeB = context.Nodes.Where(n => n.Id == idB).FirstOrDefault(); while (nodeB == null) { Console.WriteLine("Please enter the correct ID of PointB:"); idB = Console.ReadLine(); nodeB = context.Nodes.Where(n => n.Id == idB).FirstOrDefault(); } var path = GetShortestPathDijkstra(nodeA, nodeB, context); PrintPath(path); Console.WriteLine("Press enter for finish!"); Console.ReadLine(); }
public IList <Edge> GetConnections(SlingshotContext context) => context.Edges.Where(s => s.Source == this).OrderBy(s => s.Cost).ToList();