JSFiddle - React, Tailwind, and code Playground
JavaScript
var pop_size = 256; // 2048;
var max_iterations = 512; // 16384;
var elite_rate = 0.10;
var mutation_rate = 0.25;
var mutation = function() {
return mutation_rate;
}
var target = 'Hello world!';
var struct = function( str, fitness ) {
return {
str: str,
fitness: fitness
};
}
var init_population = function ( population, buffer ) {
var size = target.length;
for ( var i = 0; i < pop_size; i++ ) {
var citizen = struct('', 0);
var str = [];
for ( j = 0; j < size; j++ ) {
str[j] = String.fromCharCode(Math.floor(Math.random() * 256));
}
citizen.str = str.join('');
population.push(citizen);
buffer.push(citizen);
}
}
var calc_fitness = function ( population ) {
var size = target.length;
for( var i = 0; i < pop_size; i++ ) {
var fitness = 0;
var str = population[i].str;
for ( j = 0; j < size; j++ ) {
fitness += Math.abs( str.charCodeAt(j) - target.charCodeAt(j) );
}
population[i].fitness = fitness;
}
}
var fitness_sort = function ( x, y ) {
return x.fitness - y.fitness;
}
var sort_by_fitness = function ( population ) {
population.sort(fitness_sort);
}
var elitism = function ( population, buffer, esize )
{
for ( var i = 0; i < esize; i++ ) {
buffer[i].str = population[i].str;
buffer[i].fitness = population[i].fitness;
}
}
var mutate = function ( member ) {
var size = target.length;
var ipos = Math.floor(Math.random() * size);
var delta = Math.floor(Math.random() * 256);
var str = member.str.split('');
str[ipos] = String.fromCharCode((member.str.charCodeAt(ipos) + delta) % 255 );
member.str = str.join('');
}
var mate = function ( population, buffer ) {
var esize = pop_size * elite_rate;
var tsize = target.length;
elitism ( population, buffer, esize );
for ( var i = Math.floor(esize); i < pop_size; i++ )
{
...