<?php
/*
this example show how we can tweak crossover to choose only the best chromosome
*/
require __DIR__ . '/../vendor/autoload.php'; // composer autoload
class CustomGeneticAlgorithm extends \SimpleGeneticAlgorithm\SimpleGeneticAlgorithm{
public function crossover(){
$new_population = array();
for($i = 0; $i < $this->options['population']; $i++){
// get random parents
$a = $this->population[array_rand($this->population, 1)]['chromosome'];
$b = $this->population[array_rand($this->population, 1)]['chromosome'];
$goal = $this->options['goal'];
$a = str_split($a);
$b = str_split($b);
$goal = str_split($goal);
// get the best chromosome otherwise random from parents
$child = '';
for($j = 0; $j < count($a); $j++){
if($a[$j] == $goal[$j])
$child .= $a[$j];
elseif($b[$j] == $goal[$j])
$child .= $b[$j];
else
$child .= rand(0, 1) == 0 ? $a[$j] : $b[$j];
}
$new_population[] = array(
'chromosome' => $child,
'fitness' => 0,
);
}
$this->population = $new_population;
}
}
$ga = new CustomGeneticAlgorithm(array(
'mutation' => 25, // 25%
'goal' => 'lorem ipsum',
'delay' => 50, // ms, if debug is false, then delay forced to 0
'debug' => true,
));
$ga->run();
|