Exemplo n.º 1
0
        public void Mate(Chromosome <T> father, Chromosome <T> offspring1, Chromosome <T> offspring2)
        {
            var geneLength = Genes.Length;
            var rand       = new Random();

            var cutpoint1 = (int)(rand.NextDouble() * (geneLength - GeneticAlgorithm.CutLength));
            var cutpoint2 = cutpoint1 + GeneticAlgorithm.CutLength;

            var taken1 = new List <T>();
            var taken2 = new List <T>();

            for (int i = 0; i < geneLength; i++)
            {
                if ((i < cutpoint1) || (i > cutpoint2))
                {
                }
                else
                {
                    offspring1.SetGene(i, father.GetGene(i));
                    offspring2.SetGene(i, GetGene(i));
                    taken1.Add(offspring1.GetGene(i));
                    taken2.Add(offspring2.GetGene(i));
                }
            }

            for (var i = 0; i < geneLength; i++)
            {
                if ((i < cutpoint1) || (i > cutpoint2))
                {
                    if (GeneticAlgorithm.PreventRepeat)
                    {
                        offspring1.SetGene(i, GetNotTaken(this, taken1));
                        offspring2.SetGene(i, GetNotTaken(father, taken2));
                    }
                    else
                    {
                        offspring1.SetGene(i, GetGene(i));
                        offspring2.SetGene(i, father.GetGene(i));
                    }
                }
            }

            if (rand.NextDouble() < GeneticAlgorithm.MutationPercent)
            {
                offspring1.Mutate();
            }

            if (rand.NextDouble() < GeneticAlgorithm.MutationPercent)
            {
                offspring2.Mutate();
            }

            offspring1.CalculateCost();
            offspring2.CalculateCost();
        }
Exemplo n.º 2
0
        private T GetNotTaken(Chromosome <T> source, IList <T> taken)
        {
            var geneLength = source.Size;

            for (var i = 0; i < geneLength; i++)
            {
                var trial = source.GetGene(i);
                if (!taken.Contains(trial))
                {
                    taken.Add(trial);
                    return(trial);
                }
            }
            return(default(T));
        }