예제 #1
0
        private VrpOperation _GetRestrictedOrdersOperation(
            List <Order> restrictedOrders,
            List <Violation> violations)
        {
            Debug.Assert(restrictedOrders != null);

            SolveRequestData reqData = this.RequestData;

            var newOrders = new List <Order>();

            foreach (Order order in reqData.Orders)
            {
                if (!restrictedOrders.Contains(order))
                {
                    newOrders.Add(order);
                }
            }

            VrpOperation operation = null;

            if (newOrders.Count > 0)
            {
                reqData.Orders = newOrders;
                operation      = CreateOperation(reqData, violations);
            }

            return(operation);
        }
예제 #2
0
        /// <summary>
        /// Processes result.
        /// </summary>
        /// <param name="vrpResult">VRP solve operation result.</param>
        /// <param name="request">Request used for obtaining the response.</param>
        /// <returns>Founded violations.</returns>
        protected virtual List <Violation> ProcessResult(
            VrpResult vrpResult,
            SubmitVrpJobRequest request)
        {
            Debug.Assert(vrpResult != null);
            Debug.Assert(request != null);

            // get violations
            List <Violation> violations = GetViolations(vrpResult);

            VrpOperation nextStep = null;

            if (CanConvertResult(vrpResult.SolveHR))
            {
                if (vrpResult.ResultObjects != null)
                {
                    // convert VRP result
                    IList <RouteResult> routeResults = ConvertResult(vrpResult, request);

                    // check if we need next step
                    nextStep = GetNextStepOperation(routeResults, violations);
                    if (nextStep == null)
                    {
                        SetRouteResults(routeResults); // final step, set results to schedule
                    }
                }
            }
            else if (!_options.FailOnInvalidOrderGeoLocation)
            {
                if (!_HasRestrictedDepots(violations))
                {
                    List <Order> restrictedOrders = _GetRestrictedOrders(violations);
                    if (restrictedOrders.Count > 0)
                    {
                        nextStep = _GetRestrictedOrdersOperation(restrictedOrders, violations);
                    }
                }
            }

            _nextStep = nextStep;

            return(violations);
        }
예제 #3
0
        protected override VrpOperation GetNextStepOperation(
            IList <RouteResult> routeResults,
            List <Violation> violations)
        {
            bool isNextStepRequired = true;

            // check if we need next step
            if (!_hasSrcRoutesNotInTargetRoutes || // target routes include all source routes
                violations.Count == 0 ||           // there are no violations
                _inputParams.KeepViolatedOrdersUnassigned)
            {
                isNextStepRequired = false;
            }

            VrpOperation nextStep = null;

            if (isNextStepRequired)
            {
                nextStep = _CreateNextStepOperation(routeResults, violations);
            }

            return(nextStep);
        }
예제 #4
0
        private VrpOperation _CreateNextStepOperation(
            IList <RouteResult> routeResults,
            IList <Violation> violations)
        {
            // get violated orders
            List <Order> violatedOrders = new List <Order>();

            foreach (Violation violation in violations)
            {
                if (violation.ObjectType == ViolatedObjectType.Order)
                {
                    violatedOrders.Add(violation.AssociatedObject as Order);
                }
            }

            // get routes to update:
            // routes subset from SourceRouts collection where each route
            // has at least one order from VilatedOrders assigned to it
            List <Route> routesToUpdate = _GetRoutesToUpdate(_sourceRoutes,
                                                             violatedOrders);

            VrpOperation nextStep = null;

            if (routesToUpdate.Count > 0)
            {
                // get processed orders:
                // orders that were successfully assigned to their new target routes
                List <Order> processedOrders = new List <Order>();
                foreach (Order order in _unlockedOrdersToAssign)
                {
                    if (!violatedOrders.Contains(order))
                    {
                        processedOrders.Add(order);
                    }
                }

                // get orders assigned to RoutesToUpdate
                List <Order> assignedOrders = _GetAssignedOrders(routesToUpdate);

                // exclude processed orders
                List <Order> ordersToUpdate = new List <Order>();
                foreach (Order order in assignedOrders)
                {
                    if (!processedOrders.Contains(order))
                    {
                        ordersToUpdate.Add(order);
                    }
                }

                if (ordersToUpdate.Count > 0)
                {
                    SolveRequestData reqData = new SolveRequestData();
                    reqData.Routes   = routesToUpdate;
                    reqData.Orders   = ordersToUpdate;
                    reqData.Barriers = _barriers;

                    nextStep = new AssignOrdersStep2(SolverContext, Schedule, reqData,
                                                     _inputParams,
                                                     routeResults,
                                                     violations,
                                                     base.Options);
                }
            }

            return(nextStep);
        }