1  #region License Information


2  /* HeuristicLab


3  * Copyright (C) 20022015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)


4  *


5  * This file is part of HeuristicLab.


6  *


7  * HeuristicLab is free software: you can redistribute it and/or modify


8  * it under the terms of the GNU General Public License as published by


9  * the Free Software Foundation, either version 3 of the License, or


10  * (at your option) any later version.


11  *


12  * HeuristicLab is distributed in the hope that it will be useful,


13  * but WITHOUT ANY WARRANTY; without even the implied warranty of


14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the


15  * GNU General Public License for more details.


16  *


17  * You should have received a copy of the GNU General Public License


18  * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.


19  */


20  #endregion


21 


22  using HeuristicLab.Common;


23  using HeuristicLab.Core;


24  using HeuristicLab.Data;


25  using HeuristicLab.Encodings.PermutationEncoding;


26  using HeuristicLab.Parameters;


27  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;


28 


29  namespace HeuristicLab.Problems.PTSP {


30  [Item("PTSP 2.5MoveEvaluator", "Operator that evaluates 2.5popt moves of PTSP")]


31  [StorableClass]


32  public class PTSPTwoPointFiveMoveEvaluator : EstimatedPTSPMoveEvaluator, ITwoPointFiveMoveOperator {


33 


34  public ILookupParameter<TwoPointFiveMove> TwoPointFiveMoveParameter {


35  get { return (ILookupParameter<TwoPointFiveMove>)Parameters["TwoPointFiveMove"]; }


36  }


37 


38  [StorableConstructor]


39  protected PTSPTwoPointFiveMoveEvaluator(bool deserializing) : base(deserializing) { }


40  protected PTSPTwoPointFiveMoveEvaluator(PTSPTwoPointFiveMoveEvaluator original, Cloner cloner) : base(original, cloner) { }


41  public PTSPTwoPointFiveMoveEvaluator()


42  : base() {


43  Parameters.Add(new LookupParameter<TwoPointFiveMove>("TwoPointFiveMove", "The move to evaluate."));


44  }


45 


46  public override IDeepCloneable Clone(Cloner cloner) {


47  return new PTSPTwoPointFiveMoveEvaluator(this, cloner);


48  }


49 


50  protected override double EvaluateByCoordinates(Permutation permutation, DoubleMatrix coordinates, DistanceCalculator distanceCalculator) {


51  var move = TwoPointFiveMoveParameter.ActualValue;


52  var realizations = RealizationsParameter.ActualValue;


53  return EvaluateByCoordinates(permutation, coordinates, distanceCalculator, move, realizations);


54  }


55 


56  public static double EvaluateByCoordinates(Permutation permutation, DoubleMatrix coordinates, DistanceCalculator distanceCalculator, TwoPointFiveMove move, ItemList<BoolArray> realizations) {


57  if (move.IsInvert) {


58  return PTSPEstimatedInversionMoveEvaluator.EvaluateByCoordinates(permutation,


59  new InversionMove(move.Index1, move.Index2, move.Permutation),


60  coordinates, distanceCalculator, realizations);


61  } else {


62  return PTSPEstimatedInsertionMoveEvaluator.EvaluateByCoordinates(permutation,


63  new TranslocationMove(move.Index1, move.Index1, move.Index2),


64  coordinates, distanceCalculator, realizations);


65  }


66  }


67 


68  protected override double EvaluateByDistanceMatrix(Permutation permutation, DistanceMatrix distanceMatrix) {


69  var move = TwoPointFiveMoveParameter.ActualValue;


70  var realizations = RealizationsParameter.ActualValue;


71  return EvaluateByDistanceMatrix(permutation, distanceMatrix, move, realizations);


72  }


73 


74  public static double EvaluateByDistanceMatrix(Permutation permutation, DistanceMatrix distanceMatrix, TwoPointFiveMove move, ItemList<BoolArray> realizations) {


75  if (move.IsInvert) {


76  return PTSPEstimatedInversionMoveEvaluator.EvaluateByDistanceMatrix(permutation,


77  new InversionMove(move.Index1, move.Index2, move.Permutation),


78  distanceMatrix, realizations);


79  } else {


80  return PTSPEstimatedInsertionMoveEvaluator.EvaluateByDistanceMatrix(permutation,


81  new TranslocationMove(move.Index1, move.Index1, move.Index2),


82  distanceMatrix, realizations);


83  }


84  }


85  }


86  }

