13.4.0 • Published 5 months ago

genetic-search v13.4.0

Weekly downloads
-
License
MIT
Repository
github
Last release
5 months ago

Multiprocessing Genetic Algorithm Implementation for TypeScript

npm npm Coverage Status Build and test Minified Size License: MIT

Logo

Setup

npm i genetic-search

Usage example

Let's get a max value of the parabola: y = -(x-12)^2 - 3.

import type {
  GeneticSearchConfig,
  GeneticSearchStrategyConfig,
} from "genetic-search";
import {
  GeneticSearch,
  SimpleMetricsCache,
} from "genetic-search";

const config: GeneticSearchConfig = {
  populationSize: 100,
  survivalRate: 0.5,
  crossoverRate: 0.5,
};

const strategies: GeneticSearchStrategyConfig<ParabolaArgumentGenome> = {
  populate: new ParabolaPopulateStrategy(),
  metrics: new ParabolaMultiprocessingMetricsStrategy({
    poolSize: 4,
    task: async (data) => [-((data[0] - 12)**2) - 3],
    onTaskResult: () => void 0,
  }),
  fitness: new ParabolaMaxValueFitnessStrategy(),
  mutation: new ParabolaMutationStrategy(),
  crossover: new ParabolaCrossoverStrategy(),
  cache: new SimpleMetricsCache(),
}

const search = new GeneticSearch(config, strategies);

expect(search.partitions).toEqual([50, 25, 25]);

await search.fit({
  generationsCount: 100,
  beforeStep: () => void 0,
  afterStep: () => void 0,
});

const bestGenome = search.bestGenome;
console.log('Best genome:', bestGenome);

Strategies implementation:

import type {
  BaseGenome,
  BaseMutationStrategyConfig,
  CrossoverStrategyInterface,
  FitnessStrategyInterface,
  GenerationFitnessColumn,
  GenerationMetricsMatrix,
  IdGeneratorInterface,
  MultiprocessingMetricsStrategyConfig,
  PopulateStrategyInterface,
} from "genetic-search";
import {
  BaseMultiprocessingMetricsStrategy,
  BaseMutationStrategy,
} from "genetic-search";

export type ParabolaArgumentGenome = BaseGenome & {
  id: number;
  x: number;
}

export type ParabolaTaskConfig = [number];

export class ParabolaPopulateStrategy implements PopulateStrategyInterface<ParabolaArgumentGenome> {
  populate(size: number, idGenerator: IdGeneratorInterface<ParabolaArgumentGenome>): ParabolaArgumentGenome[] {
    const result: ParabolaArgumentGenome[] = [];
    for (let i=0; i<size; ++i) {
      result.push({ id: idGenerator.nextId(), x: Math.random() * 200 - 100 });
    }
    return result;
  }
}

export class ParabolaMutationStrategy extends BaseMutationStrategy<ParabolaArgumentGenome, BaseMutationStrategyConfig> {
  constructor() {
    super({ probability: 1 });
  }

  mutate(genome: ParabolaArgumentGenome, newGenomeId: number): ParabolaArgumentGenome {
    return { x: genome.x + Math.random() * 10 - 5, id: newGenomeId };
  }
}

export class ParabolaCrossoverStrategy implements CrossoverStrategyInterface<ParabolaArgumentGenome> {
  cross(lhs: ParabolaArgumentGenome, rhs: ParabolaArgumentGenome, newGenomeId: number): ParabolaArgumentGenome {
    return { x: (lhs.x + rhs.x) / 2, id: newGenomeId };
  }
}

export class ParabolaMultiprocessingMetricsStrategy extends BaseMultiprocessingMetricsStrategy<ParabolaArgumentGenome, MultiprocessingMetricsStrategyConfig<ParabolaTaskConfig>, ParabolaTaskConfig> {
  protected createTaskInput(genome: ParabolaArgumentGenome): ParabolaTaskConfig {
    return [genome.x];
  }
}

export class ParabolaMaxValueFitnessStrategy implements FitnessStrategyInterface {
  score(results: GenerationMetricsMatrix): GenerationFitnessColumn {
    return results.map((result) => result[0]);
  }
}

Unit testing

npm i
npm run test

License

Genetic Search TS is licensed under the MIT License.

13.3.1

5 months ago

13.1.1

5 months ago

13.3.0

5 months ago

13.1.0

5 months ago

12.0.0

5 months ago

11.0.0

5 months ago

11.0.1

5 months ago

13.4.0

5 months ago

13.2.0

5 months ago

13.0.0

5 months ago

10.0.0

5 months ago

10.0.1

5 months ago

8.1.0

5 months ago

8.1.1

5 months ago

8.0.0

5 months ago

8.2.1

5 months ago

8.2.0

5 months ago

9.0.2

5 months ago

9.0.1

5 months ago

9.0.0

5 months ago

6.1.0

6 months ago

7.1.1

6 months ago

7.1.0

6 months ago

6.0.1

6 months ago

6.0.0

6 months ago

6.2.1

6 months ago

6.2.0

6 months ago

7.0.0

6 months ago

7.0.3

6 months ago

7.0.2

6 months ago

7.0.1

6 months ago

5.5.1

7 months ago

5.5.0

7 months ago

5.4.1

7 months ago

5.4.0

7 months ago

5.3.0

7 months ago

5.5.5

7 months ago

5.5.4

7 months ago

5.5.3

7 months ago

5.5.2

7 months ago

5.2.0

7 months ago

5.1.0

7 months ago

5.0.2

7 months ago

5.0.1

7 months ago

5.0.0

7 months ago

4.2.2

7 months ago

4.1.0

7 months ago

4.0.0

7 months ago

4.2.1

7 months ago

4.2.0

7 months ago

1.0.0

7 months ago

3.0.1

7 months ago

3.0.0

7 months ago

2.0.2

7 months ago

0.3.0

7 months ago

0.5.0

7 months ago

0.4.0

7 months ago

2.0.1

7 months ago

2.0.0

7 months ago

0.6.0

7 months ago

0.2.3

8 months ago

0.2.4

7 months ago

0.2.2

8 months ago

0.2.1

8 months ago

0.2.0

8 months ago

0.1.3

8 months ago

0.1.2

8 months ago

0.1.1

8 months ago

0.1.0

8 months ago