Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
09/10/19 21:55:35 (5 years ago)
Author:
abeham
Message:

#2521: worked on refactoring TSP

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSP.cs

    r17239 r17241  
    11using System;
     2using System.Linq;
    23using HEAL.Attic;
    34using HeuristicLab.Common;
     
    67using HeuristicLab.Encodings.PermutationEncoding;
    78using HeuristicLab.Optimization;
     9using HeuristicLab.Parameters;
     10using HeuristicLab.PluginInfrastructure;
    811using HeuristicLab.Problems.Instances;
    912
     
    1114  [Item("Traveling Salesman Problem (TSP)", "Represents a symmetric Traveling Salesman Problem.")]
    1215  [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>
    1522    public static int DistanceMatrixSizeLimit { get; set; } = 1000;
    1623
    1724    public override bool Maximization => false;
    1825
    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; }
    2928
    3029    public ITSPData TSPData {
    31       get { return tspDataParameter.Value; }
    32       set { tspDataParameter.Value = value; }
     30      get { return TSPDataParameter.Value; }
     31      set { TSPDataParameter.Value = value; }
    3332    }
    3433    public Permutation BestKnownSolution {
    35       get { return bestKnownSolutionParameter.Value; }
    36       set { bestKnownSolutionParameter.Value = value; }
     34      get { return BestKnownSolutionParameter.Value; }
     35      set { BestKnownSolutionParameter.Value = value; }
    3736    }
    3837
     
    4241    protected TSP(TSP original, Cloner cloner)
    4342      : 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);
    4645    }
    4746
    4847    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() {
    5052        Coordinates = new DoubleMatrix(new double[,] {
    5153        { 100, 100 }, { 100, 200 }, { 100, 300 }, { 100, 400 },
     
    5355        { 300, 100 }, { 300, 200 }, { 300, 300 }, { 300, 400 },
    5456        { 400, 100 }, { 400, 200 }, { 400, 300 }, { 400, 400 }
    55         })
     57        }),
     58        Rounding = EuclideanTSPData.RoundingMode.Midpoint
    5659      };
     60
     61      InitializeOperators();
    5762    }
    5863
     
    7277      tourLength += TSPData.GetDistance(tour[tour.Length - 1], tour[0]);
    7378      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);
    7497    }
    7598
     
    84107        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.");
    85108
     109      Encoding.Length = data.Dimension;
    86110      Name = data.Name;
    87111      Description = data.Description;
     
    97121        switch (data.DistanceMeasure) {
    98122          case DistanceMeasure.Euclidean:
    99             throw new NotImplementedException();
     123            TSPData = new EuclideanTSPData(data.Coordinates) { Rounding = EuclideanTSPData.RoundingMode.None };
    100124            break;
    101125          case DistanceMeasure.RoundedEuclidean:
    102             TSPData = new RoundedEuclideanCoordinatesTSPData(data.Coordinates);
     126            TSPData = new EuclideanTSPData(data.Coordinates) { Rounding = EuclideanTSPData.RoundingMode.Midpoint };
    103127            break;
    104128          case DistanceMeasure.UpperEuclidean:
    105             throw new NotImplementedException();
     129            TSPData = new EuclideanTSPData(data.Coordinates) { Rounding = EuclideanTSPData.RoundingMode.Ceiling };
    106130            break;
    107131          case DistanceMeasure.Geo:
    108             throw new NotImplementedException();
     132            TSPData = new GeoTSPData(data.Coordinates);
    109133            break;
    110134          default:
     
    128152      OnReset();
    129153    }
     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    }
    130208  }
    131209}
Note: See TracChangeset for help on using the changeset viewer.