1  #region License Information


2  /* HeuristicLab


3  * Copyright (C) 20022019 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 HEAL.Attic;


25 


26  namespace HeuristicLab.Encodings.PermutationEncoding {


27  /// <summary>


28  /// Manipulates a permutation array by moving a randomly chosen interval of elements to another


29  /// (randomly chosen) position in the array.


30  /// </summary>


31  /// <remarks>


32  /// It is implemented as described in Michalewicz, Z. 1992. Genetic Algorithms + Data Structures = Evolution Programs, Springer Verlag, Berlin Heidelberg.


33  /// </remarks>


34  [Item("TranslocationManipulator", "An operator which Manipulates a permutation array by moving a randomly chosen interval of elements to another (randomly chosen) position in the array. It is implemented as described in Michalewicz, Z. 1992. Genetic Algorithms + Data Structures = Evolution Programs, Springer Verlag, Berlin Heidelberg.")]


35  [StorableType("AB07D41533F146C083FAF7C1151B8AC8")]


36  public class TranslocationManipulator : PermutationManipulator {


37  [StorableConstructor]


38  protected TranslocationManipulator(StorableConstructorFlag _) : base(_) { }


39  protected TranslocationManipulator(TranslocationManipulator original, Cloner cloner) : base(original, cloner) { }


40  public TranslocationManipulator() : base() { }


41 


42  public override IDeepCloneable Clone(Cloner cloner) {


43  return new TranslocationManipulator(this, cloner);


44  }


45 


46  /// <summary>


47  /// Moves a randomly chosen interval of elements to another (randomly chosen) position in the given


48  /// <paramref name="permutation"/> array.


49  /// </summary>


50  /// <param name="random">The random number generator.</param>


51  /// <param name="permutation">The permutation array to manipulate.</param>


52  public static void Apply(IRandom random, Permutation permutation) {


53  int breakPoint1, breakPoint2, insertPoint, insertPointLimit;


54 


55  breakPoint1 = random.Next(permutation.Length  1);


56  breakPoint2 = random.Next(breakPoint1 + 1, permutation.Length);


57  insertPointLimit = permutation.Length  breakPoint2 + breakPoint1  1; // get insertion point in remaining part


58  if (insertPointLimit > 0)


59  insertPoint = random.Next(insertPointLimit);


60  else


61  insertPoint = 0;


62 


63  Apply(permutation, breakPoint1, breakPoint2, insertPoint);


64  }


65 


66  public static void Apply(Permutation permutation, int breakPoint1, int breakPoint2, int insertPoint) {


67  permutation.Move(breakPoint1, breakPoint2, insertPoint);


68  }


69 


70  /// <summary>


71  /// Moves a randomly chosen interval of elements to another (randomly chosen) position in the given


72  /// <paramref name="permutation"/> array.


73  /// </summary>


74  /// <remarks>Calls <see cref="Apply"/>.</remarks>


75  /// <param name="random">A random number generator.</param>


76  /// <param name="permutation">The permutation to manipulate.</param>


77  protected override void Manipulate(IRandom random, Permutation permutation) {


78  Apply(random, permutation);


79  }


80  }


81  }

