Changeset 17241 for branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSP.cs
- Timestamp:
- 09/10/19 21:55:35 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSP.cs
r17239 r17241 1 1 using System; 2 using System.Linq; 2 3 using HEAL.Attic; 3 4 using HeuristicLab.Common; … … 6 7 using HeuristicLab.Encodings.PermutationEncoding; 7 8 using HeuristicLab.Optimization; 9 using HeuristicLab.Parameters; 10 using HeuristicLab.PluginInfrastructure; 8 11 using HeuristicLab.Problems.Instances; 9 12 … … 11 14 [Item("Traveling Salesman Problem (TSP)", "Represents a symmetric Traveling Salesman Problem.")] 12 15 [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 100)] 13 [StorableType("60511a03-b8b4-47cd-a119-78f97358a6b0")] 14 public class TSP : SingleObjectiveProblem<PermutationEncoding, Permutation>, IProblemInstanceConsumer<TSPData> { 16 [StorableType("8415476a-69de-45ad-95be-298ed7c97e84")] 17 public class TSP : PermutationProblem, IProblemInstanceConsumer<TSPData> { 18 /// <summary> 19 /// This limit governs when a distance matrix is used. For all problems smaller than that, the distance matrix is 20 /// computed. This greatly speeds up computation time. 21 /// </summary> 15 22 public static int DistanceMatrixSizeLimit { get; set; } = 1000; 16 23 17 24 public override bool Maximization => false; 18 25 19 [Storable] 20 private IValueParameter<ITSPData> tspDataParameter; 21 public IValueParameter<ITSPData> TSPDataParameter { 22 get { return tspDataParameter; } 23 } 24 [Storable] 25 private IValueParameter<Permutation> bestKnownSolutionParameter; 26 public IValueParameter<Permutation> BestKnownSolutionParameter { 27 get { return bestKnownSolutionParameter; } 28 } 26 [Storable] public IValueParameter<ITSPData> TSPDataParameter { get; private set; } 27 [Storable] public IValueParameter<Permutation> BestKnownSolutionParameter { get; private set; } 29 28 30 29 public ITSPData TSPData { 31 get { return tspDataParameter.Value; }32 set { tspDataParameter.Value = value; }30 get { return TSPDataParameter.Value; } 31 set { TSPDataParameter.Value = value; } 33 32 } 34 33 public Permutation BestKnownSolution { 35 get { return bestKnownSolutionParameter.Value; }36 set { bestKnownSolutionParameter.Value = value; }34 get { return BestKnownSolutionParameter.Value; } 35 set { BestKnownSolutionParameter.Value = value; } 37 36 } 38 37 … … 42 41 protected TSP(TSP original, Cloner cloner) 43 42 : base(original, cloner) { 44 tspDataParameter = cloner.Clone(original.tspDataParameter);45 bestKnownSolutionParameter = cloner.Clone(original.bestKnownSolutionParameter);43 TSPDataParameter = cloner.Clone(original.TSPDataParameter); 44 BestKnownSolutionParameter = cloner.Clone(original.BestKnownSolutionParameter); 46 45 } 47 46 48 47 public TSP() : base(new PermutationEncoding("Tour", 16, PermutationTypes.RelativeUndirected)) { 49 TSPData = new RoundedEuclideanCoordinatesTSPData() { 48 Parameters.Add(TSPDataParameter = new ValueParameter<ITSPData>("TSPData", "The main parameters of the TSP.")); 49 Parameters.Add(BestKnownSolutionParameter = new OptionalValueParameter<Permutation>("BestKnownSolution", "The best known solution.")); 50 51 TSPData = new EuclideanTSPData() { 50 52 Coordinates = new DoubleMatrix(new double[,] { 51 53 { 100, 100 }, { 100, 200 }, { 100, 300 }, { 100, 400 }, … … 53 55 { 300, 100 }, { 300, 200 }, { 300, 300 }, { 300, 400 }, 54 56 { 400, 100 }, { 400, 200 }, { 400, 300 }, { 400, 400 } 55 }) 57 }), 58 Rounding = EuclideanTSPData.RoundingMode.Midpoint 56 59 }; 60 61 InitializeOperators(); 57 62 } 58 63 … … 72 77 tourLength += TSPData.GetDistance(tour[tour.Length - 1], tour[0]); 73 78 return tourLength; 79 } 80 81 public override void Analyze(Permutation[] solutions, double[] qualities, ResultCollection results, IRandom random) { 82 base.Analyze(solutions, qualities, results, random); 83 int i = -1; 84 if (!Maximization) 85 i = qualities.Select((x, index) => new { index, Fitness = x }).OrderBy(x => x.Fitness).First().index; 86 else i = qualities.Select((x, index) => new { index, Fitness = x }).OrderByDescending(x => x.Fitness).First().index; 87 88 if (double.IsNaN(BestKnownQuality) || 89 Maximization && qualities[i] > BestKnownQuality || 90 !Maximization && qualities[i] < BestKnownQuality) { 91 BestKnownQualityParameter.ActualValue = new DoubleValue(qualities[i]); 92 BestKnownSolutionParameter.ActualValue = (Permutation)solutions[i].Clone(); 93 } 94 95 var solution = TSPData.GetSolution(solutions[i], qualities[i]); 96 results.AddOrUpdateResult("Best TSP Solution", solution); 74 97 } 75 98 … … 84 107 throw new System.IO.InvalidDataException("The coordinates of the given instance are not in the right format, there need to be one row for each customer and two columns for the x and y coordinates."); 85 108 109 Encoding.Length = data.Dimension; 86 110 Name = data.Name; 87 111 Description = data.Description; … … 97 121 switch (data.DistanceMeasure) { 98 122 case DistanceMeasure.Euclidean: 99 throw new NotImplementedException();123 TSPData = new EuclideanTSPData(data.Coordinates) { Rounding = EuclideanTSPData.RoundingMode.None }; 100 124 break; 101 125 case DistanceMeasure.RoundedEuclidean: 102 TSPData = new RoundedEuclideanCoordinatesTSPData(data.Coordinates);126 TSPData = new EuclideanTSPData(data.Coordinates) { Rounding = EuclideanTSPData.RoundingMode.Midpoint }; 103 127 break; 104 128 case DistanceMeasure.UpperEuclidean: 105 throw new NotImplementedException();129 TSPData = new EuclideanTSPData(data.Coordinates) { Rounding = EuclideanTSPData.RoundingMode.Ceiling }; 106 130 break; 107 131 case DistanceMeasure.Geo: 108 throw new NotImplementedException();132 TSPData = new GeoTSPData(data.Coordinates); 109 133 break; 110 134 default: … … 128 152 OnReset(); 129 153 } 154 155 protected override void OnEncodingChanged() { 156 base.OnEncodingChanged(); 157 ParameterizeOperators(); 158 } 159 160 protected override void OnEvaluatorChanged() { 161 base.OnEvaluatorChanged(); 162 ParameterizeOperators(); 163 } 164 165 private void InitializeOperators() { 166 Operators.Add(new TSPImprovementOperator()); 167 Operators.Add(new TSPMultipleGuidesPathRelinker()); 168 Operators.Add(new TSPPathRelinker()); 169 Operators.Add(new TSPSimultaneousPathRelinker()); 170 171 Operators.Add(new TSPAlleleFrequencyAnalyzer()); 172 foreach (var op in ApplicationManager.Manager.GetInstances<ITSPMoveEvaluator>()) 173 Operators.Add(op); 174 175 ParameterizeOperators(); 176 } 177 178 private void ParameterizeOperators() { 179 foreach (var op in Operators.OfType<TSPAlleleFrequencyAnalyzer>()) { 180 op.MaximizationParameter.ActualName = MaximizationParameter.Name; 181 op.TSPDataParameter.ActualName = TSPDataParameter.Name; 182 op.SolutionParameter.ActualName = Encoding.Name; 183 op.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName; 184 op.BestKnownSolutionParameter.ActualName = BestKnownSolutionParameter.Name; 185 op.ResultsParameter.ActualName = "Results"; 186 } 187 foreach (var op in Operators.OfType<ITSPMoveEvaluator>()) { 188 op.TSPDataParameter.ActualName = TSPDataParameter.Name; 189 op.TSPDataParameter.Hidden = true; 190 op.TourLengthParameter.ActualName = Evaluator.QualityParameter.ActualName; 191 op.TourLengthParameter.Hidden = true; 192 op.TSPTourParameter.ActualName = Encoding.Name; 193 op.TSPTourParameter.Hidden = true; 194 } 195 foreach (var op in Operators.OfType<ISingleObjectiveImprovementOperator>()) { 196 op.SolutionParameter.ActualName = Encoding.Name; 197 op.SolutionParameter.Hidden = true; 198 } 199 foreach (ISingleObjectivePathRelinker op in Operators.OfType<ISingleObjectivePathRelinker>()) { 200 op.ParentsParameter.ActualName = Encoding.Name; 201 op.ParentsParameter.Hidden = true; 202 } 203 foreach (ISolutionSimilarityCalculator op in Operators.OfType<ISolutionSimilarityCalculator>()) { 204 op.SolutionVariableName = Encoding.Name; 205 op.QualityVariableName = Evaluator.QualityParameter.ActualName; 206 } 207 } 130 208 } 131 209 }
Note: See TracChangeset
for help on using the changeset viewer.