protected override PotvinCustomerRelocationMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) { List <PotvinCustomerRelocationMove> result = new List <PotvinCustomerRelocationMove>(); int max = individual.Tours.Count; if (individual.Tours.Count >= problemInstance.Vehicles.Value) { max = max - 1; } for (int i = 0; i < individual.Tours.Count; i++) { for (int j = 0; j < individual.Tours[i].Stops.Count; j++) { for (int k = 0; k <= max; k++) { if (k != i) { PotvinCustomerRelocationMove move = new PotvinCustomerRelocationMove( individual.Tours[i].Stops[j], i, k, individual); result.Add(move); } } } } return(result.ToArray()); }
protected override void EvaluateMove() { PotvinCustomerRelocationMove move = CustomerRelocationMoveParameter.ActualValue; PotvinEncoding newSolution = CustomerRelocationMoveParameter.ActualValue.Individual.Clone() as PotvinEncoding; PotvinCustomerRelocationMoveMaker.Apply(newSolution, move, ProblemInstance); UpdateEvaluation(newSolution); //Apply memory, only if move is worse if (MoveQualityParameter.ActualValue.Value >= QualityParameter.ActualValue.Value) { VariableCollection memory = MemoriesParameter.ActualValue; string key = AdditionFrequencyMemoryKeyParameter.Value.Value; if (memory != null && memory.ContainsKey(key)) { ItemDictionary <PotvinCustomerRelocationMoveAttribute, IntValue> additionFrequency = memory[key].Value as ItemDictionary <PotvinCustomerRelocationMoveAttribute, IntValue>; PotvinCustomerRelocationMoveAttribute attr = new PotvinCustomerRelocationMoveAttribute(0, move.Tour, move.City); if (additionFrequency.ContainsKey(attr)) { int frequency = additionFrequency[attr].Value; double quality = MoveQualityParameter.ActualValue.Value; MoveQualityParameter.ActualValue.Value += LambdaParameter.Value.Value * quality * frequency; } } } }
protected PotvinCustomerRelocationMove(PotvinCustomerRelocationMove original, Cloner cloner) : base(original, cloner) { this.City = original.City; this.OldTour = original.OldTour; this.Tour = original.Tour; this.Individual = cloner.Clone(Individual) as PotvinEncoding; }
protected override IItem GetTabuAttribute(bool maximization, double quality, double moveQuality) { PotvinCustomerRelocationMove move = CustomerRelocationMoveParameter.ActualValue; double baseQuality = moveQuality; //if (quality < moveQuality) baseQuality = quality; // we make an uphill move, the lower bound is the solution quality return(new PotvinCustomerRelocationMoveAttribute(baseQuality, move.OldTour, move.City)); }
protected override PotvinCustomerRelocationMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) { List <PotvinCustomerRelocationMove> result = new List <PotvinCustomerRelocationMove>(); PotvinCustomerRelocationMove move = Apply(individual, ProblemInstance, RandomParameter.ActualValue); if (move != null) { result.Add(move); } return(result.ToArray()); }
public static void Apply(PotvinEncoding solution, PotvinCustomerRelocationMove move, IVRPProblemInstance problemInstance) { if (move.Tour >= solution.Tours.Count) solution.Tours.Add(new Tour()); Tour tour = solution.Tours[move.Tour]; Tour oldTour = solution.Tours.Find(t => t.Stops.Contains(move.City)); oldTour.Stops.Remove(move.City); /*if (oldTour.Stops.Count == 0) solution.Tours.Remove(oldTour);*/ int place = solution.FindBestInsertionPlace(tour, move.City); tour.Stops.Insert(place, move.City); solution.Repair(); }
public static void Apply(PotvinEncoding solution, PotvinCustomerRelocationMove move, IVRPProblemInstance problemInstance) { if (move.Tour >= solution.Tours.Count) { solution.Tours.Add(new Tour()); } Tour tour = solution.Tours[move.Tour]; Tour oldTour = solution.Tours.Find(t => t.Stops.Contains(move.City)); oldTour.Stops.Remove(move.City); /*if (oldTour.Stops.Count == 0) * solution.Tours.Remove(oldTour);*/ int place = solution.FindBestInsertionPlace(tour, move.City); tour.Stops.Insert(place, move.City); solution.Repair(); }
protected override PotvinCustomerRelocationMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) { List<PotvinCustomerRelocationMove> result = new List<PotvinCustomerRelocationMove>(); int max = individual.Tours.Count; if (individual.Tours.Count >= problemInstance.Vehicles.Value) max = max - 1; for (int i = 0; i < individual.Tours.Count; i++) { for (int j = 0; j < individual.Tours[i].Stops.Count; j++) { for (int k = 0; k <= max; k++) { if (k != i) { PotvinCustomerRelocationMove move = new PotvinCustomerRelocationMove( individual.Tours[i].Stops[j], i, k, individual); result.Add(move); } } } } return result.ToArray(); }
protected override void PerformMove() { PotvinCustomerRelocationMove move = CustomerRelocationMoveParameter.ActualValue; PotvinEncoding newSolution = move.Individual.Clone() as PotvinEncoding; Apply(newSolution, move, ProblemInstance); newSolution.Repair(); VRPToursParameter.ActualValue = newSolution; //reset move quality VRPEvaluation eval = ProblemInstance.Evaluate(newSolution); MoveQualityParameter.ActualValue.Value = eval.Quality; //update memory VariableCollection memory = MemoriesParameter.ActualValue; string key = AdditionFrequencyMemoryKeyParameter.Value.Value; if (memory != null) { if (!memory.ContainsKey(key)) { memory.Add(new Variable(key, new ItemDictionary <PotvinCustomerRelocationMoveAttribute, IntValue>())); } ItemDictionary <PotvinCustomerRelocationMoveAttribute, IntValue> additionFrequency = memory[key].Value as ItemDictionary <PotvinCustomerRelocationMoveAttribute, IntValue>; PotvinCustomerRelocationMoveAttribute attr = new PotvinCustomerRelocationMoveAttribute(0, move.Tour, move.City); if (!additionFrequency.ContainsKey(attr)) { additionFrequency[attr] = new IntValue(0); } additionFrequency[attr].Value++; } }
public override IOperation Apply() { ItemList <IItem> tabuList = TabuListParameter.ActualValue; double moveQuality = MoveQualityParameter.ActualValue.Value; bool useAspiration = UseAspirationCriterion.Value; bool isTabu = false; PotvinCustomerRelocationMove move = CustomerRelocationMoveParameter.ActualValue; foreach (var attribute in tabuList.OfType <PotvinCustomerRelocationMoveAttribute>()) { if (!useAspiration || moveQuality >= attribute.MoveQuality) { if (attribute.City == move.City && attribute.Tour == move.Tour) { isTabu = true; break; } } } MoveTabuParameter.ActualValue = new BoolValue(isTabu); return(base.Apply()); }