From d66c4569b4e629443b0b53b75380339af7138e56 Mon Sep 17 00:00:00 2001 From: Smoren Date: Mon, 27 May 2024 15:26:54 +0300 Subject: [PATCH] Fixes and refactor. --- src/lib/genetic/factories.ts | 2 +- src/lib/genetic/genetic.ts | 48 ++++++++++++++++++++++++++++++++++++ src/lib/types/genetic.ts | 2 +- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/lib/genetic/factories.ts b/src/lib/genetic/factories.ts index 74cfc1b..bb5566e 100644 --- a/src/lib/genetic/factories.ts +++ b/src/lib/genetic/factories.ts @@ -78,7 +78,7 @@ export function createRandomSearchByTypesConfig(config: RandomSearchByTypesConfi populate: new MutationPopulateStrategy( config.sourceTypesConfig, populateRandomTypesConfig, - config.geneticSearchMacroConfig.mutationProbability, + config.mutationStrategyConfig.probability, ), runner: new CachedMultiprocessingRunnerStrategy(config.runnerStrategyConfig), mutation: new MutationFromSourceStrategy(config.mutationStrategyConfig, mutationRandomTypesConfig, config.sourceTypesConfig), diff --git a/src/lib/genetic/genetic.ts b/src/lib/genetic/genetic.ts index 9704506..95b7182 100644 --- a/src/lib/genetic/genetic.ts +++ b/src/lib/genetic/genetic.ts @@ -62,6 +62,10 @@ export class GeneticSearch implements GeneticSearchInterface { return this.population; } + public setPopulation(population: Population) { + this.population = population; + } + private createPopulation(size: number): Population { return this.strategy.populate .populate(size) @@ -138,3 +142,47 @@ export class GeneticSearch implements GeneticSearchInterface { return [countToSurvive, countToCross, countToClone]; } } + +export class ComposedGeneticSearch implements GeneticSearchInterface { + private readonly eliminators: GeneticSearchInterface[]; + private readonly final: GeneticSearchInterface; + + constructor(eliminators: GeneticSearchInterface[], final: GeneticSearchInterface) { + this.eliminators = eliminators; + this.final = final; + } + + public getPopulation(): Population { + const result: Population = []; + for (const eliminators of this.eliminators) { + result.push(...eliminators.getPopulation()); + } + return result; + } + + public setPopulation(): void { + throw new Error('Cannot set population of composed search.'); + } + + public async run(generationsCount: number, afterStep: GenerationCallback): Promise { + for (let i=0; i { + for (const eliminators of this.eliminators) { + await eliminators.runGenerationStep(); + } + this.final.setPopulation(this.getBestGenomes()); + return await this.final.runGenerationStep(); + } + + public getBestGenome(): Genome { + return this.final.getBestGenome(); + } + + private getBestGenomes(): Population { + return this.eliminators.map((eliminators) => eliminators.getBestGenome()); + } +} diff --git a/src/lib/types/genetic.ts b/src/lib/types/genetic.ts index 9cf0080..472b40d 100644 --- a/src/lib/types/genetic.ts +++ b/src/lib/types/genetic.ts @@ -5,7 +5,6 @@ export type GeneticSearchMacroConfig = { populationSize: number; survivalRate: number; crossoverRate: number; - mutationProbability: number; }; export type GeneticSearchInputConfig = { @@ -80,6 +79,7 @@ export interface GeneticSearchInterface { runGenerationStep(): Promise<[number[], number[]]>; getBestGenome(): Genome; getPopulation(): Population; + setPopulation(population: Population): void; } export interface PopulateStrategyInterface {