public double RunEpoch( double[][] input, double[][] output )
{
Debug.Assert( input.Length > 0 );
Debug.Assert( output.Length > 0 );
Debug.Assert( input.Length == output.Length );
Debug.Assert( network.InputsCount == input.Length );
// check if it is a first run and create population if so
if ( population == null )
{
// sample chromosome
DoubleArrayChromosome chromosomeExample = new DoubleArrayChromosome(
chromosomeGenerator, mutationMultiplierGenerator, mutationAdditionGenerator,
numberOfNetworksWeights );
// create population ...
population = new Population( populationSize, chromosomeExample,
new EvolutionaryFitness( network, input, output ), selectionMethod );
// ... and configure it
population.CrossoverRate = crossOverRate;
population.MutationRate = mutationRate;
population.RandomSelectionPortion = randomSelectionRate;
}
// run genetic epoch
population.RunEpoch( );
// get best chromosome of the population
DoubleArrayChromosome chromosome = (DoubleArrayChromosome) population.BestChromosome;
double[] chromosomeGenes = chromosome.Value;
// put best chromosome's value into neural network's weights
int v = 0;
for ( int i = 0; i < network.Layers.Length; i++ )
{
Layer layer = network.Layers[i];
for ( int j = 0; j < layer.Neurons.Length; j++ )
{
ActivationNeuron neuron = layer.Neurons[j] as ActivationNeuron;
for ( int k = 0; k < neuron.Weights.Length; k++ )
{
neuron.Weights[k] = chromosomeGenes[v++];
}
neuron.Threshold = chromosomeGenes[v++];
}
}
Debug.Assert( v == numberOfNetworksWeights );
return 1.0 / chromosome.Fitness;
}
}