13.4.0 • Published 7 months ago

genetic-search v13.4.0

Weekly downloads
-
License
MIT
Repository
github
Last release
7 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

7 months ago

13.1.1

7 months ago

13.3.0

7 months ago

13.1.0

7 months ago

12.0.0

7 months ago

11.0.0

7 months ago

11.0.1

7 months ago

13.4.0

7 months ago

13.2.0

7 months ago

13.0.0

7 months ago

10.0.0

7 months ago

10.0.1

7 months ago

8.1.0

7 months ago

8.1.1

7 months ago

8.0.0

7 months ago

8.2.1

7 months ago

8.2.0

7 months ago

9.0.2

7 months ago

9.0.1

7 months ago

9.0.0

7 months ago

6.1.0

9 months ago

7.1.1

8 months ago

7.1.0

9 months ago

6.0.1

9 months ago

6.0.0

9 months ago

6.2.1

9 months ago

6.2.0

9 months ago

7.0.0

9 months ago

7.0.3

9 months ago

7.0.2

9 months ago

7.0.1

9 months ago

5.5.1

9 months ago

5.5.0

9 months ago

5.4.1

9 months ago

5.4.0

9 months ago

5.3.0

9 months ago

5.5.5

9 months ago

5.5.4

9 months ago

5.5.3

9 months ago

5.5.2

9 months ago

5.2.0

9 months ago

5.1.0

9 months ago

5.0.2

9 months ago

5.0.1

9 months ago

5.0.0

9 months ago

4.2.2

9 months ago

4.1.0

9 months ago

4.0.0

9 months ago

4.2.1

9 months ago

4.2.0

9 months ago

1.0.0

10 months ago

3.0.1

9 months ago

3.0.0

9 months ago

2.0.2

9 months ago

0.3.0

10 months ago

0.5.0

10 months ago

0.4.0

10 months ago

2.0.1

9 months ago

2.0.0

9 months ago

0.6.0

10 months ago

0.2.3

10 months ago

0.2.4

10 months ago

0.2.2

10 months ago

0.2.1

10 months ago

0.2.0

10 months ago

0.1.3

10 months ago

0.1.2

10 months ago

0.1.1

10 months ago

0.1.0

10 months ago