Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/28/12 15:47:26 (12 years ago)
Author:
spimming
Message:

#1680: merged changes from trunk into branch

Location:
branches/HeuristicLab.Hive.Azure
Files:
3 deleted
7 edited
2 copied

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.Hive.Azure

  • branches/HeuristicLab.Hive.Azure/HeuristicLab.Problems.TravelingSalesman/3.3/Analyzers/TSPAlleleFrequencyAnalyzer.cs

    r7270 r7669  
    6060      DoubleMatrix coords = CoordinatesParameter.ActualValue;
    6161      DistanceMatrix dm = DistanceMatrixParameter.ActualValue;
     62      if (dm == null && coords == null) throw new InvalidOperationException("Neither a distance matrix nor coordinates were given.");
    6263      int source, target, h;
    6364      double impact;
  • branches/HeuristicLab.Hive.Azure/HeuristicLab.Problems.TravelingSalesman/3.3/Evaluators/TSPCoordinatesPathEvaluator.cs

    r7270 r7669  
    2020#endregion
    2121
     22using System;
    2223using HeuristicLab.Common;
    2324using HeuristicLab.Core;
     
    7374    }
    7475
     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
    7586    public sealed override IOperation Apply() {
    7687      if (UseDistanceMatrixParameter.ActualValue.Value) {
     
    8394            if (dm == null) {  // check again to avoid race condition
    8495              DoubleMatrix c = CoordinatesParameter.ActualValue;
     96              if (c == null) throw new InvalidOperationException("Neither a distance matrix nor coordinates were given.");
    8597              dm = new DistanceMatrix(c.Rows, c.Rows);
    8698              for (int i = 0; i < dm.Rows; i++) {
     
    101113        Permutation p = PermutationParameter.ActualValue;
    102114        DoubleMatrix c = CoordinatesParameter.ActualValue;
    103 
     115        if (c == null) throw new InvalidOperationException("No coordinates were given.");
    104116        double length = 0;
    105117        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  
    115115    <Compile Include="Analyzers\TSPAlleleFrequencyAnalyzer.cs" />
    116116    <Compile Include="DistanceMatrix.cs" />
     117    <Compile Include="Evaluators\TSPDistanceMatrixEvaluator.cs" />
    117118    <Compile Include="Evaluators\TSPEuclideanPathEvaluator.cs" />
    118119    <Compile Include="Evaluators\TSPGeoPathEvaluator.cs" />
     120    <Compile Include="Interfaces\ITSPDistanceMatrixEvaluator.cs" />
    119121    <Compile Include="MoveEvaluators\ThreeOpt\TSPTranslocationMoveEuclideanPathEvaluator.cs" />
    120122    <Compile Include="MoveEvaluators\ThreeOpt\TSPTranslocationMoveGeoPathEvaluator.cs" />
     
    127129    <Compile Include="Plugin.cs" />
    128130    <Compile Include="TravelingSalesmanProblem.cs" />
    129     <Compile Include="TSPLIBTourParser.cs" />
    130131    <Compile Include="PathTSPTour.cs" />
    131132    <Compile Include="Evaluators\TSPCoordinatesPathEvaluator.cs" />
     
    139140    <Compile Include="MoveEvaluators\TSPPathMoveEvaluator.cs" />
    140141    <Compile Include="MoveEvaluators\TSPMoveEvaluator.cs" />
    141     <Compile Include="TSPLIBParser.cs" />
    142142    <Compile Include="Properties\AssemblyInfo.cs" />
    143143  </ItemGroup>
     
    203203      <Private>False</Private>
    204204    </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>
    205210  </ItemGroup>
    206211  <ItemGroup>
     
    208213    <None Include="Plugin.cs.frame" />
    209214    <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" />
    215215  </ItemGroup>
    216216  <ItemGroup>
  • branches/HeuristicLab.Hive.Azure/HeuristicLab.Problems.TravelingSalesman/3.3/MoveEvaluators/TSPPathMoveEvaluator.cs

    r7270 r7669  
    2020#endregion
    2121
     22using System;
    2223using HeuristicLab.Common;
    2324using HeuristicLab.Core;
     
    7879        DistanceMatrix distanceMatrix = DistanceMatrixParameter.ActualValue;
    7980        if (distanceMatrix == null) {
     81          if (coordinates == null) throw new InvalidOperationException("Neither a distance matrix nor coordinates were given.");
    8082          distanceMatrix = CalculateDistanceMatrix(coordinates);
    8183          DistanceMatrixParameter.ActualValue = distanceMatrix;
    8284        }
    8385        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      }
    8590      DoubleValue moveQuality = MoveQualityParameter.ActualValue;
    8691      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  
    3939  [PluginDependency("HeuristicLab.Parameters", "3.3")]
    4040  [PluginDependency("HeuristicLab.Persistence", "3.3")]
     41  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
    4142  public class HeuristicLabProblemsTravelingSalesmanPlugin : PluginBase {
    4243  }
  • branches/HeuristicLab.Hive.Azure/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs

    r7270 r7669  
    3232using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    3333using HeuristicLab.PluginInfrastructure;
     34using HeuristicLab.Problems.Instances;
    3435
    3536namespace HeuristicLab.Problems.TravelingSalesman {
     
    3738  [Creatable("Problems")]
    3839  [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;
    4043    public string Filename { get; set; }
    4144
    4245    #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"]; }
    4548    }
    4649    public OptionalValueParameter<DistanceMatrix> DistanceMatrixParameter {
     
    100103    private TravelingSalesmanProblem(TravelingSalesmanProblem original, Cloner cloner)
    101104      : base(original, cloner) {
    102       AttachEventHandlers();
     105      RegisterEventHandlers();
    103106    }
    104107    public override IDeepCloneable Clone(Cloner cloner) {
     
    107110    public TravelingSalesmanProblem()
    108111      : 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."));
    111113      Parameters.Add(new OptionalValueParameter<DistanceMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
    112114      Parameters.Add(new ValueParameter<BoolValue>("UseDistanceMatrix", "True if a distance matrix should be calculated and used for evaluation, otherwise false.", new BoolValue(true)));
     
    130132
    131133      InitializeOperators();
    132       AttachEventHandlers();
     134      RegisterEventHandlers();
    133135    }
    134136
     
    146148      Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
    147149      ParameterizeEvaluator();
     150      ParameterizeSolutionCreator();
    148151      UpdateMoveEvaluators();
    149152      ParameterizeAnalyzers();
     
    151154    }
    152155    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      }
    155160      ParameterizeSolutionCreator();
    156161      ClearDistanceMatrix();
     
    195200      }
    196201
     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
    197208      if (Operators.Count == 0) InitializeOperators();
    198209      #endregion
    199       AttachEventHandlers();
    200     }
    201 
    202     private void AttachEventHandlers() {
     210      RegisterEventHandlers();
     211    }
     212
     213    private void RegisterEventHandlers() {
    203214      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      }
    206219      SolutionCreator.PermutationParameter.ActualNameChanged += new EventHandler(SolutionCreator_PermutationParameter_ActualNameChanged);
    207220      Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
     
    213226      Operators.Add(new TSPPopulationDiversityAnalyzer());
    214227      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);
    216236      ParameterizeOperators();
    217237      UpdateMoveEvaluators();
     
    227247    }
    228248    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;
    231255      SolutionCreator.PermutationTypeParameter.Value = new PermutationType(PermutationTypes.RelativeUndirected);
    232256      SolutionCreator.PermutationTypeParameter.Hidden = true;
     
    246270        evaluator.UseDistanceMatrixParameter.ActualName = UseDistanceMatrixParameter.Name;
    247271        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;
    248277      }
    249278    }
     
    310339
    311340    private void ClearDistanceMatrix() {
    312       DistanceMatrixParameter.Value = null;
     341      if (!(Evaluator is ITSPDistanceMatrixEvaluator))
     342        DistanceMatrixParameter.Value = null;
    313343    }
    314344    #endregion
    315345
    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;
    331397      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);
    339409      }
    340410      OnReset();
    341411    }
    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);
    345426    }
    346427  }
Note: See TracChangeset for help on using the changeset viewer.