microverse is a tiny library for quickly prototyping genetic algorithms. currently only compatible with node.
npm i -S microverse
- Chromosomes are now instances of
Array
.
let {Algorithm, Operators} = require('microverse');
let {Crossovers, Selectors} = Operators;
let population = [];
//Generate a random population somehow
for (let i = 0; i < 5; i++) {
let chromosome = [...];
population.push(chromosome);
}
let opts = {...};
let alg = new Algorithm(opts);
//Subscribe to events
alg.on('evaluation', info => {...});
alg.on('selection', info => {...});
alg.on('crossover', info => {...});
alg.on('generation', info => {...});
alg.on('end', info => {...});
//Run the algorithm indefinitely or until the criteria has met
alg.run().then(info => {...});
//Run the algorithm for 100 iterations or until the criteria has met
alg.run(100).then(info => {...});
//Pipe the progress (will stream json string 'generation' events)
alg.pipe(process.stdout);
- lazyEval:
Boolean
(optional, default:false
) - will evaluate each solution only once. - population:
Array
(required) - an array of chromosomes. - crossover:
function (parents, done)
(required) - errback accepts the offspring created. - selector:
function (population, done)
(required) - errback accepts the selected parents from the population created. - mutator:
function (chromosome, done)
(optional, default:(chromosome, done) => done()
). errback accepts the mutated chromosome (falsely for unchanged). - fitnessFn:
function (chromosome, done)
(required) - errback accepts the fitness value for this chromosome. Lowest fitness-Infinity
, highest fitnessInfinity
. To reverse this effect (in case of Error measurements like RMS) just prepend the negative signdone(null, -fitness)
- stopCriteria:
function (leader, population)
(optional, default:(leader, population) => false
) - A synchronous stop criteria to evaluate for each generation (truthy or falsely). - steadyState: (optional, default:
false
) - will determine if the algorithm should use the steady-state concept.
let {Crossovers, Selectors} = require('microverse').Operators;
let {SinglePoint, DoublePoint, Uniform, Arithmetic} = Crossovers;
let {Elitism, Roulette, Rank} = Selectors;
//Returns a selector function that selects
//2 parents based on the Roulette Wheel algorithm.
let rws = Roulette(2);
//Returns a crossover function that spreads
//parents traits evenly across a new offspring
let uxo = Uniform;
Note: Read more about crossovers and selectors.
- Stream / Generator support as population output.
- Add more crossover functions (Single Point, Double Point, Arithmetic).
- Add more selector functions (Roulette Wheel, Rank, Steady-State).
- Proper object stream output.
- Add genetic programming example.
- Make it available to browsers.
- Benchmarks.
Install dependencies: npm i
Run tests: npm test