using System; using System.Linq; using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Data; using HeuristicLab.Encodings.RealVectorEncoding; using HeuristicLab.Optimization; using HeuristicLab.Parameters; namespace HeuristicLab.Algorithms.SAPBA.Strategies { public class IndividualStrategy : StrategyBase { public const string SampledIndividualsParameterName = "SampledIndividals"; public IFixedValueParameter SampledIndividualsParameter => Parameters[SampledIndividualsParameterName] as IFixedValueParameter; public IntValue SampledIndividuals => SampledIndividualsParameter.Value; #region Constructors private IndividualStrategy(IndividualStrategy original, Cloner cloner) : base(original, cloner) { } public IndividualStrategy() { Parameters.Add(new FixedValueParameter(SampledIndividualsParameterName, "The number of individuals that are sampled each generation", new IntValue(3))); } public override IDeepCloneable Clone(Cloner cloner) { return new IndividualStrategy(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) { var samples = individuals.Zip(qualities, (individual, d) => new Tuple(individual, d)).OrderBy(t => Algorithm.Problem.Maximization ? -t.Item2 : t.Item2).Take(SampledIndividuals.Value).Select(t => t.Item1.RealVector()); foreach (var indi in samples) EvaluateSample(indi, random); BuildRegressionSolution(random); } protected override void Initialize() { } } }