コード例 #1
0
        public override IOperation Apply()
        {
            ItemList <IItem>      tabuList      = TabuListParameter.ActualValue;
            double                moveQuality   = MoveQualityParameter.ActualValue.Value;
            bool                  useAspiration = UseAspirationCriterion.Value;
            bool                  isTabu        = false;
            PotvinPDRearrangeMove move          = PDRearrangeMoveParameter.ActualValue;

            foreach (IItem tabuMove in tabuList)
            {
                PotvinPDRelocateMoveAttribute attribute = tabuMove as PotvinPDRelocateMoveAttribute;

                if (attribute != null)
                {
                    double distance = 0;
                    if (MoveDistanceParameter.ActualValue != null)
                    {
                        distance = MoveDistanceParameter.ActualValue.Value;
                    }

                    double overload = 0;
                    if (MoveOverloadParameter.ActualValue != null)
                    {
                        overload = MoveOverloadParameter.ActualValue.Value;
                    }

                    double tardiness = 0;
                    if (MoveTardinessParameter.ActualValue != null)
                    {
                        tardiness = MoveTardinessParameter.ActualValue.Value;
                    }

                    IVRPProblemInstance instance = ProblemInstanceParameter.ActualValue;
                    double quality = attribute.Distance * instance.DistanceFactor.Value;

                    IHomogenousCapacitatedProblemInstance cvrp = instance as IHomogenousCapacitatedProblemInstance;
                    if (cvrp != null)
                    {
                        quality += attribute.Overload * cvrp.OverloadPenalty.Value;
                    }

                    ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
                    if (vrptw != null)
                    {
                        quality += attribute.Tardiness * vrptw.TardinessPenalty.Value;
                    }

                    IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance;
                    if (pdp != null)
                    {
                        quality += attribute.PickupViolations * pdp.PickupViolationPenalty.Value;
                    }

                    if (!useAspiration || moveQuality >= quality)
                    {
                        if (attribute.City == move.City && attribute.Tour == move.Tour)
                        {
                            isTabu = true;
                            break;
                        }

                        if (attribute.Distance == distance && attribute.Overload == overload && attribute.Tardiness == tardiness)
                        {
                            isTabu = true;
                            break;
                        }
                    }
                }
            }

            MoveTabuParameter.ActualValue = new BoolValue(isTabu);
            return(base.Apply());
        }
コード例 #2
0
        public override IOperation Apply()
        {
            ItemList <IItem>     tabuList      = TabuListParameter.ActualValue;
            double               moveQuality   = MoveQualityParameter.ActualValue.Value;
            bool                 useAspiration = UseAspirationCriterion.Value;
            bool                 isTabu        = false;
            PotvinTwoOptStarMove move          = TwoOptStarMoveParameter.ActualValue;

            List <int> segmentX1;
            List <int> segmentX2;

            PotvinTwoOptStarMoveMaker.GetSegments(move, out segmentX1, out segmentX2);

            foreach (IItem tabuMove in tabuList)
            {
                PotvinTwoOptStarMoveAttribute attribute = tabuMove as PotvinTwoOptStarMoveAttribute;

                if (attribute != null)
                {
                    double distance = 0;
                    if (MoveDistanceParameter.ActualValue != null)
                    {
                        distance = MoveDistanceParameter.ActualValue.Value;
                    }

                    double overload = 0;
                    if (MoveOverloadParameter.ActualValue != null)
                    {
                        overload = MoveOverloadParameter.ActualValue.Value;
                    }

                    double tardiness = 0;
                    if (MoveTardinessParameter.ActualValue != null)
                    {
                        tardiness = MoveTardinessParameter.ActualValue.Value;
                    }

                    IVRPProblemInstance instance = ProblemInstanceParameter.ActualValue;
                    double quality = attribute.Distance * instance.DistanceFactor.Value;

                    IHomogenousCapacitatedProblemInstance cvrp = instance as IHomogenousCapacitatedProblemInstance;
                    if (cvrp != null)
                    {
                        quality += attribute.Overload * cvrp.OverloadPenalty.Value;
                    }

                    ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
                    if (vrptw != null)
                    {
                        quality += attribute.Tardiness * vrptw.TardinessPenalty.Value;
                    }

                    if (!useAspiration || moveQuality >= quality)
                    {
                        if (attribute.Tour == move.Tour1 && segmentX2.Contains(attribute.City) ||
                            attribute.Tour == move.Tour2 && segmentX1.Contains(attribute.City))
                        {
                            isTabu = true;
                            break;
                        }

                        if (attribute.Distance == distance && attribute.Overload == overload && attribute.Tardiness == tardiness)
                        {
                            isTabu = true;
                            break;
                        }
                    }
                }
            }

            MoveTabuParameter.ActualValue = new BoolValue(isTabu);
            return(base.Apply());
        }
コード例 #3
0
        protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution)
        {
            TourInsertionInfo tourInfo = new TourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)));

            eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
            double originalQuality = eval.Quality;

            IHomogenousCapacitatedProblemInstance cvrpInstance = instance as IHomogenousCapacitatedProblemInstance;
            DoubleArray demand = instance.Demand;

            ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
            DoubleArray dueTime      = vrptw.DueTime;
            DoubleArray readyTime    = vrptw.ReadyTime;
            DoubleArray serviceTimes = vrptw.ServiceTime;

            double time        = 0.0;
            double waitingTime = 0.0;
            double serviceTime = 0.0;
            double tardiness   = 0.0;
            double delivered   = 0.0;
            double overweight  = 0.0;
            double distance    = 0.0;

            double capacity = cvrpInstance.Capacity.Value;

            for (int i = 0; i <= tour.Stops.Count; i++)
            {
                int end = 0;
                if (i < tour.Stops.Count)
                {
                    end = tour.Stops[i];
                }

                delivered += demand[end];
            }

            double spareCapacity = capacity - delivered;

            double tourStartTime = readyTime[0];

            time = tourStartTime;

            //simulate a tour, start and end at depot
            for (int i = 0; i <= tour.Stops.Count; i++)
            {
                int start = 0;
                if (i > 0)
                {
                    start = tour.Stops[i - 1];
                }
                int end = 0;
                if (i < tour.Stops.Count)
                {
                    end = tour.Stops[i];
                }

                //drive there
                double currentDistace = vrptw.GetDistance(start, end, solution);
                time     += currentDistace;
                distance += currentDistace;

                double arrivalTime = time;

                //check if it was serviced on time
                if (time > dueTime[end])
                {
                    tardiness += time - dueTime[end];
                }

                //wait
                double currentWaitingTime = 0.0;
                if (time < readyTime[end])
                {
                    currentWaitingTime = readyTime[end] - time;
                }

                double waitTime = readyTime[end] - time;

                waitingTime += currentWaitingTime;
                time        += currentWaitingTime;

                double spareTime = dueTime[end] - time;

                //service
                double currentServiceTime = serviceTimes[end];
                serviceTime += currentServiceTime;
                time        += currentServiceTime;

                CVRPTWInsertionInfo stopInfo = new CVRPTWInsertionInfo(start, end, spareCapacity, tourStartTime, arrivalTime, time, spareTime, waitTime);
                tourInfo.AddStopInsertionInfo(stopInfo);
            }

            eval.Quality            += instance.FleetUsageFactor.Value;
            eval.Quality            += instance.DistanceFactor.Value * distance;
            eval.Distance           += distance;
            eval.VehicleUtilization += 1;

            if (delivered > capacity)
            {
                overweight = delivered - capacity;
            }

            (eval as CVRPEvaluation).Overload += overweight;
            double tourPenalty = 0;
            double penalty     = overweight * cvrpInstance.OverloadPenalty.Value;

            eval.Penalty += penalty;
            eval.Quality += penalty;
            tourPenalty  += penalty;

            (eval as CVRPTWEvaluation).Tardiness  += tardiness;
            (eval as CVRPTWEvaluation).TravelTime += time;

            penalty          = tardiness * vrptw.TardinessPenalty.Value;
            eval.Penalty    += penalty;
            eval.Quality    += penalty;
            tourPenalty     += penalty;
            eval.Quality    += time * vrptw.TimeFactor.Value;
            tourInfo.Penalty = tourPenalty;
            tourInfo.Quality = eval.Quality - originalQuality;
        }
コード例 #4
0
        protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution)
        {
            TourInsertionInfo tourInfo = new TourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)));

            eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
            double originalQuality = eval.Quality;

            IHomogenousCapacitatedProblemInstance cvrpInstance = instance as IHomogenousCapacitatedProblemInstance;
            DoubleArray demand = instance.Demand;

            ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
            DoubleArray dueTime      = vrptw.DueTime;
            DoubleArray readyTime    = vrptw.ReadyTime;
            DoubleArray serviceTimes = vrptw.ServiceTime;

            IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance;
            IntArray pickupDeliveryLocation       = pdp.PickupDeliveryLocation;

            double capacity = cvrpInstance.Capacity.Value;

            double time        = 0.0;
            double waitingTime = 0.0;
            double serviceTime = 0.0;
            double tardiness   = 0.0;
            double overweight  = 0.0;
            double distance    = 0.0;

            double currentLoad           = 0.0;
            Dictionary <int, bool> stops = new Dictionary <int, bool>();
            int pickupViolations         = 0;

            double tourStartTime = readyTime[0];

            time = tourStartTime;

            //simulate a tour, start and end at depot
            for (int i = 0; i <= tour.Stops.Count; i++)
            {
                int start = 0;
                if (i > 0)
                {
                    start = tour.Stops[i - 1];
                }
                int end = 0;
                if (i < tour.Stops.Count)
                {
                    end = tour.Stops[i];
                }

                //drive there
                double currentDistace = vrptw.GetDistance(start, end, solution);
                time     += currentDistace;
                distance += currentDistace;

                double arrivalTime = time;

                //check if it was serviced on time
                if (time > dueTime[end])
                {
                    tardiness += time - dueTime[end];
                }

                //wait
                double currentWaitingTime = 0.0;
                if (time < readyTime[end])
                {
                    currentWaitingTime = readyTime[end] - time;
                }

                double waitTime = readyTime[end] - time;

                waitingTime += currentWaitingTime;
                time        += currentWaitingTime;

                double spareTime = dueTime[end] - time;

                //service
                double currentServiceTime = serviceTimes[end];
                serviceTime += currentServiceTime;
                time        += currentServiceTime;

                //Pickup / deliver
                double arrivalSpareCapacity = capacity - currentLoad;

                bool validPickupDelivery =
                    validPickupDelivery =
                        ((demand[end] >= 0) ||
                         (stops.ContainsKey(pickupDeliveryLocation[end])));

                if (validPickupDelivery)
                {
                    currentLoad += demand[end];
                }
                else
                {
                    pickupViolations++;
                }

                if (currentLoad > capacity)
                {
                    overweight += currentLoad - capacity;
                }

                double spareCapacity           = capacity - currentLoad;
                CVRPPDTWInsertionInfo stopInfo = new CVRPPDTWInsertionInfo(start, end, spareCapacity, tourStartTime,
                                                                           arrivalTime, time, spareTime, waitTime, new List <int>(stops.Keys), arrivalSpareCapacity);
                tourInfo.AddStopInsertionInfo(stopInfo);

                stops.Add(end, true);
            }

            eval.Quality            += instance.FleetUsageFactor.Value;
            eval.Quality            += instance.DistanceFactor.Value * distance;
            eval.Distance           += distance;
            eval.VehicleUtilization += 1;

            (eval as CVRPEvaluation).Overload += overweight;
            double tourPenalty = 0;
            double penalty     = overweight * cvrpInstance.OverloadPenalty.Value;

            eval.Penalty += penalty;
            eval.Quality += penalty;
            tourPenalty  += penalty;

            (eval as CVRPTWEvaluation).Tardiness  += tardiness;
            (eval as CVRPTWEvaluation).TravelTime += time;

            penalty       = tardiness * vrptw.TardinessPenalty.Value;
            eval.Penalty += penalty;
            eval.Quality += penalty;
            tourPenalty  += penalty;

            (eval as CVRPPDTWEvaluation).PickupViolations += pickupViolations;
            penalty       = pickupViolations * pdp.PickupViolationPenalty.Value;
            eval.Penalty += penalty;
            tourPenalty  += penalty;

            eval.Quality    += penalty;
            eval.Quality    += time * vrptw.TimeFactor.Value;
            tourInfo.Penalty = tourPenalty;
            tourInfo.Quality = eval.Quality - originalQuality;
        }
コード例 #5
0
        protected override void EvaluateTour(VRPEvaluation eval, IVRPProblemInstance instance, Tour tour, IVRPEncoding solution)
        {
            TourInsertionInfo tourInfo = new TourInsertionInfo(solution.GetVehicleAssignment(solution.GetTourIndex(tour)));;

            eval.InsertionInfo.AddTourInsertionInfo(tourInfo);
            double originalQuality = eval.Quality;

            IHomogenousCapacitatedProblemInstance cvrpInstance = instance as IHomogenousCapacitatedProblemInstance;
            DoubleArray demand = instance.Demand;

            double delivered  = 0.0;
            double overweight = 0.0;
            double distance   = 0.0;

            double capacity = cvrpInstance.Capacity.Value;

            for (int i = 0; i <= tour.Stops.Count; i++)
            {
                int end = 0;
                if (i < tour.Stops.Count)
                {
                    end = tour.Stops[i];
                }

                delivered += demand[end];
            }

            double spareCapacity = capacity - delivered;

            //simulate a tour, start and end at depot
            for (int i = 0; i <= tour.Stops.Count; i++)
            {
                int start = 0;
                if (i > 0)
                {
                    start = tour.Stops[i - 1];
                }
                int end = 0;
                if (i < tour.Stops.Count)
                {
                    end = tour.Stops[i];
                }

                //drive there
                double currentDistace = instance.GetDistance(start, end, solution);
                distance += currentDistace;

                CVRPInsertionInfo stopInfo = new CVRPInsertionInfo(start, end, spareCapacity);
                tourInfo.AddStopInsertionInfo(stopInfo);
            }

            eval.Quality += instance.FleetUsageFactor.Value;
            eval.Quality += instance.DistanceFactor.Value * distance;

            eval.Distance           += distance;
            eval.VehicleUtilization += 1;

            if (delivered > capacity)
            {
                overweight = delivered - capacity;
            }

            (eval as CVRPEvaluation).Overload += overweight;
            double penalty = overweight * cvrpInstance.OverloadPenalty.Value;

            eval.Penalty    += penalty;
            eval.Quality    += penalty;
            tourInfo.Penalty = penalty;
            tourInfo.Quality = eval.Quality - originalQuality;
        }