galgo
Version:
Library to calculate solutions using Genetic Algorithm.
2 lines (1 loc) • 2.52 kB
JavaScript
;function getRandomPosition(o){return Math.floor(Math.random()*o)}function selectBest(o){var e=2*Math.ceil(o.length/4);galgo.options.minimize?o.sort(function(o,e){return o.fitness-e.fitness}):galgo.options.maximize&&o.sort(function(o,e){return e.fitness-o.fitness});var n=o.slice(0,e);return n}function seedPopulation(o){for(var e=[],n=0;n<o;n++)e.push(new Individual);return e}function fitnessFunction(o,e){var n=o*o+4*e*e+4*e+o;return n}function createOffspring(o,e){var n=[];return n.push(new Individual(o,e)),n.push(new Individual(o,e)),n.push(new Individual(o,e)),n.push(new Individual(o,e)),n}function run(){for(var o=process.hrtime(),e=seedPopulation(galgo.options.populationSize),n={solution:{},history:[],profiler:{}},t=0;t<galgo.options.generationsQty;t++){var i=selectBest(e);n.history.push({generation:t+1,individualsQty:e.length,x:i[0].chromosomes.x.decode().toFixed(4),y:i[0].chromosomes.y.decode().toFixed(4),z:i[0].fitness});for(var r=[],s=0;s<i.length-1;s+=2){var a=createOffspring(i[s],i[s+1]);r=r.concat(a)}e=r}return n.solution={x:i[0].chromosomes.x.decode().toFixed(4),y:i[0].chromosomes.y.decode().toFixed(4),z:i[0].fitness},n.profiler={elapsedTime:parseFloat(process.hrtime(o).join("."))},n}var Chromosome=function(o){function e(){var o=parseInt(u.value.toString().replace(/,/g,""),2);return a+(s-a)*(o/(Math.pow(2,i)-1))}function n(){if(!(Math.random()>r)){var e=getRandomPosition(i);o[e]=~~!o[e]}}function t(o){for(var e=[],n=0;n<o;n++)e.push(Math.round(Math.random()));return e}var i=galgo.options.chromosomeLength,r=galgo.mutationProbability,s=galgo.options.interval.max,a=galgo.options.interval.min,u={decode:e,mutate:n,value:o};return void 0===u.value&&(u.value=t(i)),u},Individual=function(o,e){function n(o,e){var n=getRandomPosition(i),t=o.chromosomes.x.value.slice(0,n).concat(e.chromosomes.x.value.slice(n)),r=o.chromosomes.y.value.slice(0,n).concat(e.chromosomes.y.value.slice(n));return{x:new Chromosome(t),y:new Chromosome(r)}}function t(o){return o.x.mutate(),o.y.mutate(),o}var i=galgo.options.chromosomeLength,r={};if(o||e)o=o||e,e=e||o,r.chromosomes=n(o,e),r.chromosomes=t(r.chromosomes);else{var s=new Chromosome;r.chromosomes={x:s,y:s}}return r.fitness=galgo.fitnessFunction(r.chromosomes.x.decode(),r.chromosomes.y.decode()),r},galgo=function(){var o={fitnessFunction:fitnessFunction,options:{chromosomeLength:10,generationsQty:25,mutationProbability:.02,populationSize:250,maximize:!1,minimize:!0,interval:{min:-2,max:2}},run:run};return o}();module.exports=galgo;