Esempio n. 1
0
        public Node[] FindShortestPath(Node @from, Node to)
        {
            var control = new VisitingData();

            control.UpdateWeight(@from, new Weight(null, 0));
            control.ScheduleVisitTo(@from);

            while (control.HasScheduledVisits)
            {
                var visitingNode       = control.GetNodeToVisit();
                var visitingNodeWeight = control.QueryWeight(visitingNode);
                control.RegisterVisitTo(visitingNode);

                foreach (var neighborhoodInfo in visitingNode.Neighbors)
                {
                    if (!control.WasVisited(neighborhoodInfo.Node))
                    {
                        control.ScheduleVisitTo(neighborhoodInfo.Node);
                    }

                    var neighborWeight = control.QueryWeight(neighborhoodInfo.Node);

                    var probableWeight = (visitingNodeWeight.Value + neighborhoodInfo.WeightToNode);
                    if (neighborWeight.Value > probableWeight)
                    {
                        control.UpdateWeight(neighborhoodInfo.Node, new Weight(visitingNode, probableWeight));
                    }
                }
            }

            return(control.HasComputedPathToOrigin(to)
                ? control.ComputedPathToOrigin(to).Reverse().ToArray()
                : null);
        }
Esempio n. 2
0
        public static RouteResult BestRouteProcess(Route origin, Route destination)
        {
            var control = new VisitingData();

            control.UpdateFlightPrice(origin, new RouteCost(null, 0));
            control.ScheduleVisitTo(origin);

            while (control.HasScheduledVisits)
            {
                var visitingRoute       = control.GetRouteToVisit();
                var visitingFlightPrice = control.FlightPrice(visitingRoute);
                control.RegisterVisitTo(visitingRoute);

                foreach (var connectionInfo in visitingRoute.Connections)
                {
                    if (!control.WasVisited(connectionInfo.Airport))
                    {
                        control.ScheduleVisitTo(connectionInfo.Airport);
                    }

                    var connectionCost = control.FlightPrice(connectionInfo.Airport);

                    var probablePrice = (visitingFlightPrice.Price + connectionInfo.Price);
                    if (connectionCost.Price > probablePrice)
                    {
                        control.UpdateFlightPrice(connectionInfo.Airport, new RouteCost(visitingRoute, probablePrice));
                    }
                }
            }

            RouteResult result = new RouteResult();

            var cost = control.FlightPrice(destination);

            result.TotalCost = cost.Price;
            result.Routes    = cost.From == null ? null : control.GetEntireRoute(destination).Reverse().ToList();

            return(result);
        }