- Timestamp:
- 03/28/12 15:47:26 (13 years ago)
- Location:
- branches/HeuristicLab.Hive.Azure
- Files:
-
- 3 deleted
- 7 edited
- 2 copied
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.Hive.Azure
- Property svn:ignore
-
old new 3 3 *.resharper 4 4 *.suo 5 *.user 5 6 *.vsp 6 7 Doxygen 8 FxCopResults.txt 7 9 Google.ProtocolBuffers-0.9.1.dll 8 10 HeuristicLab 3.3.5.1.ReSharper.user
-
- Property svn:mergeinfo changed
- Property svn:ignore
-
branches/HeuristicLab.Hive.Azure/HeuristicLab.Problems.TravelingSalesman/3.3/Analyzers/TSPAlleleFrequencyAnalyzer.cs
r7270 r7669 60 60 DoubleMatrix coords = CoordinatesParameter.ActualValue; 61 61 DistanceMatrix dm = DistanceMatrixParameter.ActualValue; 62 if (dm == null && coords == null) throw new InvalidOperationException("Neither a distance matrix nor coordinates were given."); 62 63 int source, target, h; 63 64 double impact; -
branches/HeuristicLab.Hive.Azure/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPCoordinatesPathEvaluator.cs
r7270 r7669 20 20 #endregion 21 21 22 using System; 22 23 using HeuristicLab.Common; 23 24 using HeuristicLab.Core; … … 73 74 } 74 75 76 public static double Apply(TSPCoordinatesPathEvaluator evaluator, DoubleMatrix coordinates, Permutation tour) { 77 DoubleMatrix c = coordinates; 78 Permutation p = tour; 79 double length = 0; 80 for (int i = 0; i < p.Length - 1; i++) 81 length += evaluator.CalculateDistance(c[p[i], 0], c[p[i], 1], c[p[i + 1], 0], c[p[i + 1], 1]); 82 length += evaluator.CalculateDistance(c[p[p.Length - 1], 0], c[p[p.Length - 1], 1], c[p[0], 0], c[p[0], 1]); 83 return length; 84 } 85 75 86 public sealed override IOperation Apply() { 76 87 if (UseDistanceMatrixParameter.ActualValue.Value) { … … 83 94 if (dm == null) { // check again to avoid race condition 84 95 DoubleMatrix c = CoordinatesParameter.ActualValue; 96 if (c == null) throw new InvalidOperationException("Neither a distance matrix nor coordinates were given."); 85 97 dm = new DistanceMatrix(c.Rows, c.Rows); 86 98 for (int i = 0; i < dm.Rows; i++) { … … 101 113 Permutation p = PermutationParameter.ActualValue; 102 114 DoubleMatrix c = CoordinatesParameter.ActualValue; 103 115 if (c == null) throw new InvalidOperationException("No coordinates were given."); 104 116 double length = 0; 105 117 for (int i = 0; i < p.Length - 1; i++) -
branches/HeuristicLab.Hive.Azure/HeuristicLab.Problems.TravelingSalesman/3.3/HeuristicLab.Problems.TravelingSalesman-3.3.csproj
r6866 r7669 115 115 <Compile Include="Analyzers\TSPAlleleFrequencyAnalyzer.cs" /> 116 116 <Compile Include="DistanceMatrix.cs" /> 117 <Compile Include="Evaluators\TSPDistanceMatrixEvaluator.cs" /> 117 118 <Compile Include="Evaluators\TSPEuclideanPathEvaluator.cs" /> 118 119 <Compile Include="Evaluators\TSPGeoPathEvaluator.cs" /> 120 <Compile Include="Interfaces\ITSPDistanceMatrixEvaluator.cs" /> 119 121 <Compile Include="MoveEvaluators\ThreeOpt\TSPTranslocationMoveEuclideanPathEvaluator.cs" /> 120 122 <Compile Include="MoveEvaluators\ThreeOpt\TSPTranslocationMoveGeoPathEvaluator.cs" /> … … 127 129 <Compile Include="Plugin.cs" /> 128 130 <Compile Include="TravelingSalesmanProblem.cs" /> 129 <Compile Include="TSPLIBTourParser.cs" />130 131 <Compile Include="PathTSPTour.cs" /> 131 132 <Compile Include="Evaluators\TSPCoordinatesPathEvaluator.cs" /> … … 139 140 <Compile Include="MoveEvaluators\TSPPathMoveEvaluator.cs" /> 140 141 <Compile Include="MoveEvaluators\TSPMoveEvaluator.cs" /> 141 <Compile Include="TSPLIBParser.cs" />142 142 <Compile Include="Properties\AssemblyInfo.cs" /> 143 143 </ItemGroup> … … 203 203 <Private>False</Private> 204 204 </ProjectReference> 205 <ProjectReference Include="..\..\HeuristicLab.Problems.Instances\3.3\HeuristicLab.Problems.Instances-3.3.csproj"> 206 <Project>{3540E29E-4793-49E7-8EE2-FEA7F61C3994}</Project> 207 <Name>HeuristicLab.Problems.Instances-3.3</Name> 208 <Private>False</Private> 209 </ProjectReference> 205 210 </ItemGroup> 206 211 <ItemGroup> … … 208 213 <None Include="Plugin.cs.frame" /> 209 214 <None Include="Properties\AssemblyInfo.cs.frame" /> 210 <None Include="TSPLIB Sample Problems\ch130.opt.tour" />211 <None Include="TSPLIB Sample Problems\ch130.tsp" />212 <None Include="TSPLIB Sample Problems\fl1400.tsp" />213 <None Include="TSPLIB Sample Problems\gr666.opt.tour" />214 <None Include="TSPLIB Sample Problems\gr666.tsp" />215 215 </ItemGroup> 216 216 <ItemGroup> -
branches/HeuristicLab.Hive.Azure/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TSPPathMoveEvaluator.cs
r7270 r7669 20 20 #endregion 21 21 22 using System; 22 23 using HeuristicLab.Common; 23 24 using HeuristicLab.Core; … … 78 79 DistanceMatrix distanceMatrix = DistanceMatrixParameter.ActualValue; 79 80 if (distanceMatrix == null) { 81 if (coordinates == null) throw new InvalidOperationException("Neither a distance matrix nor coordinates were given."); 80 82 distanceMatrix = CalculateDistanceMatrix(coordinates); 81 83 DistanceMatrixParameter.ActualValue = distanceMatrix; 82 84 } 83 85 relativeQualityDifference = EvaluateByDistanceMatrix(permutation, distanceMatrix); 84 } else relativeQualityDifference = EvaluateByCoordinates(permutation, coordinates); 86 } else { 87 if (coordinates == null) throw new InvalidOperationException("No coordinates were given."); 88 relativeQualityDifference = EvaluateByCoordinates(permutation, coordinates); 89 } 85 90 DoubleValue moveQuality = MoveQualityParameter.ActualValue; 86 91 if (moveQuality == null) MoveQualityParameter.ActualValue = new DoubleValue(QualityParameter.ActualValue.Value + relativeQualityDifference); -
branches/HeuristicLab.Hive.Azure/HeuristicLab.Problems.TravelingSalesman/3.3/Plugin.cs.frame
r7270 r7669 39 39 [PluginDependency("HeuristicLab.Parameters", "3.3")] 40 40 [PluginDependency("HeuristicLab.Persistence", "3.3")] 41 [PluginDependency("HeuristicLab.Problems.Instances", "3.3")] 41 42 public class HeuristicLabProblemsTravelingSalesmanPlugin : PluginBase { 42 43 } -
branches/HeuristicLab.Hive.Azure/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs
r7270 r7669 32 32 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 33 33 using HeuristicLab.PluginInfrastructure; 34 using HeuristicLab.Problems.Instances; 34 35 35 36 namespace HeuristicLab.Problems.TravelingSalesman { … … 37 38 [Creatable("Problems")] 38 39 [StorableClass] 39 public sealed class TravelingSalesmanProblem : SingleObjectiveHeuristicOptimizationProblem<ITSPEvaluator, IPermutationCreator>, IStorableContent { 40 public sealed class TravelingSalesmanProblem : SingleObjectiveHeuristicOptimizationProblem<ITSPEvaluator, IPermutationCreator>, IStorableContent, 41 IProblemInstanceConsumer<TSPData> { 42 private static readonly int DistanceMatrixSizeLimit = 1000; 40 43 public string Filename { get; set; } 41 44 42 45 #region Parameter Properties 43 public ValueParameter<DoubleMatrix> CoordinatesParameter {44 get { return ( ValueParameter<DoubleMatrix>)Parameters["Coordinates"]; }46 public OptionalValueParameter<DoubleMatrix> CoordinatesParameter { 47 get { return (OptionalValueParameter<DoubleMatrix>)Parameters["Coordinates"]; } 45 48 } 46 49 public OptionalValueParameter<DistanceMatrix> DistanceMatrixParameter { … … 100 103 private TravelingSalesmanProblem(TravelingSalesmanProblem original, Cloner cloner) 101 104 : base(original, cloner) { 102 AttachEventHandlers();105 RegisterEventHandlers(); 103 106 } 104 107 public override IDeepCloneable Clone(Cloner cloner) { … … 107 110 public TravelingSalesmanProblem() 108 111 : base(new TSPRoundedEuclideanPathEvaluator(), new RandomPermutationCreator()) { 109 110 Parameters.Add(new ValueParameter<DoubleMatrix>("Coordinates", "The x- and y-Coordinates of the cities.")); 112 Parameters.Add(new OptionalValueParameter<DoubleMatrix>("Coordinates", "The x- and y-Coordinates of the cities.")); 111 113 Parameters.Add(new OptionalValueParameter<DistanceMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities.")); 112 114 Parameters.Add(new ValueParameter<BoolValue>("UseDistanceMatrix", "True if a distance matrix should be calculated and used for evaluation, otherwise false.", new BoolValue(true))); … … 130 132 131 133 InitializeOperators(); 132 AttachEventHandlers();134 RegisterEventHandlers(); 133 135 } 134 136 … … 146 148 Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged); 147 149 ParameterizeEvaluator(); 150 ParameterizeSolutionCreator(); 148 151 UpdateMoveEvaluators(); 149 152 ParameterizeAnalyzers(); … … 151 154 } 152 155 private void CoordinatesParameter_ValueChanged(object sender, EventArgs e) { 153 Coordinates.ItemChanged += new EventHandler<EventArgs<int, int>>(Coordinates_ItemChanged); 154 Coordinates.Reset += new EventHandler(Coordinates_Reset); 156 if (Coordinates != null) { 157 Coordinates.ItemChanged += new EventHandler<EventArgs<int, int>>(Coordinates_ItemChanged); 158 Coordinates.Reset += new EventHandler(Coordinates_Reset); 159 } 155 160 ParameterizeSolutionCreator(); 156 161 ClearDistanceMatrix(); … … 195 200 } 196 201 202 ValueParameter<DoubleMatrix> oldCoordinates = (Parameters["Coordinates"] as ValueParameter<DoubleMatrix>); 203 if (oldCoordinates != null) { 204 Parameters.Remove(oldCoordinates); 205 Parameters.Add(new OptionalValueParameter<DoubleMatrix>("Coordinates", "The x- and y-Coordinates of the cities.", oldCoordinates.Value, oldCoordinates.GetsCollected)); 206 } 207 197 208 if (Operators.Count == 0) InitializeOperators(); 198 209 #endregion 199 AttachEventHandlers();200 } 201 202 private void AttachEventHandlers() {210 RegisterEventHandlers(); 211 } 212 213 private void RegisterEventHandlers() { 203 214 CoordinatesParameter.ValueChanged += new EventHandler(CoordinatesParameter_ValueChanged); 204 Coordinates.ItemChanged += new EventHandler<EventArgs<int, int>>(Coordinates_ItemChanged); 205 Coordinates.Reset += new EventHandler(Coordinates_Reset); 215 if (Coordinates != null) { 216 Coordinates.ItemChanged += new EventHandler<EventArgs<int, int>>(Coordinates_ItemChanged); 217 Coordinates.Reset += new EventHandler(Coordinates_Reset); 218 } 206 219 SolutionCreator.PermutationParameter.ActualNameChanged += new EventHandler(SolutionCreator_PermutationParameter_ActualNameChanged); 207 220 Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged); … … 213 226 Operators.Add(new TSPPopulationDiversityAnalyzer()); 214 227 ParameterizeAnalyzers(); 215 Operators.AddRange(ApplicationManager.Manager.GetInstances<IPermutationOperator>().Cast<IOperator>()); 228 var operators = new HashSet<IPermutationOperator>(new IPermutationOperator[] { 229 new OrderCrossover2(), 230 new InversionManipulator(), 231 new StochasticInversionMultiMoveGenerator() 232 }, new TypeEqualityComparer<IPermutationOperator>()); 233 foreach (var op in ApplicationManager.Manager.GetInstances<IPermutationOperator>()) 234 operators.Add(op); 235 Operators.AddRange(operators); 216 236 ParameterizeOperators(); 217 237 UpdateMoveEvaluators(); … … 227 247 } 228 248 private void ParameterizeSolutionCreator() { 229 SolutionCreator.LengthParameter.Value = new IntValue(Coordinates.Rows); 230 SolutionCreator.LengthParameter.Hidden = true; 249 if (Evaluator is ITSPDistanceMatrixEvaluator && DistanceMatrix != null) 250 SolutionCreator.LengthParameter.Value = new IntValue(DistanceMatrix.Rows); 251 else if (Evaluator is ITSPCoordinatesPathEvaluator && Coordinates != null) 252 SolutionCreator.LengthParameter.Value = new IntValue(Coordinates.Rows); 253 else SolutionCreator.LengthParameter.Value = null; 254 SolutionCreator.LengthParameter.Hidden = SolutionCreator.LengthParameter.Value != null; 231 255 SolutionCreator.PermutationTypeParameter.Value = new PermutationType(PermutationTypes.RelativeUndirected); 232 256 SolutionCreator.PermutationTypeParameter.Hidden = true; … … 246 270 evaluator.UseDistanceMatrixParameter.ActualName = UseDistanceMatrixParameter.Name; 247 271 evaluator.UseDistanceMatrixParameter.Hidden = true; 272 } 273 if (Evaluator is ITSPDistanceMatrixEvaluator) { 274 var evaluator = (ITSPDistanceMatrixEvaluator)Evaluator; 275 evaluator.DistanceMatrixParameter.ActualName = DistanceMatrixParameter.Name; 276 evaluator.DistanceMatrixParameter.Hidden = true; 248 277 } 249 278 } … … 310 339 311 340 private void ClearDistanceMatrix() { 312 DistanceMatrixParameter.Value = null; 341 if (!(Evaluator is ITSPDistanceMatrixEvaluator)) 342 DistanceMatrixParameter.Value = null; 313 343 } 314 344 #endregion 315 345 316 public void ImportFromTSPLIB(string tspFileName, string optimalTourFileName) { 317 TSPLIBParser tspParser = new TSPLIBParser(tspFileName); 318 tspParser.Parse(); 319 Name = tspParser.Name + " TSP (imported from TSPLIB)"; 320 if (!string.IsNullOrEmpty(tspParser.Comment)) Description = tspParser.Comment; 321 Coordinates = new DoubleMatrix(tspParser.Vertices); 322 if (tspParser.WeightType == TSPLIBParser.TSPLIBEdgeWeightType.EUC_2D) { 323 TSPRoundedEuclideanPathEvaluator evaluator = new TSPRoundedEuclideanPathEvaluator(); 324 evaluator.QualityParameter.ActualName = "TSPTourLength"; 325 Evaluator = evaluator; 326 } else if (tspParser.WeightType == TSPLIBParser.TSPLIBEdgeWeightType.GEO) { 327 TSPGeoPathEvaluator evaluator = new TSPGeoPathEvaluator(); 328 evaluator.QualityParameter.ActualName = "TSPTourLength"; 329 Evaluator = evaluator; 330 } 346 public void Load(TSPData data) { 347 if (data.Coordinates == null && data.Distances == null) 348 throw new System.IO.InvalidDataException("The given instance specifies neither coordinates nor distances!"); 349 if (data.Dimension > DistanceMatrixSizeLimit && (data.DistanceMeasure == TSPDistanceMeasure.Att 350 || data.DistanceMeasure == TSPDistanceMeasure.Manhattan 351 || data.DistanceMeasure == TSPDistanceMeasure.Maximum 352 || data.DistanceMeasure == TSPDistanceMeasure.UpperEuclidean)) 353 throw new System.IO.InvalidDataException("The given instance uses an unsupported distance measure and is too large for using a distance matrix."); 354 if (data.Coordinates != null && data.Coordinates.GetLength(1) != 2) 355 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."); 356 357 Name = data.Name; 358 Description = data.Description; 359 360 if (data.Coordinates != null && data.Coordinates.GetLength(0) > 0) 361 Coordinates = new DoubleMatrix(data.Coordinates); 362 else Coordinates = null; 363 364 TSPEvaluator evaluator; 365 if (data.DistanceMeasure == TSPDistanceMeasure.Att 366 || data.DistanceMeasure == TSPDistanceMeasure.Manhattan 367 || data.DistanceMeasure == TSPDistanceMeasure.Maximum 368 || data.DistanceMeasure == TSPDistanceMeasure.UpperEuclidean) { 369 evaluator = new TSPDistanceMatrixEvaluator(); 370 UseDistanceMatrix = new BoolValue(true); 371 DistanceMatrix = new DistanceMatrix(data.GetDistanceMatrix()); 372 } else if (data.DistanceMeasure == TSPDistanceMeasure.Direct && data.Distances != null) { 373 evaluator = new TSPDistanceMatrixEvaluator(); 374 UseDistanceMatrix = new BoolValue(true); 375 DistanceMatrix = new DistanceMatrix(data.Distances); 376 } else { 377 DistanceMatrix = null; 378 UseDistanceMatrix = new BoolValue(data.Dimension <= DistanceMatrixSizeLimit); 379 switch (data.DistanceMeasure) { 380 case TSPDistanceMeasure.Euclidean: 381 evaluator = new TSPEuclideanPathEvaluator(); 382 break; 383 case TSPDistanceMeasure.RoundedEuclidean: 384 evaluator = new TSPRoundedEuclideanPathEvaluator(); 385 break; 386 case TSPDistanceMeasure.Geo: 387 evaluator = new TSPGeoPathEvaluator(); 388 break; 389 default: 390 throw new InvalidDataException("An unknown distance measure is given in the instance!"); 391 } 392 } 393 evaluator.QualityParameter.ActualName = "TSPTourLength"; 394 Evaluator = evaluator; 395 396 BestKnownSolution = null; 331 397 BestKnownQuality = null; 332 BestKnownSolution = null; 333 334 if (!string.IsNullOrEmpty(optimalTourFileName)) { 335 TSPLIBTourParser tourParser = new TSPLIBTourParser(optimalTourFileName); 336 tourParser.Parse(); 337 if (tourParser.Tour.Length != Coordinates.Rows) throw new InvalidDataException("Length of optimal tour is not equal to number of cities."); 338 BestKnownSolution = new Permutation(PermutationTypes.RelativeUndirected, tourParser.Tour); 398 399 if (data.BestKnownTour != null) { 400 try { 401 EvaluateAndLoadTour(data.BestKnownTour); 402 } 403 catch (InvalidOperationException) { 404 if (data.BestKnownQuality.HasValue) 405 BestKnownQuality = new DoubleValue(data.BestKnownQuality.Value); 406 } 407 } else if (data.BestKnownQuality.HasValue) { 408 BestKnownQuality = new DoubleValue(data.BestKnownQuality.Value); 339 409 } 340 410 OnReset(); 341 411 } 342 public void ImportFromTSPLIB(string tspFileName, string optimalTourFileName, double bestKnownQuality) { 343 ImportFromTSPLIB(tspFileName, optimalTourFileName); 344 BestKnownQuality = new DoubleValue(bestKnownQuality); 412 413 public void EvaluateAndLoadTour(int[] tour) { 414 var route = new Permutation(PermutationTypes.RelativeUndirected, tour); 415 BestKnownSolution = route; 416 417 double quality; 418 if (Evaluator is ITSPDistanceMatrixEvaluator) { 419 quality = TSPDistanceMatrixEvaluator.Apply(DistanceMatrix, route); 420 } else if (Evaluator is ITSPCoordinatesPathEvaluator) { 421 quality = TSPCoordinatesPathEvaluator.Apply((TSPCoordinatesPathEvaluator)Evaluator, Coordinates, route); 422 } else { 423 throw new InvalidOperationException("Cannot calculate solution quality, evaluator type is unknown."); 424 } 425 BestKnownQuality = new DoubleValue(quality); 345 426 } 346 427 }
Note: See TracChangeset
for help on using the changeset viewer.