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