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;
        }