@adrianperea/genie.js
Version:
A highly flexible, data-agnostic, and UI-independent Genetic Algorithm Library
69 lines (58 loc) • 2.23 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.crossover = crossover;
exports.onepoint = onepoint;
exports.multipoint = multipoint;
exports.uniform = uniform;
var _random = require("../utils/random");
function crossover(parentOne, parentTwo, crossoverFunc) {
var childDna = _getChildDna(parentOne, parentTwo, crossoverFunc);
return new parentOne.constructor(childDna);
}
function _getChildDna(parentOne, parentTwo, crossoverFunc) {
var childDna = parentOne.dna.map(function (parentOneChromosome, i) {
var parentTwoChromosome = parentTwo.dna[i];
var genes = crossoverFunc(parentOneChromosome, parentTwoChromosome);
return parentOneChromosome.copyWithGenes(genes);
});
return childDna;
}
function onepoint(chromosomeOne, chromosomeTwo) {
var point = (0, _random.randBetween)(0, chromosomeOne.length);
return _onepoint(chromosomeOne, chromosomeTwo, point);
}
function _onepoint(chromosomeOne, chromosomeTwo, point) {
var childGenes = chromosomeOne.genes.map(function (geneOne, i) {
var geneTwo = chromosomeTwo.genes[i];
return i < point ? geneOne : geneTwo;
});
return childGenes;
}
function multipoint(chromosomeOne, chromosomeTwo) {
var pointOne = (0, _random.randBetween)(0, chromosomeOne.length);
var pointTwo = (0, _random.randBetween)(pointOne, chromosomeOne.length);
return _multipoint(chromosomeOne, chromosomeTwo, pointOne, pointTwo);
}
function _multipoint(chromosomeOne, chromosomeTwo, pointOne, pointTwo) {
var childGenes = chromosomeOne.genes.map(function (geneOne, i) {
var geneTwo = chromosomeTwo.genes[i];
return i < pointOne || i >= pointTwo ? geneOne : geneTwo;
});
return childGenes;
}
function uniform(chromosomeOne, chromosomeTwo) {
var probabilities = Array(chromosomeOne.length).fill(null).map(function () {
return Math.random();
});
return _uniform(chromosomeOne, chromosomeTwo, probabilities);
}
function _uniform(chromosomeOne, chromosomeTwo, probabilities) {
var childGenes = chromosomeOne.genes.map(function (geneOne, i) {
var geneTwo = chromosomeTwo.genes[i];
var probability = probabilities[i];
return probability < 0.5 ? geneOne : geneTwo;
});
return childGenes;
}