コード例 #1
0
 protected PotvinPDRelocateMoveAttribute(PotvinPDRelocateMoveAttribute original, Cloner cloner)
   : base(original, cloner) {
   this.Tour = original.Tour;
   this.City = original.City;
   this.Distance = original.Distance;
   this.Overload = original.Overload;
   this.Tardiness = original.Tardiness;
   this.PickupViolations = original.PickupViolations;
 }
コード例 #2
0
 protected PotvinPDRelocateMoveAttribute(PotvinPDRelocateMoveAttribute original, Cloner cloner)
     : base(original, cloner)
 {
     this.Tour             = original.Tour;
     this.City             = original.City;
     this.Distance         = original.Distance;
     this.Overload         = original.Overload;
     this.Tardiness        = original.Tardiness;
     this.PickupViolations = original.PickupViolations;
 }
コード例 #3
0
        public override bool Equals(object obj)
        {
            if (obj is PotvinPDRelocateMoveAttribute)
            {
                PotvinPDRelocateMoveAttribute other = obj as PotvinPDRelocateMoveAttribute;

                return(Tour == other.Tour && City == other.City);
            }
            else
            {
                return(base.Equals(obj));
            }
        }
コード例 #4
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());
        }