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; }
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); }
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(); }
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()); }