Пример #1
0
        private void CleanupTour(List <int> actualTour, DistanceMatrix distances, double maxDistance, double pointVisitingCosts)
        {
            // Sort the points on the tour according to their costs savings when removed
            var distanceSavings = (
                from removePosition in Enumerable.Range(1, actualTour.Count - 2)
                let saving = distances.CalculateRemovementSaving(actualTour, removePosition, pointVisitingCosts)
                             orderby saving descending
                             select new SavingInfo {
                Index = removePosition, Saving = saving
            }
                ).ToList();

            double tourLength = distances.CalculateTourLength(actualTour, pointVisitingCosts);

            // As long as the created path is infeasible, remove elements
            while (tourLength > maxDistance)
            {
                // Remove the point that frees the largest distance
                // Note, distance savings are not updated after removal
                tourLength -= distances.CalculateRemovementSaving(actualTour, distanceSavings[0].Index, pointVisitingCosts);
                actualTour.RemoveAt(distanceSavings[0].Index);

                // Shift indices due to removal of a point in the tour
                for (int i = 1; i < distanceSavings.Count; i++)
                {
                    if (distanceSavings[i].Index > distanceSavings[0].Index)
                    {
                        distanceSavings[i].Index--;
                    }
                }
                distanceSavings.RemoveAt(0);
            }
        }
Пример #2
0
        public static OrienteeringEvaluationResult Apply(IntegerVector solution, DoubleArray scores,
                                                         DistanceMatrix distances, double maximumDistance, double pointVisitingCosts, double distancePenaltyFactor)
        {
            double score    = solution.Sum(t => scores[t]);
            double distance = distances.CalculateTourLength(solution.ToList(), pointVisitingCosts);

            double distanceViolation = distance - maximumDistance;

            double penalty = 0.0;

            penalty += distanceViolation > 0 ? distanceViolation * distancePenaltyFactor : 0;

            double quality = score - penalty;

            return(new OrienteeringEvaluationResult {
                Quality = new DoubleValue(quality),
                Penalty = new DoubleValue(penalty),
                Distance = new DoubleValue(distance)
            });
        }
    public static OrienteeringEvaluationResult Apply(IntegerVector solution, DoubleArray scores,
      DistanceMatrix distances, double maximumDistance, double pointVisitingCosts, double distancePenaltyFactor) {

      double score = solution.Sum(t => scores[t]);
      double distance = distances.CalculateTourLength(solution.ToList(), pointVisitingCosts);

      double distanceViolation = distance - maximumDistance;

      double penalty = 0.0;
      penalty += distanceViolation > 0 ? distanceViolation * distancePenaltyFactor : 0;

      double quality = score - penalty;

      return new OrienteeringEvaluationResult {
        Quality = new DoubleValue(quality),
        Penalty = new DoubleValue(penalty),
        Distance = new DoubleValue(distance)
      };
    }
    private void CleanupTour(List<int> actualTour, DistanceMatrix distances, double maxDistance, double pointVisitingCosts) {
      // Sort the points on the tour according to their costs savings when removed
      var distanceSavings = (
        from removePosition in Enumerable.Range(1, actualTour.Count - 2)
        let saving = distances.CalculateRemovementSaving(actualTour, removePosition, pointVisitingCosts)
        orderby saving descending
        select new SavingInfo { Index = removePosition, Saving = saving }
      ).ToList();

      double tourLength = distances.CalculateTourLength(actualTour, pointVisitingCosts);

      // As long as the created path is infeasible, remove elements
      while (tourLength > maxDistance) {
        // Remove the point that frees the largest distance
        // Note, distance savings are not updated after removal
        tourLength -= distances.CalculateRemovementSaving(actualTour, distanceSavings[0].Index, pointVisitingCosts);
        actualTour.RemoveAt(distanceSavings[0].Index);

        // Shift indices due to removal of a point in the tour
        for (int i = 1; i < distanceSavings.Count; i++) {
          if (distanceSavings[i].Index > distanceSavings[0].Index) {
            distanceSavings[i].Index--;
          }
        }
        distanceSavings.RemoveAt(0);
      }
    }