Skip to content

muliyul/microverse

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

microverse

microverse is a tiny library for quickly prototyping genetic algorithms. currently only compatible with node.

Install

npm i -S microverse

Breaking Changes (v1.1.0):
  • Chromosomes are now instances of Array.
Usage (TL;DR):
    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); 
Options:
  • 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 fitness Infinity. To reverse this effect (in case of Error measurements like RMS) just prepend the negative sign done(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.

Factories:

    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.

TODO

  • 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.

Development

Install dependencies: npm i

Run tests: npm test