Corrections + Genome::mutation(threshold)

This commit is contained in:
xdrm-brackets 2016-10-26 17:53:56 +02:00
parent 3c57a83e41
commit 7cacdb3b63
2 changed files with 44 additions and 4 deletions

View File

@ -145,6 +145,47 @@
return true;
}
/* APPLIES A MUTATION ON THE Genome WITH A SPECIFIC @threshold
*
* @threshold<double> Mutation threshold
*
*/
public function mutation($threshold=0.5){
/* (1) Checks @threshold argument */
if( floatval($threshold) !== $threshold || $threshold < 0 || $threshold > 1 )
throw new \Error('Invalid threshold for Genome mutation.');
/* (2) Calculates how many neurons/synapses to mutate */
$neuronsMutations = round( (count($this->neurons) - 1) * $threshold );
$synapsesMutations = round( (count($this->synapses) - 1) * $threshold );
/* (3) Choose random neurons' indexes */
$iNeurons = [];
while( count($iNeurons) < $neuronsMutations ){
$r = rand(0, count($this->neurons)-1);
if( !in_array($r, $iNeurons) )
$iNeurons[] = $r;
}
/* (4) Choose random synapses' indexes */
$iSynapses = [];
while( count($iSynapses) < $synapsesMutations ){
$r = rand(0, count($this->synapses)-1);
if( !in_array($r, $iSynapses) )
$iSynapses[] = $r;
}
/* (5) Update chosen neurons */
for( $i = 0, $l = count($iNeurons) ; $i < $l ; $i++ )
$this->neurons[$iNeurons[$i]] = rand(self::MIN, self::MAX) / self::MAX;
/* (6) Update chosen synapses */
for( $i = 0, $l = count($iSynapses) ; $i < $l ; $i++ )
$this->synapses[$iSynapses[$i]] = rand(self::MIN, self::MAX) / self::MAX;
}
}

View File

@ -58,11 +58,10 @@
echo implode(' ; ', $b->synapses)."\n\n";
/* (3) Section Title */
// $b->mutation(0.3); // @b has now mutated with a threshold of 30%
$b = new Genome(2, 3); // 2 layers of 3 neurons each -> randomly filled
echo "B neurons\n";
$b->mutation(0.3); // @b has now mutated with a threshold of 30%
echo "mutated clone neurons\n";
echo implode(' ; ', $b->neurons)."\n";
echo "B synapses\n";
echo "mutated clone synapses\n";
echo implode(' ; ', $b->synapses)."\n\n";
/* (4) Cross-over (father+mother) */