Changeset 13470 for branches/PTSP/HeuristicLab.Problems.PTSP/3.3/Moves/AnalyticalPTSPMoveEvaluator.cs
- Timestamp:
- 12/15/15 16:38:08 (9 years ago)
- File:
-
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
branches/PTSP/HeuristicLab.Problems.PTSP/3.3/Moves/AnalyticalPTSPMoveEvaluator.cs
r13451 r13470 30 30 31 31 namespace HeuristicLab.Problems.PTSP { 32 [Item(" EstimatedPTSPMoveEvaluator", "A base class for operators which evaluateTSP moves.")]32 [Item("AnalyticalPTSPMoveEvaluator", "A base class for operators which evaluate PTSP moves.")] 33 33 [StorableClass] 34 public abstract class EstimatedPTSPMoveEvaluator : SingleSuccessorOperator, IEstimatedPTSPMoveEvaluator {34 public abstract class AnalyticalPTSPMoveEvaluator : SingleSuccessorOperator, IAnalyticalPTSPMoveEvaluator { 35 35 36 36 public override bool CanChangeName { … … 50 50 get { return (ILookupParameter<BoolValue>)Parameters["UseDistanceMatrix"]; } 51 51 } 52 public ILookupParameter< ItemList<BoolArray>> RealizationsParameter {53 get { return (ILookupParameter< ItemList<BoolArray>>)Parameters["Realizations"]; }52 public ILookupParameter<DoubleArray> ProbabilitiesParameter { 53 get { return (ILookupParameter<DoubleArray>)Parameters["Probabilities"]; } 54 54 } 55 55 public ILookupParameter<DoubleValue> QualityParameter { … … 64 64 65 65 [StorableConstructor] 66 protected EstimatedPTSPMoveEvaluator(bool deserializing) : base(deserializing) { }67 protected EstimatedPTSPMoveEvaluator(EstimatedPTSPMoveEvaluator original, Cloner cloner) : base(original, cloner) { }68 protected EstimatedPTSPMoveEvaluator()66 protected AnalyticalPTSPMoveEvaluator(bool deserializing) : base(deserializing) { } 67 protected AnalyticalPTSPMoveEvaluator(AnalyticalPTSPMoveEvaluator original, Cloner cloner) : base(original, cloner) { } 68 protected AnalyticalPTSPMoveEvaluator() 69 69 : base() { 70 70 Parameters.Add(new LookupParameter<Permutation>("Permutation", "The solution as permutation.")); … … 72 72 Parameters.Add(new LookupParameter<DistanceMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities.")); 73 73 Parameters.Add(new LookupParameter<BoolValue>("UseDistanceMatrix", "True if a distance matrix should be calculated (if it does not exist already) and used for evaluation, otherwise false.")); 74 Parameters.Add(new LookupParameter< ItemList<BoolArray>>("Realizations", "The list of samples drawn from all possible stochastic instances."));74 Parameters.Add(new LookupParameter<DoubleArray>("Probabilities", "The list of probabilities for each city to appear.")); 75 75 Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of a TSP solution.")); 76 76 Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The evaluated quality of a move on a TSP solution.")); … … 81 81 var permutation = PermutationParameter.ActualValue; 82 82 var coordinates = CoordinatesParameter.ActualValue; 83 double relativeQualityDifference = 0; 83 var probabilities = ProbabilitiesParameter.ActualValue; 84 Func<int, int, double> distance = null; 84 85 if (UseDistanceMatrixParameter.ActualValue.Value) { 85 86 var distanceMatrix = DistanceMatrixParameter.ActualValue; 86 87 if (distanceMatrix == null) throw new InvalidOperationException("The distance matrix has not been calculated."); 87 relativeQualityDifference = EvaluateByDistanceMatrix(permutation, distanceMatrix);88 distance = (a, b) => distanceMatrix[a, b]; 88 89 } else { 89 90 if (coordinates == null) throw new InvalidOperationException("No coordinates were given."); 90 91 var distanceCalculator = DistanceCalculatorParameter.ActualValue; 91 92 if (distanceCalculator == null) throw new InvalidOperationException("Distance calculator is null!"); 92 relativeQualityDifference = EvaluateByCoordinates(permutation, coordinates, distanceCalculator);93 distance = (a, b) => distanceCalculator.Calculate(a, b, coordinates); 93 94 } 95 // here moves are not delta-evaluated 96 var newQuality = EvaluateMove(permutation, distance, probabilities); 94 97 var moveQuality = MoveQualityParameter.ActualValue; 95 if (moveQuality == null) MoveQualityParameter.ActualValue = new DoubleValue(QualityParameter.ActualValue.Value + relativeQualityDifference); 96 else moveQuality.Value = QualityParameter.ActualValue.Value + relativeQualityDifference; 98 if (moveQuality == null) MoveQualityParameter.ActualValue = new DoubleValue(newQuality); 99 else moveQuality.Value = newQuality; 100 97 101 return base.Apply(); 98 102 } 99 103 100 protected abstract double EvaluateByDistanceMatrix(Permutation permutation, DistanceMatrix distanceMatrix); 101 protected abstract double EvaluateByCoordinates(Permutation permutation, DoubleMatrix coordinates, DistanceCalculator distanceCalculator); 104 protected abstract double EvaluateMove(Permutation permutation, Func<int, int, double> distance, DoubleArray probabilities); 102 105 } 103 106 }
Note: See TracChangeset
for help on using the changeset viewer.