Skip to content

Commit

Permalink
Modified genetic algorithm to allow survival-rate
Browse files Browse the repository at this point in the history
  • Loading branch information
JulianDuniec committed Sep 26, 2012
1 parent 5f942e8 commit 83ee104
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 12 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"author": "Julian Duniec <julian.duniec@gmail.com>",
"name": "neural-node",
"description": "Neural network for NodeJs",
"version": "0.0.1",
"version": "0.0.2",
"repository": {
"type": "git",
"url": "git://github.com/JulianDuniec/neural-node.git"
Expand Down
18 changes: 11 additions & 7 deletions src/GeneticAlgorithm.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
*/
module.exports = function(options){
var me = {};
me.survivalRate = options.survivalRate || 0.2;
if(!options.sort) {
//Default sort-function, sort by fitness descending
options.sort = function(a, b) {
Expand Down Expand Up @@ -58,18 +59,21 @@ module.exports = function(options){
networks.sort(options.sort);

var len = networks.length;

var killIndex = Math.floor(me.survivalRate * len);

//Kill the low-performers
networks.splice(2);
networks.splice(killIndex);

//get the parents (first and second )
var optionsA = networks[0].export();
var optionsB = networks[1].export();
var weightsA = optionsA.weights;
var weightsB = optionsB.weights;
var combined = me.merge(weightsA, weightsB);

//Add children based on the high-achievers
for(var i = 0; i < len-2; i++) {
for(var i = 0; i < len-killIndex; i++) {
var optionsA = networks[Math.floor(Math.random()*killIndex)].export();
var optionsB = networks[Math.floor(Math.random()*killIndex)].export();
var weightsA = optionsA.weights;
var weightsB = optionsB.weights;
var combined = me.merge(weightsA, weightsB);
//the same base will be used for every new network, with a unique mutation
var mutated = me.mutate(combined);
var opts = optionsA;
Expand Down
12 changes: 8 additions & 4 deletions tests/GeneticAlgorithm.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,16 +45,20 @@ exports.GeneticAlgorithm = {
}

var geneticAlgorithm = new nn.GeneticAlgorithm({
survivalRate : 0.5

});

networks = geneticAlgorithm.epoch(networks);

test.equal(networks.length, populationSize);
test.ok(networks[0].fitness == 9 );
test.ok(networks[1].fitness == 8);
for(var i = 2; i < networks.length; i++) {
test.ok(networks[i].fitness == null );
test.ok(networks[0].fitness == 9, "Fitness incorrect");
test.ok(networks[1].fitness == 8, "Fitness incorrect");
test.ok(networks[2].fitness == 7, "Fitness incorrect");
test.ok(networks[3].fitness == 6, "Fitness incorrect");
test.ok(networks[4].fitness == 5, "Fitness incorrect");
for(var i = 5; i < networks.length; i++) {
test.ok(networks[i].fitness == null, "Fitness was not null");
}

test.done();
Expand Down

0 comments on commit 83ee104

Please sign in to comment.