UNPKG

enome

Version:

A genome generation and evolution library.

107 lines 9.89 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var rxjs_1 = require("rxjs"); var index_1 = require("../index"); var Chance = require("chance"); var _ = require("lodash"); var chance = new Chance(); var Population = (function () { function Population(genOptions, popOptions, orgOptions) { this.genOptions = genOptions; this.popOptions = popOptions; this.orgOptions = orgOptions; this.evaluations = new rxjs_1.Subject(); this.generation = 0; this.subs = new rxjs_1.Subscription(); var genDefaults = { geneLength: 2, refill: index_1.GenomeRefill.extend, }; this.genOptions = Object.assign(genDefaults, this.genOptions); var popDefaults = { logInterval: 10, logProgress: false, mutate: { chance: 0.05, op: index_1.MutateOp.sub, }, topPercent: 0.25, updateWeights: { randomize: 25, reproduce: 75, }, }; this.popOptions = Object.assign(popDefaults, this.popOptions); } Population.prototype.mutate = function (genome) { return index_1.mutate(genome, this.popOptions.mutate.chance, this.popOptions.mutate.op); }; Population.prototype.createOrganisms = function (n) { var _this = this; return _.range(n).map(function (i) { return _this.createOrganism(new index_1.Genome(_this.genOptions), _this.orgOptions); }); }; Population.prototype.populate = function (organisms, top, avgFitness, progress) { var _this = this; var orgs = this.createOrganisms(this.popOptions.size); for (var _i = 0, orgs_1 = orgs; _i < orgs_1.length; _i++) { var o = orgs_1[_i]; organisms.next(o); } return this.updateGenotype(this.evaluations, top, avgFitness) .map(function (genome) { return _this.createOrganism(genome, _this.orgOptions); }) .take(this.popOptions.generations) .do(function (g) { _this.generation++; progress.value = _this.generation * 100 / _this.popOptions.generations; }) .observeOn(rxjs_1.Scheduler.asap) .subscribeOn(rxjs_1.Scheduler.asap) .subscribe(function (o) { return organisms.next(o); }, function (error) { return console.log("population.populate(): " + error.stack); }, function () { return console.log("Evolution completed after " + _this.generation++ + " generations."); }); }; Population.prototype.updateGenotype = function (evaluations, top, avgFitness) { var _this = this; return evaluations.map(function (e) { var weights = _this.popOptions.updateWeights || { randomize: 25, reproduce: 75, }; var update = chance.weighted([_this.randomizeGenotype.bind(_this), _this.reproduceGenotype.bind(_this)], [weights.randomize, weights.reproduce]); switch (_this.popOptions.objective) { case index_1.FitnessObjective.maximize: if (e.fitness > avgFitness.value) { return e.genotype; } else { return update(e, top, avgFitness); } case index_1.FitnessObjective.minimize: if (e.fitness < avgFitness.value) { return e.genotype; } else { return update(e, top, avgFitness); } } }); }; Population.prototype.reproduceGenotype = function (evaluation, top, avgFitness) { if (top.value.length > 0 && top.value != null && top.value !== undefined) { var offspring = index_1.reproduceManyToOne(top.value.map(function (t) { return t.genotype; })); var mutantOffspring = this.mutate(offspring); return mutantOffspring; } else { return this.mutate(evaluation.genotype); } }; Population.prototype.randomizeGenotype = function (evaluation, top, avgFitness) { return new index_1.Genome(this.genOptions); }; return Population; }()); exports.Population = Population; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wdWxhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3B1bGF0aW9ucy9wb3B1bGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkJBQThFO0FBRTlFLGtDQWtCa0I7QUFFbEIsK0JBQWlDO0FBQ2pDLDBCQUE0QjtBQUM1QixJQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO0FBRTVCO0lBaUJFLG9CQUNTLFVBQWUsRUFDZixVQUFlLEVBQ2YsVUFBZTtRQUZmLGVBQVUsR0FBVixVQUFVLENBQUs7UUFDZixlQUFVLEdBQVYsVUFBVSxDQUFLO1FBQ2YsZUFBVSxHQUFWLFVBQVUsQ0FBSztRQVhqQixnQkFBVyxHQUEyQyxJQUFJLGNBQU8sRUFFckUsQ0FBQztRQUVHLGVBQVUsR0FBVyxDQUFDLENBQUM7UUFFdEIsU0FBSSxHQUFpQixJQUFJLG1CQUFZLEVBQUUsQ0FBQztRQVE5QyxJQUFNLFdBQVcsR0FBRztZQUNsQixVQUFVLEVBQUUsQ0FBQztZQUNiLE1BQU0sRUFBRSxvQkFBWSxDQUFDLE1BQU07U0FDNUIsQ0FBQztRQUdGLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRzlELElBQU0sV0FBVyxHQUFHO1lBQ2xCLFdBQVcsRUFBRSxFQUFFO1lBQ2YsV0FBVyxFQUFFLEtBQUs7WUFDbEIsTUFBTSxFQUFFO2dCQUNOLE1BQU0sRUFBRSxJQUFJO2dCQUNaLEVBQUUsRUFBRSxnQkFBUSxDQUFDLEdBQUc7YUFDakI7WUFDRCxVQUFVLEVBQUUsSUFBSTtZQUNoQixhQUFhLEVBQUU7Z0JBQ2IsU0FBUyxFQUFFLEVBQUU7Z0JBQ2IsU0FBUyxFQUFFLEVBQUU7YUFDZDtTQUNGLENBQUM7UUFHRixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxV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