intelligence
Version:
Machine learning library written in javascript
200 lines (173 loc) • 9.68 kB
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 < 2 || individuals[0].body.length < 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() && 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 < 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 < 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 < offspringA.body.length; i++) {
if (utils.random() < 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 <= offspringA.options.maxLength &&
newSizeA >= offspringA.options.minLength &&
newSizeB <= offspringB.options.maxLength &&
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>