1  #region License Information


2  /* HeuristicLab


3  * Copyright (C) 20022010 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 System;


23  using HeuristicLab.Core;


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


25  using HeuristicLab.Optimization;


26 


27  namespace HeuristicLab.Encodings.PermutationEncoding {


28  [Item("ExhaustiveTwoOptMoveGenerator", "Generates all possible 2opt moves from a given permutation.")]


29  [StorableClass]


30  public class ExhaustiveTwoOptMoveGenerator : TwoOptMoveGenerator, IExhaustiveMoveGenerator {


31  public static TwoOptMove[] Apply(Permutation permutation) {


32  int length = permutation.Length;


33  int totalMoves = (length) * (length  1) / 2  3;


34  TwoOptMove[] moves = new TwoOptMove[totalMoves];


35  int count = 0;


36  for (int i = 0; i < length  1; i++)


37  for (int j = i + 1; j < length; j++) {


38  // doesn't make sense to inverse the whole permutation or the whole but one


39  if (i == 0 && j >= length  2) continue;


40  else if (i == 1 && j >= length  1) continue;


41  moves[count++] = new TwoOptMove(i, j);


42  }


43  return moves;


44  }


45 


46  protected override TwoOptMove[] GenerateMoves(Permutation permutation) {


47  return Apply(permutation);


48  }


49  }


50  }

