using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Data; using HeuristicLab.Encodings.RealVectorEncoding; using HeuristicLab.Optimization; using HeuristicLab.Parameters; using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; namespace HeuristicLab.Algorithms.SAPBA.Strategies { public class GenerationalStrategy : StrategyBase { public const string NoGenerationsParameterName = "Number of generations"; public IFixedValueParameter NoGenerationsParameter => Parameters[NoGenerationsParameterName] as IFixedValueParameter; public IntValue NoGenerations => NoGenerationsParameter.Value; [Storable] public int Generations; #region Constructors private GenerationalStrategy(GenerationalStrategy original, Cloner cloner) : base(original, cloner) { Generations = original.Generations; } public GenerationalStrategy() { Parameters.Add(new FixedValueParameter(NoGenerationsParameterName, "The number of generations before a new model is constructed", new IntValue(3))); } public override IDeepCloneable Clone(Cloner cloner) { return new GenerationalStrategy(this, cloner); } #endregion public override double Evaluate(RealVector r, IRandom random) { return EstimateSample(r, random).Item2; } protected override void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, ResultCollection globalResults, IRandom random) { } protected override void ProcessPopulation(Individual[] individuals, double[] qualities, IRandom random) { if (RegressionSolution != null && Generations < NoGenerations.Value) Generations++; else { foreach (var indi in individuals) EvaluateSample(indi.RealVector(), random); BuildRegressionSolution(random); Generations = 0; } } protected override void Initialize() { Generations = 0; } } }