Пример #1
0
        public static void Apply(PotvinEncoding solution, PotvinPDRearrangeMove move, IVRPProblemInstance problemInstance)
        {
            Tour tour     = solution.Tours[move.Tour];
            int  position = tour.Stops.IndexOf(move.City);

            IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance;

            if (pdp != null)
            {
                int  location  = pdp.GetPickupDeliveryLocation(move.City);
                Tour tour2     = solution.Tours.Find(t => t.Stops.Contains(location));
                int  position2 = tour2.Stops.IndexOf(location);

                tour.Stops.Remove(move.City);
                tour2.Stops.Remove(location);

                solution.InsertPair(tour, move.City, location, problemInstance, position, position2);
            }
            else
            {
                tour.Stops.Remove(move.City);
                int place = solution.FindBestInsertionPlace(tour, move.City, position);
                tour.Stops.Insert(place, move.City);
            }

            solution.Repair();
        }
    protected PotvinPDRearrangeMove(PotvinPDRearrangeMove original, Cloner cloner)
      : base(original, cloner) {
      this.City = original.City;
      this.Tour = original.Tour;

      this.Individual = cloner.Clone(Individual) as PotvinEncoding;
    }
        protected PotvinPDRearrangeMove(PotvinPDRearrangeMove original, Cloner cloner)
            : base(original, cloner)
        {
            this.City = original.City;
            this.Tour = original.Tour;

            this.Individual = cloner.Clone(Individual) as PotvinEncoding;
        }
Пример #4
0
        protected override void PerformMove()
        {
            PotvinPDRearrangeMove move = PDRearrangeMoveParameter.ActualValue;

            PotvinEncoding newSolution = move.Individual.Clone() as PotvinEncoding;

            Apply(newSolution, move, ProblemInstance);
            VRPToursParameter.ActualValue = newSolution;
        }
        protected override void EvaluateMove()
        {
            PotvinPDRearrangeMove move = PDRearrangeMoveParameter.ActualValue;

            PotvinEncoding newSolution = PDRearrangeMoveParameter.ActualValue.Individual.Clone() as PotvinEncoding;

            PotvinPDRearrangeMoveMaker.Apply(newSolution, move, ProblemInstance);

            UpdateEvaluation(newSolution);
        }
Пример #6
0
        protected override PotvinPDRearrangeMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance)
        {
            List <PotvinPDRearrangeMove> result = new List <PotvinPDRearrangeMove>();

            PotvinPDRearrangeMove move = Apply(individual, ProblemInstance, RandomParameter.ActualValue);

            if (move != null)
            {
                result.Add(move);
            }

            return(result.ToArray());
        }
    public static void Apply(PotvinEncoding solution, PotvinPDRearrangeMove move, IVRPProblemInstance problemInstance) {
      Tour tour = solution.Tours[move.Tour];
      int position = tour.Stops.IndexOf(move.City);

      IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance;
      if (pdp != null) {
        int location = pdp.GetPickupDeliveryLocation(move.City);
        Tour tour2 = solution.Tours.Find(t => t.Stops.Contains(location));
        int position2 = tour2.Stops.IndexOf(location);

        tour.Stops.Remove(move.City);
        tour2.Stops.Remove(location);

        solution.InsertPair(tour, move.City, location, problemInstance, position, position2);
      } else {
        tour.Stops.Remove(move.City);
        int place = solution.FindBestInsertionPlace(tour, move.City, position);
        tour.Stops.Insert(place, move.City);
      }

      solution.Repair();
    }
Пример #8
0
        protected override IItem GetTabuAttribute(bool maximization, double quality, double moveQuality)
        {
            PotvinPDRearrangeMove move = PDRearrangeMoveParameter.ActualValue;
            double baseQuality         = moveQuality;

            if (quality < moveQuality)
            {
                baseQuality = quality;                  // we make an uphill move, the lower bound is the solution quality
            }
            double distance = 0;

            if (DistanceParameter.ActualValue != null)
            {
                distance = DistanceParameter.ActualValue.Value;
            }

            double overload = 0;

            if (OverloadParameter.ActualValue != null)
            {
                overload = OverloadParameter.ActualValue.Value;
            }

            double tardiness = 0;

            if (TardinessParameter.ActualValue != null)
            {
                tardiness = TardinessParameter.ActualValue.Value;
            }

            int pickupViolations = 0;

            if (PickupViolationsParameter.ActualValue != null)
            {
                pickupViolations = PickupViolationsParameter.ActualValue.Value;
            }

            return(new PotvinPDRelocateMoveAttribute(baseQuality, move.Tour, move.City, distance, overload, tardiness, pickupViolations));
        }
        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());
        }