///// <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); }
/// <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); }
/// <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); }
public RouteSolution GetBestSolution(RouteSolution left, RouteSolution right) { return(CompareSolutions(left.RouteStatistics, right.RouteStatistics) > 0 ? right : left); }