Beispiel #1
0
    static public Genome Breeding(Genome father, Genome mother)
    {
        Genome      child      = new Genome();
        List <Gene> childGenes = child.genes;

        //inherit genes from mother and father.
        foreach (Gene fatherGene in father.genes)
        {
            Gene newGene = fatherGene.Clone();
            childGenes.Add(newGene);
        }

        foreach (Gene motherGene in mother.genes)
        {
            Gene childGene = childGenes.Find(gene => gene.DNA == motherGene.DNA);
            if (childGene == null)
            {
                Gene newGene = motherGene.Clone();
                childGenes.Add(newGene);
            }
            else
            {
                childGene.Combine(motherGene);
            }
        }

        //bigger in front.
        childGenes.Sort((Gene a, Gene b) =>
        {
            if (a.Intensity > b.Intensity)
            {
                return(-1);
            }
            if (a.Intensity < b.Intensity)
            {
                return(1);
            }
            return(0);
        });

        //normalize.
        float       percent, frac = 0;
        List <Gene> removedGene = new List <Gene>();

        for (int i = 0; i < childGenes.Count; i++)
        {
            Gene gene = childGenes[i];
            percent = gene.Percent * 0.5f;
            if (!gene.SetPercent(percent, ref frac))
            {
                removedGene.Add(gene);
            }
        }

        removedGene.ForEach(rgene => childGenes.Remove(rgene));

        //gene mutation.
        //it is not a good solution.
        if (frac > 0.5)
        {
            childGenes[0].MutationOne();
        }


        child.FindStrongestGene();
        return(child);
    }