genetic = {
const genetic = Genetic.create();
genetic.optimize = Genetic.Optimize.Minimize;
genetic.select1 = Genetic.Select1.Tournament2;
genetic.select2 = Genetic.Select2.FittestRandom;
const graph = { vertices: [] };
genetic.seed = function() {
var a = [];
var i;
for (i = 0; i < this.userData["terms"]; ++i) {
a.push(Math.random() - 0.5);
}
return a;
};
genetic.mutate = function(entity) {
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) {
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];
};
// example 3 term polynomial: cx^0 + bx^1 + ax^2
genetic.evaluate = evaluate;
genetic.fitness = function(entity) {
var sumSqErr = 0;
var vertices = this.userData["vertices"];
var i;
for (i = 0; i < vertices.length; ++i) {
var err = this.evaluate(entity, vertices[i][0]) - vertices[i][1];
sumSqErr += err * err;
}
return sumSqErr;
};
genetic.generation = function(pop, generation, stats) {
stats.run = this.userData.run;
};
// this is in user space
genetic.notification = function(pop, generation, stats, isFinished) {
if (this.userData.run === stats.run) mutable notified = arguments;
else console.warn("skipping", this.userData.run);
};
return genetic;
}