UNPKG

genetic-js-no-ww

Version:

Advanced genetic and evolutionary algorithm library (no web workers fork)

138 lines (91 loc) 7.12 kB
# Genetic.js Advanced genetic and evolutionary algorithm library written in Javascript by [Sub Protocol](http://subprotocol.com/). ## Fork This fork by [framp](http://framp.me) removes the automatic spinning of a new web worker. I believe spinning a new web worker should be responsibility of the user and coupling it to an optimisation library just worsen the experience for developers. This fork is perfectly compatible with web workers - you just need to manage it yourself. #### Rational The existing Javascript GA/EP library landscape could collectively be summed up as, meh. All that I required to take over the world was a lightweight, performant, feature-rich, nodejs + browser compatible, unit tested, and easily hackable GA/EP library. Until now, no such thing existed. Now you can have my cake, and optimize it too. Is it perfect? *Probably*. Regardless, this library is my gift to you. Have fun optimizing all your optimizations! #### Examples * [Genetic Phrase Solver](http://subprotocol.com/system/genetic-hello-world.html) * [Genetic Curve Fitter](http://subprotocol.com/system/genetic-regression-curve.html) #### Install ```bash npm install genetic-js ``` ## Population Functions The genetic-js interface exposes a few simple concepts and primitives, you just fill in the details/features you want to use. | Function | Return Type | Required | Description | ----------------------------------------- | ------------------------ | ---------- | ----------- | seed() | Individual | Yes | Called to create an individual, can be of any type (int, float, string, array, object) | fitness(individual) | Float | Yes | Computes a fitness score for an individual | mutate(individual) | Individual | Optional | Called when an individual has been selected for mutation | crossover(mother, father) | [Son, Daughter] | Optional | Called when two individuals are selected for mating. Two children should always returned | optimize(fitness, fitness) | Boolean | Yes | Determines if the first fitness score is better than the second. See [Optimizer](#optimizer) section below | select1(population) | Individual | Yes | See [Selection](#selection) section below | select2(population) | Individual | Optional | Selects a pair of individuals from a population. [Selection](#selection) | generation(pop, gen, stats) | Boolean | Optional | Called for each generation. Return false to terminate end algorithm (ie- if goal state is reached) | notification(pop, gen, stats, isFinished) | Void | Optional | Runs in the calling context. ## Optimizer 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 `Genetic.Optimize.Minimize` would be used, as a smaller fitness score is indicative of better fit. | Optimizer | Description | -------------------------- | ----------- | Genetic.Optimize.Minimizer | The smaller fitness score of two individuals is best | Genetic.Optimize.Maximizer | The greater fitness score of two individuals is best ## Selection 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 (select1) operator. If both Single and Pair-wise operations are used (and if crossover is implemented) it is genetic. | Select Type | Required | Description | ------------------- | ----------- | ----------- | select1 (Single) | Yes | Selects a single individual for survival from a population | select2 (Pair-wise) | Optional | Selects two individuals from a population for mating/crossover ### Selection Operators | Single Selectors | Description | -------------------------------- | ----------- | Genetic.Select1.Tournament2 | Fittest of two random individuals | Genetic.Select1.Tournament3 | Fittest of three random individuals | Genetic.Select1.Fittest | Always selects the Fittest individual | Genetic.Select1.Random | Randomly selects an individual | Genetic.Select1.RandomLinearRank | Select random individual where probability is a linear function of rank | Genetic.Select1.Sequential | Sequentially selects an individual | Pair-wise Selectors | Description | -------------------------------- | ----------- | Genetic.Select2.Tournament2 | Pairs two individuals, each the best from a random pair | Genetic.Select2.Tournament3 | Pairs two individuals, each the best from a random triplett | Genetic.Select2.Random | Randomly pairs two individuals | Genetic.Select2.RandomLinearRank | Pairs two individuals, each randomly selected from a linear rank | Genetic.Select2.Sequential | Selects adjacent pairs | Genetic.Select2.FittestRandom | Pairs the most fit individual with random individuals ```javascript var genetic = Genetic.create(); // more likely allows the most fit individuals to survive between generations genetic.select1 = Genetic.Select1.RandomLinearRank; // always mates the most fit individual with random individuals genetic.select2 = Genetic.Select2.FittestRandom; // ... ``` ## Configuration Parameters | Parameter | Default | Range/Type | Description | --------------------- | -------- | ---------- | ----------- | size | 250 | Real Number | Population size | crossover | 0.9 | [0.0, 1.0] | Probability of crossover | mutation | 0.2 | [0.0, 1.0] | Probability of mutation | iterations | 100 | Real Number | Maximum number of iterations before finishing | fittestAlwaysSurvives | true | Boolean | Prevents losing the best fit between generations | maxResults | 100 | Real Number | The maximum number of best-fit results that will be sent per notification | skip | 0 | Real Number | Setting this higher throttles back how frequently `genetic.notification` gets called in the main thread. ## Building To clone, build, and test Genetic.js issue the following command: ```bash git clone git@github.com:subprotocol/genetic-js.git && make distcheck ``` | Command | Description | --------------------- | ----------- | make | Automatically install dev-dependencies, builds project, places library to js/ folder | make check | Runs test cases | make clean | Removes files from js/ library | make distclean | Removes both files from js/ library and dev-dependencies | make distcheck | Equivlant to running `make distclean && make && check` ## Contributing Feel free to open issues and send pull-requests.