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();
        }
Example #5
0
 public IList <Edge> GetConnections(SlingshotContext context) => context.Edges.Where(s => s.Source == this).OrderBy(s => s.Cost).ToList();