/// <summary> /// Creates an instance of GA with a random initial population sample /// </summary> /// <param name="adapter">GA Adapter to be used by the algorithm</param> public GeneticAlgorithm(IGeneticAlgorithmAdapter <TIndividual, TGene> adapter) { initialPopulation = new Population <TIndividual, TGene>(SettingsAccessor.PopulationSize, SettingsAccessor.PopulationSize); currentGeneration = new Population <TIndividual, TGene>(initialPopulation); nextGeneration = new Population <TIndividual, TGene>(desiredSize: SettingsAccessor.PopulationSize); this.adapter = adapter; CurrentGenerationNumber = 1; Initialised?.Invoke(new GaEventArgs <TIndividual, TGene>(initialPopulation, CurrentGenerationNumber)); }
/// <summary> /// Creates an instance of GA whose initial population contains certain individuals /// (+ additional random individuals if desired population size is larger than number of defined ones) /// </summary> /// <param name="adapter">GA Adapter to be used by the algorithm</param> /// <param name="include">Set of individuals to be included in the initial population</param> public GeneticAlgorithm(IGeneticAlgorithmAdapter <TIndividual, TGene> adapter, ICollection <TIndividual> include) { int possibleToInclude = Math.Min(include.Count, SettingsAccessor.PopulationSize); int randomIndividualsRequired = SettingsAccessor.PopulationSize - possibleToInclude; initialPopulation = new Population <TIndividual, TGene>(randomIndividualsRequired, SettingsAccessor.PopulationSize); initialPopulation.AddRange(include.Take(possibleToInclude).ToArray()); currentGeneration = new Population <TIndividual, TGene>(initialPopulation); nextGeneration = new Population <TIndividual, TGene>(desiredSize: SettingsAccessor.PopulationSize); this.adapter = adapter; CurrentGenerationNumber = 1; Initialised?.Invoke(new GaEventArgs <TIndividual, TGene>(initialPopulation, CurrentGenerationNumber)); }