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;
    }
Example #4
0
        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 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;
        }
Example #6
0
        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++;
            }
        }
Example #11
0
        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());
        }