Skip to content

Commit

Permalink
Fixes and refactor.
Browse files Browse the repository at this point in the history
  • Loading branch information
Smoren committed May 27, 2024
1 parent 5ea7661 commit d66c456
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/lib/genetic/factories.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
48 changes: 48 additions & 0 deletions src/lib/genetic/genetic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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<void> {
for (let i=0; i<generationsCount; i++) {
afterStep(i, await this.runGenerationStep());
}
}

public async runGenerationStep(): Promise<[number[], number[]]> {
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());
}
}
2 changes: 1 addition & 1 deletion src/lib/types/genetic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ export type GeneticSearchMacroConfig = {
populationSize: number;
survivalRate: number;
crossoverRate: number;
mutationProbability: number;
};

export type GeneticSearchInputConfig = {
Expand Down Expand Up @@ -80,6 +79,7 @@ export interface GeneticSearchInterface {
runGenerationStep(): Promise<[number[], number[]]>;
getBestGenome(): Genome;
getPopulation(): Population;
setPopulation(population: Population): void;
}

export interface PopulateStrategyInterface {
Expand Down

0 comments on commit d66c456

Please sign in to comment.