genetic-js-no-ww
Version:
Advanced genetic and evolutionary algorithm library (no web workers fork)
125 lines (97 loc) • 2.47 kB
JavaScript
var Genetic = require("../lib/genetic");
var assert = require("assert");
var genetic;
beforeEach(function () {
genetic = Genetic.create();
genetic.optimize = Genetic.Optimize.Minimize;
genetic.seed = function() {
var a = [];
// create coefficients for polynomial with values between (-0.5, 0.5)
var i;
for (i=0;i<this.userData["terms"];++i) {
a.push(Math.random()-0.5);
}
return a;
};
genetic.mutate = function(entity) {
// allow chromosomal drift with this range (-0.05, 0.05)
var drift = ((Math.random()-0.5)*2)*0.05;
var i = Math.floor(Math.random()*entity.length);
entity[i] += drift;
return entity;
};
genetic.crossover = function(mother, father) {
// crossover via interpolation
function lerp(a, b, p) {
return a + (b-a)*p;
}
var len = mother.length;
var i = Math.floor(Math.random()*len);
var r = Math.random();
var son = [].concat(father);
var daughter = [].concat(mother);
son[i] = lerp(father[i], mother[i], r);
daughter[i] = lerp(mother[i], father[i], r);
return [son, daughter];
};
genetic.fitness = function(entity) {
function evaluatePoly(x) {
var s = 0;
var p = 1;
var i;
for (i=0;i<entity.length;++i) {
s += p*entity[i];
p *= x;
}
return s;
}
var sumSqErr = 0;
var m = 1;
var step = m/this.userData["resolution"];
var x;
for (x=0;x<m;x+=step) {
var err = evaluatePoly(x) - (x*x);
sumSqErr += err*err;
}
return Math.sqrt(sumSqErr);
};
genetic.generation = function(pop, generation, stats) {
return pop[0].fitness > 0.04;
};
});
function solveTest(sel1, sel2, config) {
it(sel1 + ", " + sel2, function (done) {
genetic.select1 = eval(sel1);
genetic.select2 = eval(sel2);
var gen0fitness;
genetic.notification = function(pop, generation, stats, isFinished) {
if (generation == 0) {
gen0fitness = pop[0].fitness;
}
if (isFinished) {
assert.equal(pop[0].fitness <= gen0fitness, true);
assert.equal(pop[0].fitness <= 0.04, true);
done();
}
};
var userData = {
"terms": 3
, "resolution": 3
};
genetic.evolve(config, userData);
});
}
describe("Genetic Parabolic Solver", function() {
var config = {
"iterations": 1000
, "size": 20
, "crossover": 0.3
, "mutation": 1.0
};
var k;
for (k in Genetic.Select1) {
for (j in Genetic.Select2) {
solveTest("Genetic.Select1."+k, "Genetic.Select2."+j, config);
}
};
});