public override List<IGEPOrganism> Execute(IGEPEnvironment environment) { var dna = new GEPDNA(); var allele = new GEPAllele(dna); var main = new GEPGene(environment: environment); main.Add(allele); var chromosome = new GEPChromosome(environment: environment, main: main); var organism = new GEPOrganism(environment: environment) { chromosome }; organism.Parent = environment; for (var i = 0; i < environment.GeneticCode.DNALength; i++) allele.DNA.AddRandomNucleotide(); /* var testAllele = new GEPAllele(new GEPDNA()); var testGene = new GEPGene(environment: environment); testGene.Add(testAllele); main.Add(testGene); for (var i = 0; i < environment.GeneticCode.DNALength; i++) testAllele.DNA.AddRandomNucleotide(); var test2Allele = new GEPAllele(new GEPDNA()); var test2Gene = new GEPGene(environment: environment); test2Gene.Add(test2Allele); main.Add(test2Gene); for (var i = 0; i < environment.GeneticCode.DNALength; i++) test2Allele.DNA.AddRandomNucleotide(); var test3Allele = new GEPAllele(new GEPDNA()); var test3Gene = new GEPGene(environment: environment); test3Gene.Add(test3Allele); test2Gene.Add(test3Gene); for (var i = 0; i < environment.GeneticCode.DNALength; i++) test3Allele.DNA.AddRandomNucleotide(); var test4Allele = new GEPAllele(new GEPDNA()); var test4Gene = new GEPGene(environment: environment); test4Gene.Add(test4Allele); main.Add(test4Gene); for (var i = 0; i < environment.GeneticCode.DNALength; i++) test4Allele.DNA.AddRandomNucleotide(); var test5Allele = new GEPAllele(new GEPDNA()); var test5Gene = new GEPGene(environment: environment); test5Gene.Add(test5Allele); test3Gene.Add(test5Gene); for (var i = 0; i < environment.GeneticCode.DNALength; i++) test5Allele.DNA.AddRandomNucleotide(); */ return new List<IGEPOrganism>() { organism }; }
public override IChromosome ShallowCopy() { var mainCopy = (IGEPGene) this.Main.ShallowCopy(); var copy = new GEPChromosome(this.ParentEnvironment, mainCopy); mainCopy.Parent = copy; mainCopy.ReassignChildrenChromosomeParent(); return copy; }
public override IOrganism ToOrganism(IEnvironment environment) { var gepEnvironment = (IGEPEnvironment) environment; var organism = new GEPOrganism(environment: gepEnvironment) { Parent = gepEnvironment }; // Get all of the "main" genes. var lastChromosomeIndex = -1; foreach(var unit in this) { if(unit.ChromosomeIndex != lastChromosomeIndex) { var mainGene = this.CreateGeneFromGenomeUnit(gepEnvironment: gepEnvironment, unit: unit); var chromosome = new GEPChromosome(environment: gepEnvironment, main: mainGene); organism.Add(chromosome); lastChromosomeIndex = unit.ChromosomeIndex; } } var chromosomeIndex = 0; foreach (var chromosome in organism) { var lastProcessedGeneLevel = 1; var mainGene = chromosome.Main; var lastProcessedGene = mainGene; foreach (var unit in this.Where(u => u.ChromosomeIndex == chromosomeIndex && u.GeneLevel >= 1)) { var gene = this.CreateGeneFromGenomeUnit(gepEnvironment: gepEnvironment, unit: unit); // If we're moving to the next level, add the gene to the next level // and go down to see if there are any others on that level if (unit.GeneLevel > lastProcessedGeneLevel) { lastProcessedGene = (IGEPGene)lastProcessedGene.GetChildGenes().Last(); lastProcessedGene.Add(gene); } // if we're up a level, go up to that level and add the gene else if (unit.GeneLevel < lastProcessedGeneLevel) { while(unit.GeneLevel < lastProcessedGeneLevel) { lastProcessedGene = lastProcessedGene.ParentGene; lastProcessedGeneLevel--; } lastProcessedGene.Add(gene); } // if we're at the same level, just add the gene. else { lastProcessedGene.Add(gene); } lastProcessedGeneLevel = unit.GeneLevel; } chromosomeIndex++; } return organism; }