Exemplo n.º 1
0
        ///// <summary>
        ///// Creates a route solution from a list of nodes
        ///// </summary>
        ///// <param name="nodes"></param>
        ///// <returns></returns>
        public RouteSolution CreateRouteSolution(IEnumerable <INode> nodes, DriverNode driverNode)
        {
            var routeSolution = new RouteSolution
            {
                DriverNode = driverNode,
                Nodes      = nodes.ToList()
            };

            var allNodes = routeSolution.AllNodes;

            // calculate route statistics
            for (int i = 0; i < allNodes.Count; i++)
            {
                // create node plan
                var node = allNodes[i];

                // add node trip length
                routeSolution.RouteStatistics += node.LocalRouteStatistics;

                var previousNode = i == 0 ? null : allNodes[i - 1];
                if (previousNode != null)
                {
                    var statistics = CalculateRouteStatistics(previousNode, node);
                    routeSolution.RouteStatistics += statistics;
                }
            }

            return(routeSolution);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Returns true if the given route solution is feasable within time windows and exit criteria
        /// </summary>
        /// <param name="routeSolution"></param>
        /// <returns></returns>
        public bool IsFeasableRouteSolution(RouteSolution routeSolution)
        {
            var driverNode                = routeSolution.DriverNode;
            var currentNodeEndTime        = driverNode.Driver.EarliestStartTime;
            var cumulativeRouteStatistics = new RouteStatistics();
            var allNodes = routeSolution.AllNodes;

            for (int i = 0; i < allNodes.Count - 1; i++)
            {
                var nodeTiming = GetNodeTiming(allNodes[i], allNodes[i + 1], currentNodeEndTime, cumulativeRouteStatistics);

                if (nodeTiming.IsFeasableTimeWindow)
                {
                    // is it a feasable route
                    var lastConnection       = GetNodeConnection(nodeTiming.Node, driverNode);
                    var finalRouteStatistics = nodeTiming.CumulativeRouteStatistics + lastConnection.LocalRouteStatistics;

                    if (_routeExitFunction.ExeedsExitCriteria(finalRouteStatistics, driverNode.Driver))
                    {
                        return(false);
                    }
                }
                else
                {
                    return(false);
                }

                currentNodeEndTime        = nodeTiming.EndTime;
                cumulativeRouteStatistics = nodeTiming.CumulativeRouteStatistics;
            }

            return(true);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Gets the best solution between a new list of <see cref="INode"/> and a current best <see cref="RouteSolution"/>
        /// </summary>
        /// <param name="nodes"></param>
        /// <param name="driverNode"> </param>
        /// <param name="bestSolution"></param>
        /// <returns>the best solution</returns>
        public RouteSolution GetBestFeasableSolution(IList <INode> nodes, DriverNode driverNode, RouteSolution bestSolution)
        {
            // create solution
            var routeSolution = CreateRouteSolution(nodes, driverNode);

            // check feasibility
            if (IsFeasableRouteSolution(routeSolution))
            {
                if (bestSolution != null)
                {
                    routeSolution = GetBestSolution(bestSolution, routeSolution);
                }
            }
            else
            {
                routeSolution = bestSolution;
            }

            return(routeSolution);
        }
Exemplo n.º 4
0
 public RouteSolution GetBestSolution(RouteSolution left, RouteSolution right)
 {
     return(CompareSolutions(left.RouteStatistics, right.RouteStatistics) > 0 ? right : left);
 }