Advanced genetic and evolutionary algorithm library written in Javascript by notVitaliy.
yarn add evjs
import { EvJs } from 'evjs'
const seed = () => {
// Seed code here
}
const fitness = () => {
// calculate fitness score
}
const mutate = () => {
// mutate an individuals param(s)
}
const mate = () => {
// breed 2 individuals
}
const evjsConfig = {
notification: 0.5 // emit 50% of the logs
}
const generationConfig = {
size: 10,
crossover: 0.7,
mutation: 0.4,
keepFittest: true,
select: 'random',
pair: 'tournament2',
optimizeKey: 'Max'
}
const individualConfig = {
fitness,
mutate,
mate
}
const config = Object.assign({}, evjsConfig, generationConfig, individualConfig)
const evjs = new EvJs(config)
evjs.populate(seed)
evjs.run()
interface GenerationConfig {
size?: number
crossover?: number
mutation?: number
keepFittest?: boolean
optimizeKey?: 'Max' | 'Min'
select: string
selectN?: number
pair?: string
}
Parameter | Default | Range/Type | Description |
---|---|---|---|
size | 250 | Number | Population size |
crossover | 0.9 | [0.0, 1.0] | Probability of crossover/breeding |
mutation | 0.2 | [0.0, 1.0] | Probability of mutation |
iterations | 100 | Real Number | Maximum number of iterations before finishing |
keepFittest | true | Boolean | Prevents losing the best fit between generations |
optimizeKey | Max | [Max, Min] | Optimization method to use |
select | N/A | SelectType | Generation->mutate select type to use |
pair | N/A | SelectType | Generation->breed select type to use |
Selectors | Description |
---|---|
Tournament{N} | Fittest of N random individuals |
Fittest | Always selects the Fittest individual |
Random | Randomly selects an individual |
The optimizer specifies how to rank individuals against each other based on an arbitrary fitness score. For example, minimizing the sum of squared error for a regression curve Min
would be used, as a smaller fitness score is indicative of better fit.
optimizeKey | Description |
---|---|
Min | The smaller fitness score of two individuals is best |
Max | The greater fitness score of two individuals is best |
An algorithm can be either genetic or evolutionary depending on which selection operations are used. An algorithm is evolutionary if it only uses a Single SelectType. If both Single and Pair-wise operations are used (and if crossover is implemented) it is genetic.
Select Type | Required | Description |
---|---|---|
select (Single) | Yes | Selects a single individual for survival from a population |
pair (Pair-wise) | Optional | Selects two individuals from a population for mating/crossover |
interface IndividualConfig {
fitness: (entity: any): number
mutate: (entity: any): any
mate: (mother: any, father: any): [any, any]
}
Parameter | Type | Description |
---|---|---|
fitness | Function | Calculates the fitness score of an individual |
mutate | Function | Mutates an individual |
mate | Function | Mates 2 individuals and returns 2 new individuals |
To clone, build, and test Genetic.js issue the following command:
git clone [email protected]:notvitaliy/evjs.git
Command | Description |
---|---|
yarn | Automatically install dev-dependencies |
npm test | Run unit tests |
Feel free to open issues and send pull-requests.