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.Optimization;


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


26  using HeuristicLab.Problems.VehicleRouting.Encodings.Alba;


27  using HeuristicLab.Parameters;


28  using System.Collections.Generic;


29  using HeuristicLab.Problems.VehicleRouting.Encodings.General;


30 


31  namespace HeuristicLab.Problems.VehicleRouting.Encodings.Alba {


32  [Item("StochasticLambdaInterchangeSingleMoveGenerator", "Generates one random lambda interchange move from a given Alba VRP encoding.")]


33  [StorableClass]


34  public sealed class StochasticLambdaInterchangeSingleMoveGenerator : LambdaInterchangeMoveGenerator,


35  IStochasticOperator, ISingleMoveGenerator, IAlbaLambdaInterchangeMoveOperator, IMultiVRPMoveGenerator {


36  #region IMultiVRPMoveOperator Members


37 


38  public ILookupParameter VRPMoveParameter {


39  get { return (ILookupParameter)Parameters["LambdaInterchangeMove"]; }


40  }


41 


42  #endregion


43 


44  public ILookupParameter<IRandom> RandomParameter {


45  get { return (ILookupParameter<IRandom>)Parameters["Random"]; }


46  }


47 


48  [StorableConstructor]


49  private StochasticLambdaInterchangeSingleMoveGenerator(bool deserializing) : base(deserializing) { }


50 


51  public StochasticLambdaInterchangeSingleMoveGenerator()


52  : base() {


53  Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));


54  }


55 


56  public static LambdaInterchangeMove Apply(AlbaEncoding individual, int cities, int lambda, IRandom rand) {


57  int route1Index = rand.Next(individual.Tours.Count);


58  Tour route1 = individual.Tours[route1Index];


59 


60  int route2Index = rand.Next(individual.Tours.Count  1);


61  if (route2Index >= route1Index)


62  route2Index += 1;


63  Tour route2 = individual.Tours[route2Index];


64 


65  int length1 = rand.Next(Math.Min(lambda + 1, route1.Cities.Count + 1));


66  int index1 = rand.Next(route1.Cities.Count  length1 + 1);


67 


68  int l2Min = 0;


69  if (length1 == 0)


70  l2Min = 1;


71  int length2 = rand.Next(l2Min, Math.Min(lambda + 1, route2.Cities.Count + 1));


72  int index2 = rand.Next(route2.Cities.Count  length2 + 1);


73 


74  return new LambdaInterchangeMove(route1Index, index1, length1, route2Index, index2, length2);


75  }


76 


77  protected override LambdaInterchangeMove[] GenerateMoves(AlbaEncoding individual, int lambda) {


78  List<LambdaInterchangeMove> moves = new List<LambdaInterchangeMove>();


79 


80  LambdaInterchangeMove move = Apply(individual, Cities, lambda, RandomParameter.ActualValue);


81  if(move != null)


82  moves.Add(move);


83 


84  return moves.ToArray();


85  }


86  }


87  }

