UNPKG

@adrianperea/genie.js

Version:

A highly flexible, data-agnostic, and UI-independent Genetic Algorithm Library

69 lines (58 loc) 2.23 kB
"use strict"; 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; }