Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/28/15 23:38:51 (8 years ago)
Author:
abeham
Message:

#2221:

  • Completely refactored PTSP branch
    • Added two sets of problem instances based on TSPLIB: homogeneous and heterogeneous
    • Implemented missing EvaluateByCoordinates for 1-shift moves
    • Made it clear that move evaluators are for estimated PTSP only
    • Changed parameter realization from a rather strange list of list of ints to a list of bool arrays
    • Reusing code of the 2-opt and 1-shift move evaluators in 2.5 move evaluator
    • Introducing distance calculators to properly handle the case when no distance matrix is given (previous code only worked with distance matrix and without only with euclidean distance in some settings)
    • Fixed several smaller code issues: protected, static, method parameters, copy & paste, interfaces, naming, parameters, serialization hooks, license headers, doc comments, data types
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/PTSP/HeuristicLab.Problems.PTSP/3.3/PTSP.cs

    r13202 r13412  
    2020#endregion
    2121
     22using System;
    2223using HeuristicLab.Common;
    2324using HeuristicLab.Core;
     
    3031
    3132namespace HeuristicLab.Problems.PTSP {
    32   [Item("Probabilistic Traveling Salesman Problem", "Represents a Probabilistic Traveling Salesman Problem.")]
     33  [Item("Probabilistic Traveling Salesman Problem (PTSP)", "Represents a Probabilistic Traveling Salesman Problem.")]
    3334  [StorableClass]
    34   public abstract class ProbabilisticTravelingSalesmanProblem : SingleObjectiveBasicProblem<PermutationEncoding>, IStorableContent,
     35  public abstract class ProbabilisticTravelingSalesmanProblem : SingleObjectiveBasicProblem<PermutationEncoding>,
    3536  IProblemInstanceConsumer<PTSPData> {
    3637    private static readonly int DistanceMatrixSizeLimit = 1000;
     
    4041      get { return (OptionalValueParameter<DoubleMatrix>)Parameters["Coordinates"]; }
    4142    }
     43    public OptionalValueParameter<DistanceCalculator> DistanceCalculatorParameter {
     44      get { return (OptionalValueParameter<DistanceCalculator>)Parameters["DistanceCalculator"]; }
     45    }
    4246    public OptionalValueParameter<DistanceMatrix> DistanceMatrixParameter {
    4347      get { return (OptionalValueParameter<DistanceMatrix>)Parameters["DistanceMatrix"]; }
    4448    }
    45     public ValueParameter<BoolValue> UseDistanceMatrixParameter {
    46       get { return (ValueParameter<BoolValue>)Parameters["UseDistanceMatrix"]; }
     49    public IFixedValueParameter<BoolValue> UseDistanceMatrixParameter {
     50      get { return (IFixedValueParameter<BoolValue>)Parameters["UseDistanceMatrix"]; }
    4751    }
    4852    public OptionalValueParameter<Permutation> BestKnownSolutionParameter {
    4953      get { return (OptionalValueParameter<Permutation>)Parameters["BestKnownSolution"]; }
    5054    }
    51     public ValueParameter<DoubleArray> ProbabilityMatrixParameter {
    52       get { return (ValueParameter<DoubleArray>)Parameters["ProbabilityMatrix"]; }
     55    public IValueParameter<DoubleArray> ProbabilitiesParameter {
     56      get { return (IValueParameter<DoubleArray>)Parameters["Probabilities"]; }
    5357    }
    54 
    55 
    5658    #endregion
    5759
     
    6163      set { CoordinatesParameter.Value = value; }
    6264    }
     65    public DistanceCalculator DistanceCalculator {
     66      get { return DistanceCalculatorParameter.Value; }
     67      set { DistanceCalculatorParameter.Value = value; }
     68    }
    6369    public DistanceMatrix DistanceMatrix {
    6470      get { return DistanceMatrixParameter.Value; }
    6571      set { DistanceMatrixParameter.Value = value; }
    6672    }
    67     public BoolValue UseDistanceMatrix {
    68       get { return UseDistanceMatrixParameter.Value; }
    69       set { UseDistanceMatrixParameter.Value = value; }
     73    public bool UseDistanceMatrix {
     74      get { return UseDistanceMatrixParameter.Value.Value; }
     75      set { UseDistanceMatrixParameter.Value.Value = value; }
    7076    }
    7177    public Permutation BestKnownSolution {
     
    7379      set { BestKnownSolutionParameter.Value = value; }
    7480    }
    75     public DoubleArray ProbabilityMatrix {
    76       get { return ProbabilityMatrixParameter.Value; }
    77       set { ProbabilityMatrixParameter.Value = value; }
     81    public DoubleArray Probabilities {
     82      get { return ProbabilitiesParameter.Value; }
     83      set { ProbabilitiesParameter.Value = value; }
    7884    }
    7985
    8086    #endregion
    81 
    8287
    8388    public override bool Maximization {
     
    8792    [StorableConstructor]
    8893    protected ProbabilisticTravelingSalesmanProblem(bool deserializing) : base(deserializing) { }
    89     protected ProbabilisticTravelingSalesmanProblem(ProbabilisticTravelingSalesmanProblem original, Cloner cloner)
    90       : base(original, cloner) {
    91     }
    92 
    93     public ProbabilisticTravelingSalesmanProblem() {
     94    protected ProbabilisticTravelingSalesmanProblem(ProbabilisticTravelingSalesmanProblem original, Cloner cloner) : base(original, cloner) { }
     95    protected ProbabilisticTravelingSalesmanProblem() {
    9496      Parameters.Add(new OptionalValueParameter<DoubleMatrix>("Coordinates", "The x- and y-Coordinates of the cities."));
     97      Parameters.Add(new OptionalValueParameter<DistanceCalculator>("DistanceCalculator", "Calculates the distance between two rows in the coordinates matrix."));
    9598      Parameters.Add(new OptionalValueParameter<DistanceMatrix>("DistanceMatrix", "The matrix which contains the distances between the cities."));
    96       Parameters.Add(new ValueParameter<BoolValue>("UseDistanceMatrix", "True if the coordinates based evaluators should calculate the distance matrix from the coordinates and use it for evaluation similar to the distance matrix evaluator, otherwise false.", new BoolValue(true)));
     99      Parameters.Add(new FixedValueParameter<BoolValue>("UseDistanceMatrix", "True if the coordinates based evaluators should calculate the distance matrix from the coordinates and use it for evaluation similar to the distance matrix evaluator, otherwise false.", new BoolValue(true)));
    97100      Parameters.Add(new OptionalValueParameter<Permutation>("BestKnownSolution", "The best known solution of this TSP instance."));
    98       Parameters.Add(new ValueParameter<DoubleArray>("ProbabilityMatrix", "The matrix which contains the probabilities of each of the cities."));
     101      Parameters.Add(new ValueParameter<DoubleArray>("Probabilities", "This list describes for each city the probability of appearing in a realized instance."));
    99102
    100103      Coordinates = new DoubleMatrix(new double[,] {
     
    105108      });
    106109
    107       ProbabilityMatrix = new DoubleArray(new double[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
     110      Probabilities = new DoubleArray(new double[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 });
     111    }
    108112
     113    public override double Evaluate(Individual individual, IRandom random) {
     114      return Evaluate(individual.Permutation(), random);
    109115    }
     116
     117    public abstract double Evaluate(Permutation tour, IRandom random);
    110118
    111119    public virtual void Load(PTSPData data) {
    112120      if (data.Coordinates == null && data.Distances == null)
    113121        throw new System.IO.InvalidDataException("The given instance specifies neither coordinates nor distances!");
    114       if (data.Dimension > DistanceMatrixSizeLimit && (data.DistanceMeasure == DistanceMeasure.Att
    115         || data.DistanceMeasure == DistanceMeasure.Manhattan
    116         || data.DistanceMeasure == DistanceMeasure.Maximum))
    117         throw new System.IO.InvalidDataException("The given instance uses an unsupported distance measure and is too large for using a distance matrix.");
    118       if (data.Coordinates != null && data.Coordinates.GetLength(1) != 2)
    119         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.");
     122      if (data.Dimension > DistanceMatrixSizeLimit && (data.Coordinates == null || data.Coordinates.GetLength(0) != data.Dimension || data.Coordinates.GetLength(1) != 2))
     123        throw new System.IO.InvalidDataException("The given instance is too large for using a distance matrix and there is a problem with the coordinates.");
     124      if (data.Coordinates != null && (data.Coordinates.GetLength(0) != data.Dimension || data.Coordinates.GetLength(1) != 2))
     125        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 respectively.");
     126
     127      switch (data.DistanceMeasure) {
     128        case DistanceMeasure.Direct:
     129          DistanceCalculator = null;
     130          if (data.Dimension > DistanceMatrixSizeLimit && Coordinates != null) {
     131            DistanceCalculator = new EuclideanDistance();
     132            UseDistanceMatrix = false;
     133          } else UseDistanceMatrix = true;
     134          break;
     135        case DistanceMeasure.Att: DistanceCalculator = new AttDistance(); break;
     136        case DistanceMeasure.Euclidean: DistanceCalculator = new EuclideanDistance(); break;
     137        case DistanceMeasure.Geo: DistanceCalculator = new GeoDistance(); break;
     138        case DistanceMeasure.Manhattan: DistanceCalculator = new ManhattanDistance(); break;
     139        case DistanceMeasure.Maximum: DistanceCalculator = new MaximumDistance(); break;
     140        case DistanceMeasure.RoundedEuclidean: DistanceCalculator = new RoundedEuclideanDistance(); break;
     141        case DistanceMeasure.UpperEuclidean: DistanceCalculator = new UpperEuclideanDistance(); break;
     142        default: throw new ArgumentException("Distance measure is unknown");
     143      }
    120144
    121145      Name = data.Name;
    122146      Description = data.Description;
    123147
    124       ProbabilityMatrix = new DoubleArray(data.Probabilities);
    125 
    126       if (data.BestKnownTour != null) {
    127         BestKnownSolution = new Permutation(PermutationTypes.RelativeUndirected, data.BestKnownTour);
    128       }
    129 
     148      Probabilities = new DoubleArray(data.Probabilities);
     149      BestKnownSolution = data.BestKnownTour != null ? new Permutation(PermutationTypes.RelativeUndirected, data.BestKnownTour) : null;
    130150      Coordinates = data.Coordinates != null && data.Coordinates.GetLength(0) > 0 ? new DoubleMatrix(data.Coordinates) : null;
    131151      DistanceMatrix = new DistanceMatrix(data.GetDistanceMatrix());
Note: See TracChangeset for help on using the changeset viewer.