public static void Apply(AlbaEncoding solution, int maxIterations,
                                 int lambda, int samples, IRandom random, IVRPProblemInstance problemInstance, ref double quality, out int evaluatedSolutions)
        {
            evaluatedSolutions = 0;

            for (int i = 0; i < maxIterations; i++)
            {
                AlbaLambdaInterchangeMove bestMove = null;
                foreach (AlbaLambdaInterchangeMove move in AlbaStochasticLambdaInterchangeMultiMoveGenerator.GenerateAllMoves(solution, problemInstance, lambda, samples, random))
                {
                    AlbaEncoding newSolution = solution.Clone() as AlbaEncoding;
                    AlbaLambdaInterchangeMoveMaker.Apply(newSolution, move);
                    double moveQuality =
                        problemInstance.Evaluate(newSolution).Quality;

                    evaluatedSolutions++;
                    if (moveQuality < quality || quality == -1)
                    {
                        quality  = moveQuality;
                        bestMove = move;
                    }
                }
                if (bestMove != null)
                {
                    AlbaLambdaInterchangeMoveMaker.Apply(solution, bestMove);
                }
            }
        }
        public override IOperation Apply()
        {
            IVRPProblemInstance      problemInstance = ProblemInstanceParameter.ActualValue;
            ItemArray <IVRPEncoding> solutions       = VRPToursParameter.ActualValue;
            ResultCollection         results         = ResultsParameter.ActualValue;

            ItemArray <DoubleValue> qualities        = QualityParameter.ActualValue;
            ItemArray <IntValue>    pickupViolations = PickupViolationsParameter.ActualValue;

            int i = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;

            IVRPEncoding best     = solutions[i] as IVRPEncoding;
            VRPSolution  solution = BestSolutionParameter.ActualValue;

            if (solution != null)
            {
                if (!results.ContainsKey("Best VRP Solution PickupViolations"))
                {
                    results.Add(new Result("Best VRP Solution PickupViolations", new DoubleValue(pickupViolations[i].Value)));
                }
                else
                {
                    VRPEvaluation eval = problemInstance.Evaluate(solution.Solution);
                    if (qualities[i].Value <= eval.Quality)
                    {
                        (results["Best VRP Solution PickupViolations"].Value as DoubleValue).Value = pickupViolations[i].Value;
                    }
                }
            }

            return(base.Apply());
        }
        public override IOperation Apply()
        {
            IVRPProblemInstance      problemInstance = ProblemInstanceParameter.ActualValue;
            ItemArray <IVRPEncoding> solutions       = VRPToursParameter.ActualValue;
            ResultCollection         results         = ResultsParameter.ActualValue;

            ItemArray <DoubleValue> qualities            = QualityParameter.ActualValue;
            ItemArray <DoubleValue> distances            = DistanceParameter.ActualValue;
            ItemArray <DoubleValue> vehiclesUtilizations = VehiclesUtilizedParameter.ActualValue;

            int          i        = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
            IVRPEncoding best     = solutions[i].Clone() as IVRPEncoding;
            VRPSolution  solution = BestSolutionParameter.ActualValue;

            if (solution == null)
            {
                solution = new VRPSolution(problemInstance, best.Clone() as IVRPEncoding, new DoubleValue(qualities[i].Value));
                BestSolutionParameter.ActualValue = solution;
                results.Add(new Result("Best VRP Solution", solution));

                results.Add(new Result("Best VRP Solution Distance", new DoubleValue(distances[i].Value)));
                results.Add(new Result("Best VRP Solution VehicleUtilization", new DoubleValue(vehiclesUtilizations[i].Value)));
            }
            else
            {
                VRPEvaluation eval = problemInstance.Evaluate(solution.Solution);
                if (qualities[i].Value <= eval.Quality)
                {
                    solution.ProblemInstance = problemInstance;
                    solution.Solution        = best.Clone() as IVRPEncoding;
                    solution.Quality.Value   = qualities[i].Value;
                    (results["Best VRP Solution Distance"].Value as DoubleValue).Value           = distances[i].Value;
                    (results["Best VRP Solution VehicleUtilization"].Value as DoubleValue).Value = vehiclesUtilizations[i].Value;
                }
            }

            var idx = qualities.Select((x, index) => new { index, x.Value }).Where(index => problemInstance.Feasible(solutions[index.index])).OrderBy(x => x.Value).FirstOrDefault();

            if (idx != null)
            {
                int          j             = idx.index;
                IVRPEncoding bestFeasible  = solutions[j].Clone() as IVRPEncoding;
                VRPSolution  validSolution = BestValidSolutionParameter.ActualValue;
                if (validSolution == null)
                {
                    validSolution = new VRPSolution(problemInstance, best.Clone() as IVRPEncoding, new DoubleValue(qualities[j].Value));
                    BestValidSolutionParameter.ActualValue = validSolution;
                    if (results.ContainsKey("Best valid VRP Solution"))
                    {
                        results["Best valid VRP Solution"].Value = validSolution;
                    }
                    else
                    {
                        results.Add(new Result("Best valid VRP Solution", validSolution));
                    }

                    results.Add(new Result("Best valid VRP Solution Distance", new DoubleValue(distances[j].Value)));
                    results.Add(new Result("Best valid VRP Solution VehicleUtilization", new DoubleValue(vehiclesUtilizations[j].Value)));
                }
                else
                {
                    if (qualities[j].Value <= validSolution.Quality.Value)
                    {
                        if (ProblemInstanceParameter.ActualValue.Feasible(best))
                        {
                            validSolution.ProblemInstance = problemInstance;
                            validSolution.Solution        = best.Clone() as IVRPEncoding;
                            validSolution.Quality.Value   = qualities[j].Value;
                            (results["Best valid VRP Solution Distance"].Value as DoubleValue).Value           = distances[j].Value;
                            (results["Best valid VRP Solution VehicleUtilization"].Value as DoubleValue).Value = vehiclesUtilizations[j].Value;
                        }
                    }
                }

                DoubleValue bestKnownQuality = BestKnownQualityParameter.ActualValue;
                if (bestKnownQuality == null || qualities[j].Value < bestKnownQuality.Value)
                {
                    BestKnownQualityParameter.ActualValue  = new DoubleValue(qualities[j].Value);
                    BestKnownSolutionParameter.ActualValue = (VRPSolution)validSolution.Clone();
                }
            }

            return(base.Apply());
        }
Esempio n. 4
0
    public static ItemArray<IItem> Apply(PotvinEncoding initiator, PotvinEncoding guide, PercentValue n, int sampleSize, int iterations, IRandom rand, IVRPProblemInstance problemInstance) {
      if (initiator == null || guide == null)
        throw new ArgumentException("Cannot relink path because one of the provided solutions or both are null.");

      double sigma = 1.5;
      double minPenalty = 0.001;
      double maxPenalty = 1000000000;

      var originalOverloadPenalty = new DoubleValue();
      if (problemInstance is IHomogenousCapacitatedProblemInstance)
        originalOverloadPenalty.Value = (problemInstance as IHomogenousCapacitatedProblemInstance).OverloadPenalty.Value;
      var originalTardinessPenalty = new DoubleValue();
      if (problemInstance is ITimeWindowedProblemInstance)
        originalTardinessPenalty.Value = (problemInstance as ITimeWindowedProblemInstance).TardinessPenalty.Value;

      PotvinEncoding current = MatchTours(initiator, guide, problemInstance);
      double currentSimilarity = VRPSimilarityCalculator.CalculateSimilarity(current, guide);

      IList<PotvinEncoding> solutions = new List<PotvinEncoding>();
      int i = 0;
      while (i < iterations && !currentSimilarity.IsAlmost(1.0)) {
        var currentEval = problemInstance.Evaluate(current);
        currentSimilarity = VRPSimilarityCalculator.CalculateSimilarity(current, guide);

        if (currentSimilarity < 1.0) {
          for (int sample = 0; sample < sampleSize; sample++) {
            var next = current.Clone() as PotvinEncoding;

            int neighborhood = rand.Next(3);
            switch (neighborhood) {
              case 0: next = RouteBasedXOver(next, guide, rand,
                problemInstance);
                break;
              case 1: next = SequenceBasedXOver(next, guide, rand,
                problemInstance);
                break;
              case 2: GuidedRelocateMove(next, guide, rand);
                break;
            }

            next = MatchTours(next, guide, problemInstance);

            var nextEval = problemInstance.Evaluate(next);
            if ((nextEval.Quality < currentEval.Quality)) {
              current = next;
              solutions.Add(current);
              break;
            }
          }

          if (problemInstance is IHomogenousCapacitatedProblemInstance) {
            if (((CVRPEvaluation)currentEval).Overload > 0) {
              (problemInstance as IHomogenousCapacitatedProblemInstance).OverloadPenalty.Value =
                Math.Min(maxPenalty,
                (problemInstance as IHomogenousCapacitatedProblemInstance).OverloadPenalty.Value * sigma);
            } else {
              (problemInstance as IHomogenousCapacitatedProblemInstance).OverloadPenalty.Value =
                Math.Max(minPenalty,
                (problemInstance as IHomogenousCapacitatedProblemInstance).OverloadPenalty.Value * sigma);
            }
          }


          if (problemInstance is ITimeWindowedProblemInstance) {
            if (((CVRPTWEvaluation)currentEval).Tardiness > 0) {
              (problemInstance as ITimeWindowedProblemInstance).TardinessPenalty.Value =
                Math.Min(maxPenalty,
              (problemInstance as ITimeWindowedProblemInstance).TardinessPenalty.Value * sigma);
            } else {
              (problemInstance as ITimeWindowedProblemInstance).TardinessPenalty.Value =
                Math.Max(minPenalty,
                (problemInstance as ITimeWindowedProblemInstance).TardinessPenalty.Value / sigma);
            }
          }

          i++;
        }
      }

      if (problemInstance is IHomogenousCapacitatedProblemInstance)
        (problemInstance as IHomogenousCapacitatedProblemInstance).OverloadPenalty.Value = originalOverloadPenalty.Value;
      if (problemInstance is ITimeWindowedProblemInstance)
        (problemInstance as ITimeWindowedProblemInstance).TardinessPenalty.Value = originalTardinessPenalty.Value;

      return new ItemArray<IItem>(ChooseSelection(solutions, n));
    }
Esempio n. 5
0
        public static ItemArray <IItem> Apply(PotvinEncoding initiator, PotvinEncoding guide, PercentValue n, int sampleSize, int iterations, IRandom rand, IVRPProblemInstance problemInstance)
        {
            if (initiator == null || guide == null)
            {
                throw new ArgumentException("Cannot relink path because one of the provided solutions or both are null.");
            }

            double sigma      = 1.5;
            double minPenalty = 0.001;
            double maxPenalty = 1000000000;

            var originalOverloadPenalty = new DoubleValue();

            if (problemInstance is IHomogenousCapacitatedProblemInstance)
            {
                originalOverloadPenalty.Value = (problemInstance as IHomogenousCapacitatedProblemInstance).OverloadPenalty.Value;
            }
            var originalTardinessPenalty = new DoubleValue();

            if (problemInstance is ITimeWindowedProblemInstance)
            {
                originalTardinessPenalty.Value = (problemInstance as ITimeWindowedProblemInstance).TardinessPenalty.Value;
            }

            PotvinEncoding current           = MatchTours(initiator, guide, problemInstance);
            double         currentSimilarity = VRPSimilarityCalculator.CalculateSimilarity(current, guide);

            IList <PotvinEncoding> solutions = new List <PotvinEncoding>();
            int i = 0;

            while (i < iterations && !currentSimilarity.IsAlmost(1.0))
            {
                var currentEval = problemInstance.Evaluate(current);
                currentSimilarity = VRPSimilarityCalculator.CalculateSimilarity(current, guide);

                if (currentSimilarity < 1.0)
                {
                    for (int sample = 0; sample < sampleSize; sample++)
                    {
                        var next = current.Clone() as PotvinEncoding;

                        int neighborhood = rand.Next(3);
                        switch (neighborhood)
                        {
                        case 0: next = RouteBasedXOver(next, guide, rand,
                                                       problemInstance);
                            break;

                        case 1: next = SequenceBasedXOver(next, guide, rand,
                                                          problemInstance);
                            break;

                        case 2: GuidedRelocateMove(next, guide, rand);
                            break;
                        }

                        next = MatchTours(next, guide, problemInstance);

                        var nextEval = problemInstance.Evaluate(next);
                        if ((nextEval.Quality < currentEval.Quality))
                        {
                            current = next;
                            solutions.Add(current);
                            break;
                        }
                    }

                    if (problemInstance is IHomogenousCapacitatedProblemInstance)
                    {
                        if (((CVRPEvaluation)currentEval).Overload > 0)
                        {
                            (problemInstance as IHomogenousCapacitatedProblemInstance).OverloadPenalty.Value =
                                Math.Min(maxPenalty,
                                         (problemInstance as IHomogenousCapacitatedProblemInstance).OverloadPenalty.Value * sigma);
                        }
                        else
                        {
                            (problemInstance as IHomogenousCapacitatedProblemInstance).OverloadPenalty.Value =
                                Math.Max(minPenalty,
                                         (problemInstance as IHomogenousCapacitatedProblemInstance).OverloadPenalty.Value * sigma);
                        }
                    }


                    if (problemInstance is ITimeWindowedProblemInstance)
                    {
                        if (((CVRPTWEvaluation)currentEval).Tardiness > 0)
                        {
                            (problemInstance as ITimeWindowedProblemInstance).TardinessPenalty.Value =
                                Math.Min(maxPenalty,
                                         (problemInstance as ITimeWindowedProblemInstance).TardinessPenalty.Value * sigma);
                        }
                        else
                        {
                            (problemInstance as ITimeWindowedProblemInstance).TardinessPenalty.Value =
                                Math.Max(minPenalty,
                                         (problemInstance as ITimeWindowedProblemInstance).TardinessPenalty.Value / sigma);
                        }
                    }

                    i++;
                }
            }

            if (problemInstance is IHomogenousCapacitatedProblemInstance)
            {
                (problemInstance as IHomogenousCapacitatedProblemInstance).OverloadPenalty.Value = originalOverloadPenalty.Value;
            }
            if (problemInstance is ITimeWindowedProblemInstance)
            {
                (problemInstance as ITimeWindowedProblemInstance).TardinessPenalty.Value = originalTardinessPenalty.Value;
            }

            return(new ItemArray <IItem>(ChooseSelection(solutions, n)));
        }
    public static void Apply(AlbaEncoding solution, int maxIterations,
      int lambda, int samples, IRandom random, IVRPProblemInstance problemInstance, ref double quality, out int evaluatedSolutions) {
      evaluatedSolutions = 0;

      for (int i = 0; i < maxIterations; i++) {
        AlbaLambdaInterchangeMove bestMove = null;
        foreach (AlbaLambdaInterchangeMove move in AlbaStochasticLambdaInterchangeMultiMoveGenerator.GenerateAllMoves(solution, problemInstance, lambda, samples, random)) {
          AlbaEncoding newSolution = solution.Clone() as AlbaEncoding;
          AlbaLambdaInterchangeMoveMaker.Apply(newSolution, move);
          double moveQuality =
            problemInstance.Evaluate(newSolution).Quality;

          evaluatedSolutions++;
          if (moveQuality < quality || quality == -1) {
            quality = moveQuality;
            bestMove = move;
          }
        }
        if (bestMove != null)
          AlbaLambdaInterchangeMoveMaker.Apply(solution, bestMove);
      }
    }