UNPKG

genetic-algorithm

Version:

Gentic Algorithm TypeScript implementation, customisable

120 lines (99 loc) 3.14 kB
/// <reference path="../../src/typings/node/node.d.ts"/> /// <reference path="../../src/typings/genetic-algorithm/interfaces.d.ts"/> var GeneticAlgorithm = require('../../src/GeneticAlgorithm'); var NUMBER_OF_NUMBERS = 100; var randNum = function () { return Math.random() * 100; }; var Creature = (function () { function Creature() { this.score = 0; this.numbers = new Array(NUMBER_OF_NUMBERS); for (var i = 0; i < NUMBER_OF_NUMBERS; i += 1) { this.numbers[i]; } } Creature.prototype.clone = function () { var point = new Creature(); point.numbers = this.numbers.slice(0); return point; }; Creature.prototype.randomize = function () { for (var i = 0; i < NUMBER_OF_NUMBERS; i += 1) { this.numbers[i] = randNum(); } }; return Creature; })(); var CreatureBuilder = (function () { function CreatureBuilder() { } CreatureBuilder.prototype.execute = function () { return new Creature(); }; return CreatureBuilder; })(); var MutationOperator = (function () { function MutationOperator() { } MutationOperator.prototype.execute = function (creature) { var rand = Math.random(); var gene = Math.floor(Math.random() * NUMBER_OF_NUMBERS); creature.numbers[gene] = randNum(); return creature; }; return MutationOperator; })(); var CrossoverOperator = (function () { function CrossoverOperator() { } CrossoverOperator.prototype.execute = function (a, b) { var pair = { creature1: a.clone(), creature2: b.clone() }; var rand = Math.random(); var crossPoint = Math.floor(Math.random() * NUMBER_OF_NUMBERS); for (var i = 0; i < NUMBER_OF_NUMBERS; i += 1) { if (i < crossPoint) { pair.creature1.numbers[i] = b.numbers[i]; } else { pair.creature2.numbers[i] = a.numbers[i]; } } return pair; }; return CrossoverOperator; })(); var perfectSolution = new Creature(); for (var i = 0; i < NUMBER_OF_NUMBERS; i += 1) { perfectSolution.numbers[i] = 50; } var FitnessFunction = (function () { function FitnessFunction() { } FitnessFunction.prototype.execute = function (creature) { var sumOfPowers = 0; for (var i = 0; i < NUMBER_OF_NUMBERS; i += 1) { sumOfPowers += Math.pow(perfectSolution.numbers[i] - creature.numbers[i], 2); } return 1 / Math.sqrt(sumOfPowers); }; return FitnessFunction; })(); var ga = new GeneticAlgorithm({ mutationOperator: new MutationOperator(), crossoverOperator: new CrossoverOperator(), fitnessFunction: new FitnessFunction(), creatureBuilder: new CreatureBuilder(), crossoverProbability: 0.6, mutationProbability: 0.3, populationSize: 200, iterations: 300, ntour: 2 }); var time = process.hrtime(); var solution = ga.run(); console.log('TIME', process.hrtime(time)[1] * 1e-6); console.log(solution); //# sourceMappingURL=index.js.map