@zfunction/genetics-js
Version:
Genetic and evolutionary algorithms framework for the web
93 lines • 4.04 kB
JavaScript
"use strict";
/*
* @license
* Copyright (c) 2019 Cristian Abrante. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*/
Object.defineProperty(exports, "__esModule", { value: true });
var Population = /** @class */ (function () {
function Population() {
this.populationStatistics = {
averageAge: 0,
averageFitness: 0,
fitnessSum: 0,
fittestIndividualIndex: -1,
};
this.items = [];
}
Population.prototype.generatePopulationWithOperations = function (populationSize, generator, generatorParams, fitnessFunction) {
this.items = [];
for (var i = 0; i < populationSize; i++) {
var individual = generator.generateWith(generatorParams);
var fitness = fitnessFunction(individual);
this.pushIndividual(individual, fitness);
}
};
Population.prototype.getPopulationSize = function () {
return this.items.length;
};
Population.prototype.replacePopulation = function (populationItems) {
this.items = populationItems;
this.setStatistics();
};
Population.prototype.pushIndividual = function (individual, fitness, age) {
var previousAgeSum = this.populationStatistics.averageAge * this.getPopulationSize();
this.items.push({
age: age ? age : 0,
fitness: fitness ? fitness : Population.DEFAULT_FITNESS,
individual: individual,
});
var lastItem = this.items[this.items.length - 1];
this.populationStatistics.averageAge = (previousAgeSum + lastItem.age) / this.getPopulationSize();
this.populationStatistics.fitnessSum += lastItem.fitness;
this.populationStatistics.averageFitness = this.populationStatistics.fitnessSum / this.getPopulationSize();
var fittest = this.getFittestIndividualItem();
if (fittest === undefined) {
this.populationStatistics.fittestIndividualIndex = this.items.length - 1;
}
else {
if (fittest.fitness < lastItem.fitness) {
this.populationStatistics.fittestIndividualIndex = this.items.length - 1;
}
}
};
Population.prototype.getFittestIndividualItem = function () {
var index = this.populationStatistics.fittestIndividualIndex;
return index === Population.DEFAULT_FITTEST_IND_INDEX ? undefined : this.getPopulationItem(index);
};
Population.prototype.getPopulationItem = function (index) {
return this.items[index];
};
Population.prototype.getPopulationItems = function () {
return this.items;
};
Population.prototype.setStatistics = function () {
var _this = this;
this.populationStatistics = {
averageAge: 0,
averageFitness: 0,
fitnessSum: 0,
fittestIndividualIndex: Population.DEFAULT_FITTEST_IND_INDEX,
};
this.items.forEach(function (item, index) {
_this.populationStatistics.averageAge += item.age;
_this.populationStatistics.fitnessSum += item.fitness;
var fittest = _this.getFittestIndividualItem();
if (fittest === undefined) {
_this.populationStatistics.fittestIndividualIndex = index;
}
else {
if (fittest.fitness < item.fitness) {
_this.populationStatistics.fittestIndividualIndex = index;
}
}
});
this.populationStatistics.averageAge /= this.getPopulationSize();
this.populationStatistics.averageFitness = this.populationStatistics.fitnessSum / this.getPopulationSize();
};
Population.DEFAULT_FITNESS = 0.0;
Population.DEFAULT_FITTEST_IND_INDEX = -1;
return Population;
}());
exports.Population = Population;
//# sourceMappingURL=Population.js.map