#region License Information /* HeuristicLab * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL) * * This file is part of HeuristicLab. * * HeuristicLab is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * HeuristicLab is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HeuristicLab. If not, see . */ #endregion using System; using System.Collections.Generic; using System.Linq; using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Data; using HeuristicLab.Operators; using HeuristicLab.Parameters; using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; namespace HeuristicLab.Algorithms.ALPS { [Item("ContinuousMatingPoolCreator", "An operator which creates mating pools based on a set of sub-populations. For each sub-population, the individuals from the previous sub-population are copied into the current sub-population.")] [StorableClass] public sealed class ContinuousMatingPoolCreator : SingleSuccessorOperator, IMatingPoolCreator { public IValueLookupParameter RangesParameter { get { return (IValueLookupParameter)Parameters["Ranges"]; } } public IScopeTreeLookupParameter QualityParameter { get { return (IScopeTreeLookupParameter)Parameters["Quality"]; } } public IValueLookupParameter MaximizationParameter { get { return (IValueLookupParameter)Parameters["Maximization"]; } } #region Constructor, Cloning & Persistence public ContinuousMatingPoolCreator() : base() { Parameters.Add(new ValueLookupParameter("Ranges", "The range of sub-populations used for creating a mating pool. (1 = current + previous sub-population)")); Parameters.Add(new ScopeTreeLookupParameter("Quality", "The quality value contained in each sub-scope which is used for selection.")); Parameters.Add(new ValueLookupParameter("Maximization", "True if the current problem is a maximization problem, otherwise false.")); } private ContinuousMatingPoolCreator(ContinuousMatingPoolCreator original, Cloner cloner) : base(original, cloner) { } public override IDeepCloneable Clone(Cloner cloner) { return new ContinuousMatingPoolCreator(this, cloner); } [StorableConstructor] private ContinuousMatingPoolCreator(bool deserializing) : base(deserializing) { } #endregion /// /// Copies the subscopes of the n previous scopes into the current scope. (default n = 1) ///
    ///          __ scope __              __ scope __
    ///         /     |     \            /     |     \
    ///       Pop1   Pop2   Pop3  =>   Pop1   Pop2   Pop3
    ///       /|\    /|\    /|\         /|\   /|\    /|\
    ///       ABC    DEF    GHI         ABC   DEF    GHI
    ///                                       ABC    DEF
    /// 
///
/// The next operation. public override IOperation Apply() { var subScopes = ExecutionContext.Scope.SubScopes; var ranges = RangesParameter.ActualValue; var qualityName = QualityParameter.TranslatedName; bool maximization = MaximizationParameter.ActualValue.Value; for (int targetIndex = subScopes.Count - 1; targetIndex > 0; targetIndex--) { var targetScope = subScopes[targetIndex]; var range = ranges.Length == 1 ? ranges[0] : ranges[targetIndex]; for (int n = 1; (n <= (range + 1)) && (targetIndex - n >= 0); n++) { var prevScope = subScopes[targetIndex - n]; IEnumerable individuals = prevScope.SubScopes .OrderBy(i => ((DoubleValue)i.Variables[qualityName].Value).Value); if (maximization) individuals = individuals.Reverse(); individuals = individuals.Take((int)(Math.Min(range + 1 - n, 1.0) * prevScope.SubScopes.Count)); foreach (var individual in individuals) { targetScope.SubScopes.Add((IScope)individual.Clone()); } } } return base.Apply(); } } }