public Phenotype(Neat neat, NeatChromosome chromosome, InnovationCacher currentGeneration) { _layerMap = new Dictionary <int, IList <NeatNeuron> >(); _neat = neat; Chromosome = chromosome; MutateAndBuild(currentGeneration); }
public double GetGeneticalDistanceFrom(NeatChromosome other) { var totalWeightDifference = 0.0; var overlapingGenes = 0; var smallerSize = System.Math.Min(GeneCount, other.GeneCount); for (var i = 0; i < smallerSize && GetGeneAt(i) .History == other.GetGeneAt(i) .History; ++i) { totalWeightDifference += System.Math.Abs(GetGeneAt(i) .Weight - other.GetGeneAt(i) .Weight); overlapingGenes++; } var disjointGenes = GeneCount + other.GeneCount - 2 * overlapingGenes; var disjointGenesInfluence = (double)disjointGenes; var averageWeightDifference = totalWeightDifference / overlapingGenes; disjointGenesInfluence *= _neat.Speciation.ImportanceOfDisjointGenes; averageWeightDifference *= _neat.Speciation.ImportanceOfAverageWeightDifference; return(disjointGenesInfluence + averageWeightDifference); }
public void AssignHistory(NeatChromosome chromosome) { for (var i = 0; i < chromosome.GeneCount; i++) { AssignHistory(chromosome.GetGeneAt(i)); } }
public Phenotype(Neat neat, NeatChromosome chromosome) { _layerMap = new Dictionary <int, IList <NeatNeuron> >(); _neat = neat; Chromosome = chromosome; BuildFromGenes(); }
public void CreateInitialOrganisms(IList <IBody> bodies) { _species.Clear(); for (var i = 0; i < bodies.Count; i++) { var body = bodies[i]; var standardGenes = new NeatChromosome(_neat, body.InputCount, body.OutputCount); _innovationCacher.AssignHistory(standardGenes); var phenotype = new Phenotype(_neat, standardGenes); var organism = new Organism(_neat, body, phenotype); FillOrganismIntoSpecies(organism); } }
public bool IsCompatible(NeatChromosome chromosome) { var distance = _representative.Chromosome.GetGeneticalDistanceFrom(chromosome); return(!IsAboveCompatibilityThreshold(distance)); }