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


23  using HeuristicLab.Collections;


24  using HeuristicLab.Core;


25  using HeuristicLab.Operators;


26  using HeuristicLab.Optimization;


27  using HeuristicLab.Parameters;


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


29 


30  namespace HeuristicLab.Encodings.PermutationEncoding {


31  [Item("MultiPermutationCrossover", "Randomly selects and applies one of its crossovers every time it is called.")]


32  [StorableClass]


33  public class MultiPermutationCrossover : StochasticMultiOperator<IPermutationCrossover>, IPermutationCrossover, IStochasticOperator {


34  public override bool CanChangeName {


35  get { return false; }


36  }


37  protected override bool CreateChildOperation {


38  get { return true; }


39  }


40 


41  public ILookupParameter<ItemArray<Permutation>> ParentsParameter {


42  get { return (ILookupParameter<ItemArray<Permutation>>)Parameters["Parents"]; }


43  }


44 


45  public ILookupParameter<Permutation> ChildParameter {


46  get { return (ILookupParameter<Permutation>)Parameters["Child"]; }


47  }


48 


49  [StorableConstructor]


50  private MultiPermutationCrossover(bool deserializing) : base(deserializing) { }


51  public MultiPermutationCrossover()


52  : base() {


53  Parameters.Add(new SubScopesLookupParameter<Permutation>("Parents", "The parent permutations which should be crossed."));


54  ParentsParameter.ActualName = "Permutation";


55  Parameters.Add(new LookupParameter<Permutation>("Child", "The child permutation resulting from the crossover."));


56  ChildParameter.ActualName = "Permutation";


57  }


58 


59  protected override void Operators_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IPermutationCrossover>> e) {


60  base.Operators_ItemsReplaced(sender, e);


61  ParameterizeCrossovers();


62  }


63 


64  protected override void Operators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IPermutationCrossover>> e) {


65  base.Operators_ItemsAdded(sender, e);


66  ParameterizeCrossovers();


67  }


68 


69  private void ParameterizeCrossovers() {


70  foreach (IPermutationCrossover crossover in Operators.OfType<IPermutationCrossover>()) {


71  crossover.ChildParameter.ActualName = ChildParameter.Name;


72  crossover.ParentsParameter.ActualName = ParentsParameter.Name;


73  }


74  foreach (IStochasticOperator crossover in Operators.OfType<IStochasticOperator>()) {


75  crossover.RandomParameter.ActualName = RandomParameter.Name;


76  }


77  }


78  }


79  }

