Genetic algorithm, Hello World

Javascript ES6

2018


Step 1 Create a population. Here 30 particles whith a constant accélération


Step 2 Give some “DNA”. In this example DNA is an array of 200 random directions (normalized random 2D vector) that will be read sequentially each frame


Step 3 Evaluate/crossover/mutate the population.
My fitness function evaluate the distance of the ‘robot’ from the target, if he ‘crash’ too far, his dna should be eliminated (fitness = 0) but i always keep 10% of the previous generation wathever the fitness, in order to keep some diversity.

this.calcFitness = function()
{
    var dx = obstacles[0].x - this.pos.x; // obstacles[0] is the target
    var dy = obstacles[0].y - this.pos.y;
    var d = Math.sqrt(dx*dx + dy*dy);

    this.fitness = Math.min(1,TARGET_SIZE / d);

    if(this.isBroken) // has crashed (screen border or obstacle)
    {
        if(d > WIDTH2) // too far !
        {
            this.fitness = 0;
        }
    }          
}
this.crossover = function(other)
{
    var result = [];
    var limit = Math.floor(Math.random() * this.genes.length);
    for(var i = 0 ; i < this.genes.length ; i++) 
    {
        if(i <limit)
        {
            result[i] = this.genes[i];
        }else{
            result[i] = other.genes[i];
        }
    }

    return new DNA(result);
}
this.mutation = function()
{
    const POW = 1;
    for(var i = 0 ; i < this.genes.length ; i++) 
    {
        if(Math.random() < GENE_MUTATION_CHANCE)
        {
            this.genes[i] = new Vector2D(POW * getRandomFloat(-1,1), POW * getRandomFloat(-1,1));
        }
    }                    
}

Step 4 Add some graphics and obstacles and have fun :)


Step 5 [TODO] Add some interactivity (sliders), include time in the calcFitness function


Vote in HexoSearch