enome
Version:
A genome generation and evolution library.
107 lines • 9.89 kB
JavaScript
"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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