UNPKG

intelligence

Version:

Machine learning library written in javascript

200 lines (173 loc) 9.68 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>JSDoc: Source: genetic/crossoverStrategies.js</title> <script src="scripts/prettify/prettify.js"> </script> <script src="scripts/prettify/lang-css.js"> </script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> </head> <body> <div id="main"> <h1 class="page-title">Source: genetic/crossoverStrategies.js</h1> <section> <article> <pre class="prettyprint source linenums"><code>var utils = require('./../infrastructure/utils'); /** * Throws an exception if any individuals have less than two genes * @param {Individual[]} individuals - An array of individuals to validate * @throws An exception is thrown if any individuals have less than two genes */ var validateMinimumLength = function (individuals) { if (individuals[0].body.length &lt; 2 || individuals[0].body.length &lt; 2) { throw "individuals must have at least two genes for crossover"; } }; /** * Throws an exception if any individuals are not fixed length * @param {Individual[]} individuals - An array of individuals to validate * @throws An exception is thrown if any individuals are not fixed length */ var validateFixedLength = function (individuals) { if (!(individuals[0].isFixedLength() &amp;&amp; individuals[1].isFixedLength())) { throw "individuals must be of a fixed length for crossover"; } }; /** * Throws an exception if any individuals are fixed length * @param {Individual[]} individuals - An array of individuals to validate * @throws An exception is thrown if any individuals are fixed length */ var validateVariableLength = function (individuals) { if (individuals[0].isFixedLength() || individuals[1].isFixedLength()) { throw "individuals must be of variable length for crossover"; } }; /** * Swaps genes between two individuals at the specified index * @param {Individual} indvidualA - The first individual * @param {Individual} indvidualB - The second individual * @param {number} index - Body array index to swap genes at */ var swapGenes = function (indvidualA, indvidualB, index) { var temp = indvidualA.body[index]; indvidualA.body[index] = indvidualB.body[index]; indvidualB.body[index] = temp; }; /** * Performs one point fixed crossover * @param {Individual[]} individuals - An array containing two individuals * @returns {Individual[]} An array containing two offspring */ exports.onePointFixed = function (individuals) { validateMinimumLength(individuals); validateFixedLength(individuals); var offspringA = individuals[0].copy(); var offspringB = individuals[1].copy(); var cut = utils.randBetween(0, offspringA.body.length - 1); for (var i = cut; i &lt; offspringA.body.length; i++) { swapGenes(offspringA, offspringB, i); } return [offspringA, offspringB]; }; /** * Performs two point fixed crossover * @param {Individual[]} individuals - An array containing two individuals * @returns {Individual[]} An array containing two offspring */ exports.twoPointFixed = function (individuals) { validateMinimumLength(individuals); validateFixedLength(individuals); var offspringA = individuals[0].copy(); var offspringB = individuals[1].copy(); var cutA = utils.randBetween(0, offspringA.body.length - 2); var cutB = utils.randBetween(cutA + 1, offspringA.body.length - 1); for (var i = cutA; i &lt; cutB; i++) { swapGenes(offspringA, offspringB, i); } return [offspringA, offspringB]; }; /** * Performs uniform crossover * @param {Individual[]} individuals - An array containing two individuals * @returns {Individual[]} An array containing two offspring */ exports.uniform = function (individuals) { validateMinimumLength(individuals); validateFixedLength(individuals); var offspringA = individuals[0].copy(); var offspringB = individuals[1].copy(); for (var i = 0; i &lt; offspringA.body.length; i++) { if (utils.random() &lt; 0.5) { swapGenes(offspringA, offspringB, i); } } return [offspringA, offspringB]; }; /** * Performs one point variable crossover * @param {Individual[]} individuals - An array containing two individuals * @returns {Individual[]} An array containing two offspring */ exports.onePointVariable = function (individuals) { validateMinimumLength(individuals); validateVariableLength(individuals); var offspringA = individuals[0].copy(); var offspringB = individuals[1].copy(); var cutA = utils.randBetween(0, offspringA.body.length); var cutB = utils.randBetween(0, offspringB.body.length); offspringA.body = individuals[0].body.slice(0, cutA).concat(individuals[1].body.slice(cutB, individuals[1].body.length)); offspringB.body = individuals[1].body.slice(0, cutB).concat(individuals[0].body.slice(cutA, individuals[0].body.length)); return [offspringA, offspringB]; }; /** * Performs two point variable crossover * @param {Individual[]} individuals - An array containing two individuals * @returns {Individual[]} An array containing two offspring */ exports.twoPointVariable = function (individuals) { validateMinimumLength(individuals); validateVariableLength(individuals); var offspringA = individuals[0].copy(); var offspringB = individuals[1].copy(); var cutA, cutB, cutC, cutD; while (true) { cutA = utils.randBetween(0, offspringA.body.length - 2); cutB = utils.randBetween(cutA + 1, offspringA.body.length - 1); cutC = utils.randBetween(0, offspringB.body.length - 2); cutD = utils.randBetween(cutC + 1, offspringB.body.length - 1); var newSizeA = offspringA.body.length - (cutB - cutA) + (cutD - cutC); var newSizeB = offspringB.body.length - (cutD - cutC) + (cutB - cutA); if (newSizeA &lt;= offspringA.options.maxLength &amp;&amp; newSizeA >= offspringA.options.minLength &amp;&amp; newSizeB &lt;= offspringB.options.maxLength &amp;&amp; newSizeB >= offspringB.options.minLength) { break; } } offspringA.body = individuals[0].body.slice(0, cutA); offspringB.body = individuals[1].body.slice(0, cutC); offspringA.body = offspringA.body.concat(individuals[1].body.slice(cutC, cutD)); offspringB.body = offspringB.body.concat(individuals[0].body.slice(cutA, cutB)); offspringA.body = offspringA.body.concat(individuals[0].body.slice(cutB, individuals[0].body.length)); offspringB.body = offspringB.body.concat(individuals[1].body.slice(cutD, individuals[1].body.length)); return [offspringA, offspringB]; };</code></pre> </article> </section> </div> <nav> <h2><a href="index.html">Index</a></h2><h3>Classes</h3><ul><li><a href="Individual.html">Individual</a></li><li><a href="LinearConditionalNode.html">LinearConditionalNode</a></li><li><a href="LinearFunctionNode.html">LinearFunctionNode</a></li><li><a href="LinearGPNode.html">LinearGPNode</a></li><li><a href="LinearIndividual.html">LinearIndividual</a></li><li><a href="Population.html">Population</a></li><li><a href="RegisterReference.html">RegisterReference</a></li><li><a href="RegisterSet.html">RegisterSet</a></li></ul><h3>Global</h3><ul><li><a href="global.html#alphabet">alphabet</a></li><li><a href="global.html#arrayEqual">arrayEqual</a></li><li><a href="global.html#binaryNumber">binaryNumber</a></li><li><a href="global.html#binaryString">binaryString</a></li><li><a href="global.html#createCalculation">createCalculation</a></li><li><a href="global.html#createConstant">createConstant</a></li><li><a href="global.html#createInput">createInput</a></li><li><a href="global.html#createOutput">createOutput</a></li><li><a href="global.html#formatString">formatString</a></li><li><a href="global.html#fpEqual">fpEqual</a></li><li><a href="global.html#inherits">inherits</a></li><li><a href="global.html#linearNode">linearNode</a></li><li><a href="global.html#onePointFixed">onePointFixed</a></li><li><a href="global.html#onePointVariable">onePointVariable</a></li><li><a href="global.html#randBetween">randBetween</a></li><li><a href="global.html#random">random</a></li><li><a href="global.html#randomNumber">randomNumber</a></li><li><a href="global.html#rank">rank</a></li><li><a href="global.html#rouletteWheel">rouletteWheel</a></li><li><a href="global.html#selectRandom">selectRandom</a></li><li><a href="global.html#swapGenes">swapGenes</a></li><li><a href="global.html#tournament">tournament</a></li><li><a href="global.html#twoPointFixed">twoPointFixed</a></li><li><a href="global.html#twoPointVariable">twoPointVariable</a></li><li><a href="global.html#uniform">uniform</a></li><li><a href="global.html#validateFixedLength">validateFixedLength</a></li><li><a href="global.html#validateMinimumLength">validateMinimumLength</a></li><li><a href="global.html#validateVariableLength">validateVariableLength</a></li></ul> </nav> <br clear="both"> <footer> Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.3.0-alpha9</a> on Sat Aug 16 2014 23:33:39 GMT+0100 (GMT Summer Time) </footer> <script> prettyPrint(); </script> <script src="scripts/linenumber.js"> </script> </body> </html>